SPL - Secondary Program Loader
CCI - CoreLink Cache Coherent Interconnect
Это не просто очень популярный загрузчик с открытым исходным кодом для разных встроенных операционных систем ( нас в частности интересует ARM ). Это программа , которая инициализирует и подготавливает периферию такую как USB, Ethernet и многое многое другое.
Исходный код можно без проблем скачать с гитхаба.
Как и любой огромный набор файлов на языке С разложен по каталогам (по логическому назначению). И естественно мы видим почти в каждом из каталогов файл makefile. Это значит , что мы можем смело запускать сборку командой make.
Как видно при беглом изучении каталогов U-boot реализует поддержку огромного числа платформ (то есть разных процессоров), внутри которых еще могут быть разные архитектуры.
В коде для разделения сборки для разных платформ/архитектур/SoC традиционно (для языка С) используются дефайны (#define).
И первое , на что нужно обратить внимание это наборы переменных, которые будут использоваться для условий в mskefile. Находятся наборы переменных для разных процессоров в каталоге /configs . Например возьмем файл внутри каталога config с говорящим названием orangepi_one_defconfig :
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_SPL=y
CONFIG_MACH_SUN8I_H3=y
CONFIG_DRAM_CLK=672
CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-orangepi-one"
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_SUN8I_EMAC=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
Понятно , что CONFIG_ARM означает ,что мы будем иметь дело при сборке с ARM.
CONFIG_ARCH_SUNXI - ARM процессор (точнее SoC) от компании SUNXI, производитель чипов AllWinner.
Далее берем текстовый редактор (например Node32++) и глобальным поиском по под каталогам ищем точки входа по CONFIG_ARM / CONFIG_ARCH_SUNXI.
Практически сразу выясняется ,что сборка проекта под Orange Pi One делается просто - с указание набора параметров из файла orangepi_one_defconfig .
make -j4 ARCH=arm CROSS_COMPILE=arm-none-eabi- orangepi_one_defconfig
Можно установить набор инструментов GNU напрмер gcc-arm-none-eabi-10-2020-q4-major-win32.exe и попробовать собрать U-Boot для Orange Pi One. Заодно посмотреть как (а главное какие каталоги и файлы участвуют в сборке).
Интересно , что как реализована инициализация и управление периферией например USB. То есть это по сути готовый пример как реализовать на нижнем уровне работу по USB на любой платформе.
Когда процессор (или контроллер - неважно) стартует , то происходит тупо переход на начальный адрес счетчика команд и выполняется соответственно первая команда.
На этом этапе память SRAM еще не инициализирована (не подготовлена), то есть там полный хаос в значениях ячеек. Прерывания (не дай бог если будут разрешены) переходят по не существующим адресам. В общем надо все подготовить .
Получается , что U-boot этим и займется. Поэтому он соответственно стартует первым. То есть он грузит себя родного сначала в SRAM , инициализирует UART для логирования своего процесса исполнения и для управления самим собой. То есть можно послать в UART какой-нибудь байт и U-boot вежливо остановится для приема пользовательской команды из UART.
U-boot реализует много команд.
Но еще он использует для своей работы много переменных, которые прописаны в разных видах памяти. Так например в NVRAM (non volatile RAM) обычно записаны на стадии изготовлении заводской номер изделия , его МАК фдрес и т.д.
Есть переменная loadbootsc , которая позволяет дополнительно запускать скрипт с вашими командами.