Другое

Портирование U-Boot на ASR1803: ARM32 vs ARM64

Руководство по портированию актуального U-Boot на ASR1803 (PXA1826) с Cortex-A7, настройке ARM32 сборки и решению проблем загрузки.

Как портировать актуальную версию U-Boot на процессор ASR1803 (PXA1826)?

Задача: Портировать актуальный U-Boot на камень ASR1803 (PXA1826) с минимальной целью - попасть в консоль U-Boot.

Характеристики процессора:

  • Ядро: Cortex-7A (второе ядро Cortex-5R не используется при загрузке)
  • Flash: 256M, база 0x8000_0000
  • DDR: 128M, база 0x0000_0000
  • UART: база 0xD401_7000, тактирование 26MHz

Процесс загрузки:

  1. Сначала загружается Boot-ROM
  2. Затем загрузчик первого уровня, который инициализирует FLASH, DDR и UART
  3. Загрузчик первого уровня копирует U-Boot в DDR по адресу 0x0030_8000
  4. U-Boot стартует из DDR

Созданные файлы для портирования:

  • board/asr/asr1803/asr1803.c
  • board/asr/asr1803/Kconfig
  • board/asr/asr1803/Makefile
  • configs/asr1803_defconfig
  • arch/arm/mach-nzas/Kconfig
  • Обновления в arch/arm/Kconfig и arch/arm/Makefile

Проблема: Сборка U-Boot целится в ARM64 (armv8), а требуется поддержка ARM32 (armv7).

Поделитесь опытом портирования U-Boot на подобные процессоры.

Основная проблема, с которой вы столкнулись, заключается в том, что система сборки U-Boot настроена на сборку под ARM64 (aarch64), в то время как процессор ASR1803 (PXA1826) имеет ядро Cortex-A7, которое требует поддержки ARM32 (armv7). Для решения этой проблемы необходимо правильно настроить систему сборки и конфигурацию для архитектуры ARM32.


Содержание


Понимание архитектурных различий

В U-Boot существуют фундаментальные различия между ARM32 и ARM64 сборками. Как указано в документации U-Boot для arm64, U-Boot для arm64 компилируется с использованием AArch64-gcc, в то время как для ARM32 требуется компилятор для архитектуры armv7.

Ключевые отличия:

  1. Формат релокации: ARM64 использует формат rela, в то время как ARM32 использует другой формат релокации
  2. Инструкции ассемблера: Различные наборы инструкций для ARM32 (armv7) и ARM64 (aarch64)
  3. Системные вызовы: Различия в системных вызовах и обработке прерываний

Для процессора ASR1803 с ядром Cortex-A7 вам необходимо явно указать архитектуру сборки как ARM32.


Настройка системы сборки для ARM32

Для корректной сборки U-Boot под ARM32 выполните следующие шаги:

1. Установка правильного компилятора

Вам потребуется кросс-компилятор для ARM32. Это может быть:

bash
# Для Debian/Ubuntu
sudo apt-get install gcc-arm-linux-gnueabihf

# Или для других систем
sudo apt-get install gcc-arm-linux-gnueabi

2. Установка переменных окружения

bash
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

3. Очистка и конфигурация

bash
make mrproper
make asr1803_defconfig

4. Проверка архитектуры сборки

После конфигурации проверьте, что сборка идет под правильной архитектурой:

bash
grep "CONFIG_" .config | grep -E "ARM|ARCH"

Должны быть видны параметры вроде:

  • CONFIG_ARM=y
  • CONFIG_ARCH_ASPEED=y (или другая архитектура, если она поддерживается)

Модификация конфигурации платы

1. Файл configs/asr1803_defconfig

В вашем файле конфигурации должны быть указаны правильные параметры для ARM32:

makefile
CONFIG_ARM=y
CONFIG_ARCH_ASPEED=y  # Или другая подходящая архитектура
CONFIG_CROSS_COMPILE="arm-linux-gnueabihf-"
CONFIG_TARGET_AS1803=y

2. Обновление Kconfig файлов

В файле arch/arm/mach-nzas/Kconfig убедитесь, что правильно указана архитектура:

kconfig
config ARCH_AS1803
    bool "ASR1803 (PXA1826) SoC support"
    depends on ARM
    select CPU_V7
    select OF_CONTROL
    select DM
    ...

3. Makefile для платы

В файле board/asr/asr1803/Makefile должна быть правильная конфигурация:

makefile
obj-y += asr1803.o

Настройка памяти и загрузки

Исходя из характеристик вашего процессора, необходимо правильно настроить параметры памяти:

1. Конфигурация Flash

c
// В board/asr/asr1803/asr1803.c
#define CONFIG_SYS_FLASH_BASE        0x80000000
#define CONFIG_SYS_FLASH_SIZE        0x10000000  // 256M
#define CONFIG_SYS_FLASH_CFI

2. Конфигурация DDR

c
#define CONFIG_SYS_SDRAM_BASE        0x00000000
#define CONFIG_SYS_SDRAM_SIZE        0x08000000  // 128M

3. Адрес загрузки U-Boot

c
#define CONFIG_SYS_LOAD_ADDR        0x00308000

4. Начальный стек

c
#define CONFIG_SYS_INIT_SP_ADDR        (CONFIG_SYS_SDRAM_BASE + 0x1000)

Конфигурация UART

Для вашего процессора с UART по адресу 0xD4017000 и тактовой частотой 26MHz:

1. Конфигурация UART в Kconfig

kconfig
CONFIG_CONS_INDEX=1
CONFIG_DM_SERIAL=y
CONFIG_SERIAL_PRESENT=y
CONFIG_PL011_SERIAL=y
CONFIG_PL011_CLOCK=26000000

2. Инициализация UART в коде

c
// В board/asr/asr1803/asr1803.c
int board_init(void)
{
    // Инициализация UART
    gd->bd->bi_boot_params = 0x00000100;
    
    // Другая инициализация
    ...
    
    return 0;
}

3. Конфигурация скорости порта

c
#define CONFIG_BAUDRATE         115200
#define CONFIG_SERIAL_SOFTWARE_FIFO

Процесс загрузки и отладка

1. Порядок загрузки

Исходя из вашего описания, процесс загрузки выглядит следующим образом:

  1. Boot-ROM - заводской загрузчик
  2. Загрузчик первого уровня - инициализирует Flash, DDR и UART
  3. Копирование U-Boot - копируется в DDR по адресу 0x00308000
  4. Старт U-Boot - выполнение из DDR

2. Необходимые модификации

В коде U-Boot необходимо предусмотреть:

c
// В board/asr/asr1803/asr1803.c
phys_size_t get_effective_memsize(void)
{
    return 0x08000000; // 128M DDR
}

int dram_init(void)
{
    gd->ram_size = get_effective_memsize();
    return 0;
}

3. Обработка второго ядра

Поскольку второе ядро Cortex-5R не используется при загрузке, можно добавить:

c
#ifdef CONFIG_SMP
#undef CONFIG_SMP
#endif

Практические шаги для успешного портирования

1. Подготовка окружения

bash
# Клонируем свежую версию U-Boot
git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot

# Устанавливаем компилятор
sudo apt-get install gcc-arm-linux-gnueabihf

# Устанавливаем переменные окружения
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

2. Конфигурация сборки

bash
# Очищаем предыдущие конфигурации
make mrproper

# Копируем вашу конфигурацию
cp configs/asr1803_defconfig .config

# Настраиваем
make menuconfig

В menuconfig настройте:

  • Target Architecture: ARM
  • SoC Type: ASR1803
  • Memory Configuration: согласно вашим параметрам
  • UART: PL011, 26MHz, 115200 baud

3. Сборка и проверка

bash
# Сборка
make -j$(nproc)

# Проверка бинарного файла
file u-boot.bin
# Должно быть: ARM, little-endian, 32-bit

4. Отладка

Если возникают проблемы, используйте следующие методы отладки:

  1. Включите подробный вывод:

    makefile
    CONFIG_DEBUG_UART=y
    CONFIG_DEBUG_UART_ANNOUNCE=y
    
  2. Добавьте отладочные сообщения в код инициализации.

  3. Проверьте лог загрузки через UART.

5. Тестирование

Для тестирования можно использовать QEMU с ARM32 конфигурацией:

bash
# Если есть поддержка QEMU
make qemu_arm_defconfig
make
./u-boot -M versatilepb -kernel u-boot.bin

Заключение

Портирование U-Boot на ASR1803 (PXA1826) с ядром Cortex-A7 требует правильной настройки системы сборки под ARM32 архитектуру. Ключевые моменты:

  1. Используйте правильный компилятор - arm-linux-gnueabihf-gcc
  2. Настройте переменные окружения - ARCH=arm, CROSS_COMPILE
  3. Конфигурируйте память и UART в соответствии с вашими спецификациями
  4. Проверяйте архитектуру сборки перед компиляцией
  5. Используйте отладочные функции для диагностики проблем

Следуя этим шагам, вы сможете успешно собрать U-Boot для вашего процессора и попасть в консоль загрузчика. Для более глубокой отладки рекомендуется изучить документацию по аналогичным платам на базе Cortex-A7 в исходном коде U-Boot.

Источники

  1. Official U-Boot ARM64 Documentation
  2. U-Boot Porting Guide - Linaro
  3. Linux-sunxi U-Boot Documentation
  4. TI Processor SDK U-Boot Guide
  5. U-Boot README - ARM-software
  6. Toradex U-Boot Build Guide
Авторы
Проверено модерацией
Модерация