- 3. Загрузчик U-Boot
- 3.2. Обзор загрузчика
- 3.2.1. Возможности
- 3.2.2. Исходный код
- 3.2.3. Конфигурация и сборка
- 3.2.4. Загрузка ядра Linux
- 3.2.5. Переменные окружения
- 3.2.6. Драйвер GEMAC
- 3.2.7. Драйвер NAND NFC
- 3.2.8. Драйвер QSPI
- 3.3. Поддержка ELV-MC03-SMARC
- U-Boot
- Образ
- Создание образа
- Ядро
- Корневая файловая система
- Запись образа во Flash
- Создание из образа оригинального файла
- Переменные
- Загрузка
- Задержка
- Параметры ядра
- Идентификатор ядра
- Сохранение переменных
- Проверка контрольной суммы
- Доступ к переменным из Linux
- MAC-адрес
- Flash
- Заставка
3. Загрузчик U-Boot
Данный документ описывает особенности работы загрузчика U-Boot для модулей на базе микросхемы 1892ВА018 (aka СКИФ, Scythian, MCom-03).
3.2. Обзор загрузчика
3.2.1. Возможности
- Поддержка модулей на базе MCom-03:
- ROCK Pi N10 с установленным процессорным модулем ELV-MC03-SMARC r1.1;
- NGFW-CB r1.0 с установленным процессорным модулем ELV-MC03-SMARC r1.1;
- conga-SEVAL с установленным процессорным модулем ELV-MC03-SMARC r1.1;
- ELV-SMARC-CB r1.0 с установленным процессорным модулем ELV-MC03-SMARC r1.1;
- Трастфон-Э ОПН r1.1 с установленным процессорным модулем Трастфон-Э ПМ r1.5;
- MCom-03 BuB r1.3.x, r1.5.x (aka IPCom BuB).
3.2.2. Исходный код
Основные файлы поддержки микросхемы:
- arch/arm/dts/mcom03*.dts ,
- board/elvees/ ,
- configs/mcom03*_defconfig ,
- include/configs/mcom03.h .
3.2.3. Конфигурация и сборка
Соответствие модулей, конфигураций и имён DTS-файлов приведено в таблице Таблица 3.1 .
Таблица 3.1 Конфигурации и DTS-файлы для модулей MCom-03
Результатом сборки исходных кодов загрузчика является образ u-boot.bin . Образ доступен в корневой директории загрузчика после завершения сборки.
Для сборки загрузчика на ПК требуется кросс-компилятор aarch64-linux-gnu.
Переменные окружения, влияющие на сборку загрузчика:
- ARCH — целевая архитектура;
- CROSS_COMPILE — префикс кросс-компилятора;
- DEVICE_TREE — имя файла DTS (без расширения) для целевого модуля;
- PATH — пути для поиска используемых приложений.
Пример сборки загрузчика для модуля MCom-03 BuB r1.3.0:
export PATH=:$PATH export ARCH=arm export CROSS_COMPILE=aarch64-linux-gnu- export DEVICE_TREE=mcom03-bub-r1.3.0 make mcom03bub_defconfig make
3.2.4. Загрузка ядра Linux
U-Boot выполняет загрузку Linux по схеме Generic Distro:
- SD-карта (или eMMC, USB-накопитель) содержит файл extlinux.conf , образы ядер Linux, DTB-файлы, rootfs.
- U-Boot перебирает источники загрузки: монтирует файловые системы с носителей подключенных к SD-контроллерам MCom-03, USB-контроллерам, проверяет наличие extlinux.conf . Порядок носителей определяется переменной boot_targets .
- U-Boot считывает extlinux.conf , загружает образ ядра и DTB в ОЗУ, передаёт управление ядру.
3.2.5. Переменные окружения
Загрузчик поддерживает настройку через переменные окружения.
Во время запуска загрузчик выполняет поиск переменных окружения, сохраненных в QSPI флеш-памяти:
- при успешном обнаружении устанавливаются переменные окружения, сохраненные в QSPI флеш-памяти;
- в случае ошибки устанавливаются переменные окружения, заданные по умолчанию в коде U-Boot (см. файл include/configs/mcom03.h ).
3.2.6. Драйвер GEMAC
3.2.7. Драйвер NAND NFC
3.2.8. Драйвер QSPI
Драйвер контроллера QSPI реализует ведущее устройство на шине SPI согласно классу UCLASS_SPI (см. doc/driver-model/spi-howto.rst ) модели драйверов U-Boot.
Драйвер поддерживает спецификацию ведущего и ведомых устройств на шине SPI согласно doc/device-tree-bindings/spi/spi-bus.txt .
- Поддержка до четырех ведомых устройств.
- Передача в формате CPHA = 0 (см. флаг SPI_CPHA режима).
- Полярность сигнала синхронизации CPOL = 0 (см. флаг SPI_CPOL режима).
- Сигнал CS в активном состоянии «логический 0» (см. флаг SPI_CS_HIGH режима).
- Передача слов данных старшим битом вперед (см. флаг SPI_LSB_FIRST режима).
- Ведущее устройство на шине SPI (см. флаг SPI_SLAVE режима).
- Пересылка в режиме full-duplex:
- Передача данных по одному выводу на шине SPI (см. флаг SPI_TX_BYTE режима).
- Прием данных по одному выводу на шине SPI (см. флаг SPI_RX_SLOW режима).
- Не поддерживается установка скорости передачи. Частота на шине SPI равна частоте clk_ext , которая указывается в свойстве clocks в device tree. Частота clk_ext должна быть не больше частоты clk_axi на шине AXI.
- Размер данных должен быть кратен восьми битам.
- Передача в формате CPHA = 1 не поддерживается (флаг SPI_CPHA режима должен быть равен 0).
- Полярность сигнала синхронизации CPOL = 1 не поддерживается (флаг SPI_CPOL режима должен быть равен 0).
- Сигнал CS в активном состоянии «логическая 1» не поддерживается (флаг SPI_CS_HIGH режима должен быть равен 0).
- Передача слов данных младшим битом вперед не поддерживается (флаг SPI_LSB_FIRST режима должен быть равен 0).
- Передача/прием данных по одной линии не поддерживается (флаг SPI_3WIRE режима должен быть равен 0).
- Режим loopback не поддерживается (флаг SPI_LOOP режима должен быть равен 0).
- Режим ведомого устройства на шине SPI не поддерживается (флаг SPI_SLAVE режима должен быть равен 0).
- Пропуск принятых байтов данных перед преамбулой не поддерживается (флаг SPI_PREAMBLE режима должен быть равен 0).
- Передача данных по двум выводам на шине SPI не поддерживается (флаг SPI_TX_DUAL режима должен быть равен 0).
- Передача данных по четырем выводам на шине SPI не поддерживается (флаг SPI_TX_QUAD режима должен быть равен 0).
- Прием данных по двум выводам на шине SPI не поддерживается (флаг SPI_RX_DUAL режима должен быть равен 0).
- Прием данных по четырем выводам на шине SPI не поддерживается (флаг SPI_RX_QUAD режима должен быть равен 0).
С учетом ограничений, перечисленных выше, драйвер поддерживает только режим работы устройства на шине SPI, равный 0x0900 .
При инициализации драйвер выполняет:
- захват и включение тактового сигнала;
- вывод контроллера QSPI из состояния сброса;
- настройку контактных площадок в подсистеме HSPERIPH для внешних выводов контроллера QSPI1 на микросхеме MCom-03;
- начальную настройку контроллера QSPI.
При удалении драйвер выполняет:
3.3. Поддержка ELV-MC03-SMARC
Загрузчик и переменные окружения размещаются в QSPI0.
Загрузчик поддерживает нижеперечисленные интерфейсы модуля ELV-MC03-SMARC. Наименования интерфейсов приведены в соответствии со спецификацией SMARC 2.1. В скобках указаны контроллеры MCom-03.
U-Boot
U-Boot — универсальный загрузчик, используемый для загрузки ОС Linux™ и других ОС .
Образ
U-Boot использует образы, создаваемые программой mkimage , сборка которой выполнятся при сборке U-Boot (см. /tools/mkimage ) и которую, вероятно, можно поставить из пакета uboot-mkimage вашего дистрибутива GNU/Linux.
mkimage добавляет 64 байта информации: название, контрольную сумму и пр.
Для отображения информации об образе:
Создание образа
Ядро
Или скопируйте программу mkimage полученную при сборке U-Boot в одну из директорий указанных в переменной окружения PATH (см. echo $PATH ) или измените её значение (например, export PATH+=:/path/to/mkimage_dir ).
После этого вы можете для сборки ядра и создания из собранного ядра образа U-Boot выполнять make uImage .
Также вы можете создать образ из командной строки, см. встроенную помощь mkimage -h .
Корневая файловая система
mkimage -n ‘Ramdisk name’ -C gzip -A arm -O linux -T ramdisk -d ramdisk.gz uramdisk.gz ,
где ‘Ramdisk name ‘ — название КФС, ramdisk.gz — название файла сжатого образа КФС , uramdisk.gz — название создаваемого образа U-Boot.Запись образа во Flash
Для записи созданного образа ядра или КФС во Flash требуется:
Создание из образа оригинального файла
Для получения из образа U-Boot оригинального файла у файла образа нужно убрать начальные 64 байта, например:
dd if=uImage of=zImage bs=1 skip=64Переменные
Список переменных и их значения отображаются командой printenv .
Для вывода значения отдельной переменной используйте команду printenv , где — название переменной.
Загрузка
При запуске U-Boot, после задержки , выполняет команды содержащиеся в переменной bootcmd .
Несколько команд могут быть разделены символом ‘;’.
Задержка
Задержка при загрузке задаётся переменной bootdelay .
Параметры ядра
Параметры передаваемые ядру ( cmdline ) задаются переменной bootargs .
Идентификатор ядра
Идентификатор ядра machid задаётся переменной machid , указывается шестнадцатеричное значение без префикса.
Сохранение переменных
Сохранение переменных во Flash выполняется командой saveenv . При её выполнении автоматически снимается и устанавливается защита от записи сектора Flash, в котором хранятся переменные.
$ saveenv Saving Environment to Flash. . done Un-Protected 1 sectors Erasing Flash. . done Erased 1 sectors Writing to Flash. done . done Protected 1 sectors
Проверка контрольной суммы
При загрузке ядра и КФС U-Boot проверяет контрольную сумму (КС, CRC). Если подсчитанная КС не совпадает с КС подсчитанной при создании образа , выполняется перезагрузка.
Проверка КС может быть отключена установкой переменой verify значения no .
Заметьте, что при отключённой проверке КС и программной перезагрузке из ОС вы можете получить нерабочую систему (или с очень странным поведением), так как может быть выполнен запуск с повреждённым образом ядра и/или КФС .
Проверка КС кода самого U-Boot не выполняется.
Доступ к переменным из Linux
Прочесть переменные U-Boot из Linux можно программой fw_printenv , см. /tools/env . Конфигурация задается файлом /etc/fw_env.config .
Пример файла конфигурации для Тион, Тион-Про:
# MTD dev name Dev. offset Env. size Flash sector size /dev/mtd0 0x40000 0x40000 0x40000
Пример чтения переменой ethaddr :
fw_printenv 2>/dev/null | grep ethaddr | grep -o -E ".:.:."
MAC-адрес
Если на плате есть наклейка » MAC : …», то это плата с IAB (JSC Electrical Equipment Factory) MAC -адресом, который можно смело использовать на этой плате.
Для плат на базе процессора:
EP93xx — MAC -адрес записывается в ИМС SPI Flash программой download (параметр -n), читается из неё в U-Boot (начиная с svn890 задаёт значение переменной ethaddr ) и в драйвере Ethernet в Linux
PXA270 — MAC -адрес задаётся в ethaddr переменной окружения U-Boot и передаётся Linux через serial number tag (начиная с svn886)
Flash
Отображение информации о Flash – команда flinfo .
Идентификатор Flash задаётся переменной mtdids , например, значением nor0=flash .
Разделы задаются переменной mtdparts , например, три раздела 512 kB, 4 MB и оставшееся место: mtdparts=flash:512k(u-boot)ro,4m(kernel)ro,-(fs) .
Команда mtdparts выводит список текущих разделов, например:
$ mtdparts device nor0 , # parts = 3 #: name size offset mask_flags 0: u-boot 0x00080000 0x00000000 1 1: kernel 0x00400000 0x00080000 1 2: fs 0x01b80000 0x00480000 0 active partition: nor0,2 - (fs) 0x01b80000 @ 0x00480000
Команда ls выводит содержимое ФС JFFS2 для раздела указанного командой chpart (в переменной partition ), например, nor0,2 .
Командой protect off выполняется снятие программной или аппаратной защиты от записи или стирания Flash. Например, защиту с раздела nor0,2 можно снять командой:
Командой erase выполняется стирание содержимого Flash. Например, перед записью КФС размещённой на разделе nor0,2 требуется стереть содержимое этого раздела полностью командой:
См. также команды fsinfo , fsload .
Заставка
Для заставки используется изображение в формате bmp с индексированной палитрой из 256 цветов. Для преобразования изображения можно воспользоваться GIMP.
Адрес изображения указывается в переменой splashimage . Если по указанному адресу изображение не распознано, то отображается логотип.
Экран очищается командой cls , при этом отображается логотип вместо заставки, но палитра остаётся без изменения.
Перенаправление вывода консоли на экран:
setenv stdout lcdПри использовании (U-Boot 2010.09 из Git-репозитория ниже и U-Boot 1.3.3 начиная с svn598 патчей для плат на основе EP93xx) тип дисплея задаётся переменной panel :
Дисплей VGA vga 3.5″ (320×240) 3.5 5.7″ (640×480) 5.7 8″ (640×480) 8 8″ (800×600) 8-800×600 8″ (800×600)
A080SN018-800x600n Указанный дисплей используется после сброса (переменную panel следует сохранить ).
Для отображения фона и символов используется нулевой и 15-ый цвета палитры, соответственно.