Портирование 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
Процесс загрузки:
- Сначала загружается Boot-ROM
- Затем загрузчик первого уровня, который инициализирует FLASH, DDR и UART
- Загрузчик первого уровня копирует U-Boot в DDR по адресу 0x0030_8000
- 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.
Содержание
- Понимание архитектурных различий
- Настройка системы сборки для ARM32
- Модификация конфигурации платы
- Настройка памяти и загрузки
- Конфигурация UART
- Процесс загрузки и отладка
- Практические шаги для успешного портирования
Понимание архитектурных различий
В U-Boot существуют фундаментальные различия между ARM32 и ARM64 сборками. Как указано в документации U-Boot для arm64, U-Boot для arm64 компилируется с использованием AArch64-gcc, в то время как для ARM32 требуется компилятор для архитектуры armv7.
Ключевые отличия:
- Формат релокации: ARM64 использует формат
rela, в то время как ARM32 использует другой формат релокации - Инструкции ассемблера: Различные наборы инструкций для ARM32 (armv7) и ARM64 (aarch64)
- Системные вызовы: Различия в системных вызовах и обработке прерываний
Для процессора ASR1803 с ядром Cortex-A7 вам необходимо явно указать архитектуру сборки как ARM32.
Настройка системы сборки для ARM32
Для корректной сборки U-Boot под ARM32 выполните следующие шаги:
1. Установка правильного компилятора
Вам потребуется кросс-компилятор для ARM32. Это может быть:
# Для Debian/Ubuntu
sudo apt-get install gcc-arm-linux-gnueabihf
# Или для других систем
sudo apt-get install gcc-arm-linux-gnueabi
2. Установка переменных окружения
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
3. Очистка и конфигурация
make mrproper make asr1803_defconfig
4. Проверка архитектуры сборки
После конфигурации проверьте, что сборка идет под правильной архитектурой:
grep "CONFIG_" .config | grep -E "ARM|ARCH"
Должны быть видны параметры вроде:
CONFIG_ARM=yCONFIG_ARCH_ASPEED=y(или другая архитектура, если она поддерживается)
Модификация конфигурации платы
1. Файл configs/asr1803_defconfig
В вашем файле конфигурации должны быть указаны правильные параметры для ARM32:
CONFIG_ARM=y
CONFIG_ARCH_ASPEED=y # Или другая подходящая архитектура
CONFIG_CROSS_COMPILE="arm-linux-gnueabihf-"
CONFIG_TARGET_AS1803=y
2. Обновление Kconfig файлов
В файле arch/arm/mach-nzas/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 должна быть правильная конфигурация:
obj-y += asr1803.o
Настройка памяти и загрузки
Исходя из характеристик вашего процессора, необходимо правильно настроить параметры памяти:
1. Конфигурация Flash
// В 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
#define CONFIG_SYS_SDRAM_BASE 0x00000000
#define CONFIG_SYS_SDRAM_SIZE 0x08000000 // 128M
3. Адрес загрузки U-Boot
#define CONFIG_SYS_LOAD_ADDR 0x00308000
4. Начальный стек
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000)
Конфигурация UART
Для вашего процессора с UART по адресу 0xD4017000 и тактовой частотой 26MHz:
1. Конфигурация UART в Kconfig
CONFIG_CONS_INDEX=1
CONFIG_DM_SERIAL=y
CONFIG_SERIAL_PRESENT=y
CONFIG_PL011_SERIAL=y
CONFIG_PL011_CLOCK=26000000
2. Инициализация UART в коде
// В board/asr/asr1803/asr1803.c
int board_init(void)
{
// Инициализация UART
gd->bd->bi_boot_params = 0x00000100;
// Другая инициализация
...
return 0;
}
3. Конфигурация скорости порта
#define CONFIG_BAUDRATE 115200
#define CONFIG_SERIAL_SOFTWARE_FIFO
Процесс загрузки и отладка
1. Порядок загрузки
Исходя из вашего описания, процесс загрузки выглядит следующим образом:
- Boot-ROM - заводской загрузчик
- Загрузчик первого уровня - инициализирует Flash, DDR и UART
- Копирование U-Boot - копируется в DDR по адресу 0x00308000
- Старт U-Boot - выполнение из DDR
2. Необходимые модификации
В коде U-Boot необходимо предусмотреть:
// В 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 не используется при загрузке, можно добавить:
#ifdef CONFIG_SMP
#undef CONFIG_SMP
#endif
Практические шаги для успешного портирования
1. Подготовка окружения
# Клонируем свежую версию 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. Конфигурация сборки
# Очищаем предыдущие конфигурации
make mrproper
# Копируем вашу конфигурацию
cp configs/asr1803_defconfig .config
# Настраиваем
make menuconfig
В menuconfig настройте:
- Target Architecture: ARM
- SoC Type: ASR1803
- Memory Configuration: согласно вашим параметрам
- UART: PL011, 26MHz, 115200 baud
3. Сборка и проверка
# Сборка
make -j$(nproc)
# Проверка бинарного файла
file u-boot.bin
# Должно быть: ARM, little-endian, 32-bit
4. Отладка
Если возникают проблемы, используйте следующие методы отладки:
-
Включите подробный вывод:
makefileCONFIG_DEBUG_UART=y CONFIG_DEBUG_UART_ANNOUNCE=y
-
Добавьте отладочные сообщения в код инициализации.
-
Проверьте лог загрузки через UART.
5. Тестирование
Для тестирования можно использовать QEMU с ARM32 конфигурацией:
# Если есть поддержка QEMU
make qemu_arm_defconfig
make
./u-boot -M versatilepb -kernel u-boot.bin
Заключение
Портирование U-Boot на ASR1803 (PXA1826) с ядром Cortex-A7 требует правильной настройки системы сборки под ARM32 архитектуру. Ключевые моменты:
- Используйте правильный компилятор - arm-linux-gnueabihf-gcc
- Настройте переменные окружения - ARCH=arm, CROSS_COMPILE
- Конфигурируйте память и UART в соответствии с вашими спецификациями
- Проверяйте архитектуру сборки перед компиляцией
- Используйте отладочные функции для диагностики проблем
Следуя этим шагам, вы сможете успешно собрать U-Boot для вашего процессора и попасть в консоль загрузчика. Для более глубокой отладки рекомендуется изучить документацию по аналогичным платам на базе Cortex-A7 в исходном коде U-Boot.