В этой статье описана прошивка и загрузка плат TI AM335x EVM, EVM-SK и BeagleBone (Black) с разных источников загрузки (media booting). Все непонятные термины и сокращения см. в Словарике [].
В таблице ниже перечислено, какая плата какой режим загрузки поддерживает.
Плата
MMCSD
UART
SPI
NAND
TI AM335x EVM
ДА
ДА
ДА
ДА
TI AM335x EVM-SK
ДА
ДА
-
-
BeagleBone
ДА
ДА
-
-
Загрузчик (bootloader) инициализирует DDR и необходимые периферийные устройства. После того, как образы загрузчика и приложения StarterWare подготовлены, они могут быть прошиты/скопированы на носитель (источник загрузки), чтобы они могли загрузиться самостоятельно при включении питания. Информацию о готовых образах загрузчика и демо-приложения, и от том как их загружать, см. в статье [2]. Информацию о требованиях к платформе хоста и шагах по сборке см. в руководстве [3].
На загрузочный носитель должны быть записаны 2 типа двоичных образов - образ загрузчика (bootloader image) и образ загружаемого приложения (application binary image). Оба этих образа должны быть в специальном формате, где содержится заголовок. В заголовке указана информация о размере и адресе загрузки двоичного образа.
Заголовок имеет очень простой формат. Это 8 байт, которые добавляются в начало сырого двоичного загружаемого кода. Первые 4 байта это размер файла образа, следующие 4 байта это адрес загрузки. Оба этих 32-битных числа хранятся в формате little endian, т. е. младший байт числа идет первым.
Например, к файлу MLO, у которого размер образа (до добавления заголовка) 26420 байт, будет добавлен следующий заголовок:
0x34 0x67 0x00 0x00 0x00 0x04 0x2F 0x40
Здесь первые 4 байта показывают размер файла образа 0x00006734 (что равно 26420), следующие 4 байта показывают адрес загрузки 0x402F0400 (область внутреннего ОЗУ процессора, OCMC0 RAM).
Добавление заголовка делает утилита tiimage.exe, см. далее раздел "Как использовать ti_image Tool".
Когда bootloader/application собраны с помощью любого тулчейна, их двоичный образ binary/armv7a/gcc/am335x/< EVM>/< bootloader/app_folder/< build-configuration>/< app_name>.bin автоматически преобразуется в файл binary/armv7a/gcc/am335x/< EVM>/< bootloader/app_folder>/< build-configuration>/< app_name>_ti.bin.
Любой двоичный образ исполняемого кода может быть преобразован в этот специальный формат с помощью утилиты image converter, которое находится в папке /tools/ti_image/ (которая в свою очередь на Windows по умолчанию находится в каталоге C:\ti\AM335X_StarterWare_02_00_01_01). Использование утилиты image converter см. далее в секции "Как использовать ti_image Tool".
После того, как образы bootloader и StarterWare application подготовлены в специальном формате, их можно прошить/скопировать на загрузочный носитель, что описано далее.
[Загрузка с карты SD]
Чтобы загрузиться с карты SD, необходимо её подготовить. Карта должна быть отформатирована в файловой системе FAT. Для форматирования карты должна использоваться утилита HP USB Disk Storage Format Tool v2.0.6 Portable [4]. После загрузки утилиты запишите её в любое место на диске. Для использования утилиты её необходимо запускать с правами администратора.
Процесс подготовки карты по шагам (на операционной системе хоста Windows):
1. Установите карту SD (microSD) в карт-ридер, подключенный к хосту, запустите утилиту с правами администратора, выберите привод, в который установлена карта.
2. Если у карты размер больше 4GB, то выберите файловую систему FAT32, иначе оставьте выбранной файловую систему FAT.
3. Для ускорения форматирования поставьте галочку Quick Format. Кликните Start.
После завершения форматирования карта готова к записи на неё загрузчика и загружаемого приложения.
Примечание: на некоторых системах (например на моей Windows 10) утилита HP USB Disk Storage Format Tool не работает. Тогда как вариант можно воспользоваться стандартными средствами Windows для форматирования карты в файловой системе FAT16(FAT) или FAT32.
4. Преобразованный файл образа загрузчика (boot.bin, соединенный с TI Image Header), должен быть переименован в MLO. Файл boot_ti.bin создается путем сборки загрузчика в режиме загрузки с карты (MMC/SD boot mode).
5. Преобразованный подобным образом двоичный файл приложения (application binary image, файл с именем < app_name>_ti.bin) должен быть переименован в app.
6. Скопируйте файлы MLO и app на карту SD. После этого безопасно извлеките карту из карт-ридера, и установите её в слот используемой платы с процессором AM335x.
Примечание: шаги 1 .. 6 одинаково выполняются как для карт SD, так и для карт microSD.
Процесс загрузки:
1. Установите карту в слот платы. Подключитесь к UART платы с параметрами сессии 115200 baud, 8bit, No parity, 1 STOP bit.
Примечание: в случае использования платы для загрузки с AM335X EVM необходимо её предварительно сконфигурировать [2]. Для BeagleBone ничего конфигурировать не надо, она по умолчанию загружается с карты SD (или microSD в случае BBB).
2. Передерните (или включите) питание платы. Загрузчик найдет файл MLO, загрузит его в OCMC0 RAM и запустит на выполнение. После этого MLO загрузит приложение (файл app) в память SDRAM/DDR, и передаст ему управление. При успешной загрузки в UART-консоли появится следующее сообщение:
StarterWareAM335x Boot Loader
Copying application image from MMC/SD card to RAM
Jumping to StarterWare Application...
Примечание: для платки BBB при подаче питания необходимо удерживать нажатой кнопку S2 Boot, иначе произойдет загрузка из памяти eMMC flash (по умолчанию с завода там записан загрузочный образ Debian).
После этого процессор работает под управлением загруженного приложения (файл app).
[Загрузка через UART]
Встроенный в процессор загрузчик (ROM code) и StarterWare Bootloader поддерживают протокол XMODEM, и образы в этом случае должны быть чисто сырыми двоичными (plain binary images), без заголовка. Процесс по шагам:
1. Сконфигурируйте плату (это относится только к плате AM335X EVM, для Beaglebone ничего конфигурировать не нужно), чтобы был выбран режим загрузки через UART (UART Boot mode).
2. При включении питания ROM code начнет отправлять символы приглашения "CC.." в ожидании от консоли UART передачи StarterWare Bootloader по протоколу XMODEM.
3. При отправки образа bootloader (файл boot.bin) по протоколу XMODEM в последовательной консоли будет видно следующее:
StarterWareAM335x Boot Loader
CC
4. Любой двоичный образ (без заголовка) можно передать по протоколу XMODEM. После этого приложение запустится на выполнение.
[Загрузка через SPI]
Для загрузки через SPI необходимо прошить загрузчик и приложение в микросхему памяти SPI Flash. Процесс прошивки:
1. Сконфигурируйте EVM в профиль 2 (SW8[1] = OFF, SW8[2] = ON, SW8[3:4] = OFF). Подробнее про информацию о профилях см. EVM reference manual.
2. Сконфигурируйте BOOT для SPI Boot mode.
3. Подключитесь к целевому процессору.
4. Загрузите GEL-файл /tools/gel/AM335X.gel.
5. Загрузите spi_flash_writer_AM335X.out в плату EVM.
6. Отобразится приглашение ввода имени двоичного файла, выберите прошиваемый файл.
7. Отобразится приглашение ввода адреса в памяти flash. Если прошивается bootloader, то укажите адрес 0x00000. Для приложения StarterWare укажите адрес 0x20000.
8. После завершения записи SPI flash отключитесь от CCS.
Процесс загрузки:
1. Подключитесь кабелем UART к плате, параметры сессии установите 115200 baud, 8bit, No parity, 1 STOP bit.
2. Сконфигурируйте плату для загрузки через SPI (SPI boot mode). SPI доступен в профиле 2 (SW8[1] = OFF, SW8[2] = ON, SW8[3:4] = OFF). Подробности см. в EVM reference manual.
3. После выбора SPI boot mode передерните (включите) питание платы. Код ROM найдет bootloader, загрузит его в OCMC0 RAM и запустит на выполнение. Затем bootloader скопирует образ приложения через SPI в SDRAM, и передаст ему управление.
Если все прошло успешно, то в консоли UART появится следующее сообщение:
StarterWareAM335x Boot Loader
Copying application image to RAM
Jumping to StarterWare Application...
Теперь загруженное приложение должно получить контроль над процессором.
[Загрузка с NAND Flash]
Для загрузки из памяти NAND Flash сначала необходимо записать в неё образы загрузчика и приложения. Процесс по шагам:
1. Сконфигурируйте EVM в профиль 0 (SW8[1:4] = OFF). Подробности см. в EVM reference manual.
2. Сконфигурируйте BOOT pins для NAND Boot mode.
3. Подключитесь к процессору платы.
4. Загрузите GEL-файл /tools/gel/AM335X.gel.
5. Загрузите в EVM и запустите nand_flash_writer_AM335X.out. Плагин flash writer будет выводит сообщения в консоль CCS. В ответ на его приглашение ввода (1, 2 или 3) необходимо ввести эти символы в консоли CCS, чтобы выбрать необходимое действие.
6. Когда будет предложено выбрать имя двоичного файла, обновите его, указав правильный полный путь.
7. Выберите вводом 1, 2 или 3 одну из опций прошивки.
Choose your operation
Enter 1 ---> To Flash an Image
Enter 2 ---> To ERASE the whole NAND
Enter 3 ---> To EXIT
Для прошивки образа выберите вариант 1, для стирания памяти выберите опцию 2. Вот так выглядит приглашение ввода имени и пути для прошиваемого файла образа (вводится полный путь, например c:\images\boot_ti.bin):
8. Вот так выглядит приглашение ввода смещения в шестнадцатеричном виде:
Enter offset (in hex):
Это смещение (offset) задает начало области, куда прошивается образ. Адрес вводится в HEX-формате. Если прошивается bootloader, то укажите адрес 0x00000, для StarterWare application укажите адрес 0x80000.
9. Выберите схему ECC для прошивки.
Choose the ECC scheme from given options
Enter 1 ---> BCH 8 bit
Enter 2 ---> HAM
Enter 3 ---> T0 EXIT
Please enter ECC scheme type:
На этом шаге всегда выбирайте для BCH8 и для приложения, поскольку ROM Code и bootloader используют BCH8 в качестве схемы ECC. Введите 1 для u-boot.min.nand.
10. Убедитесь, что информация о flash, отображаемая утилитой, соответствует NAND flash в EVM. После этого утилита должна сначала стереть необходимую область памяти flash, и затем начать записывать новый образ. По завершению процесса Вы должны увидеть в консоли следующее сообщение:
Application is successfully flashed
NAND boot preparation was successful!
После завершения прошивки NAND flash отключитесь от CCS.
Загрузка с NAND flash:
1. Подключитесь кабелем UART к плате, указав параметры сессии 115200 baud, 8bit, No parity, 1 STOP bit.
2. Сконфигурируйте плату для загрузки в NAND boot mode.
3. NAND доступна в профиле 0 (SW8[1:4] = OFF). Подробнее см. руководство EVM reference manual.
4. Передерните (включите) питание платы. Сначала код ROM найдет bootloader и запустит его в OCMC0 RAM. Затем bootloader скопирует образ приложения из NAND в SDRAM, и передаст управление в загруженное приложение. Если все прошло успешно, то в консоли отобразится следующее:
StarterWareAM335x Boot Loader
Copying application image from NAND to RAM
Jumping to StarterWare Application...
Теперь загруженное приложение должно получить контроль над процессором.
Информация в этой врезке относится только к AM335X EVM. ROM Code процессора поддерживает несколько режимов загрузки, которые можно выбрать DIP-переключателями на плате (SW3). Выбор режима загрузки определяется при включении питания уровнями на ножках управления загрузкой процессора (SYSBOOT configuration pins).
На рисунке ниже показан пример установки режима загрузки NAND boot: SW3 5:1 установлены в состояние 10010. Зеленым цветом показаны переключатели в положении ON (лог. 1), красным в положении OFF (лог. 0), т. е. метка "ON" на DIP-переключателе перепутана, на самом деле здесь должна быть метка "OFF".
В таблице ниже перечислены режимы загрузки, соответствующие носители загрузочных данных и установки DIP-переключателей SW3.
Режимы загрузки
SYSBOOT[4:0]
1-й
2-й
3-й
4-й
Зарезервировано
00000
UART
XIP w/WAIT (MUX2)
MMC
SPI
00001
UART
SPI
NAND
NANDI2C
00010
UART
SPI
XIP (MUX2)
MMC
00011
UART
XIP w/WAIT (MUX1)
MMC
NAND
00100
UART
XIP (MUX1)
SPI
NANDI2C
00101
EMAC
SPI
NAND
NANDI2C
00110
EMAC
MMC
XIP WAIT (MUX2)
NAND
00111
EMAC
MMC
XIP (MUX2)
NANDI2C
01000
EMAC
XIP WAIT (MUX1)
NAND
MMC
01001
EMAC
XIP (MUX1)
SPI
NANDI2C
01010
USB
NAND
SPI
MMC
01011
USB
NAND
XIP (MUX2)
NANDI2C
01100
USB
NAND
XIP (MUX1)
SPI
01101
Зарезервировано
01110
GP Fast External Boot
UART
EMAC
Зарезервировано
01111
XIP (MUX1)
UART
EMAC
MMC
10000
XIP w/WAIT (MUX1)
UART
EMAC
MMC
10001
NAND
NANDI2C
USB
UART
10010
NAND
NANDI2C
MMC
UART
10011
NAND
NANDI2C
SPI
EMAC
10100
NANDI2C
MMC
EMAC
UART
10101
SPI
MMC
UART
EMAC
10110
MMC
SPI
UART
USB
10111
SPI
MMC
USB
UART
11000
SPI
MMC
EMAC
UART
11001
XIP (MUX2)
UART
SPI
MMC
11010
XIP w/WAIT
UART
SPI
MMC
11011
MMC1
MMC
UART
USB
11100
Зарезервировано
11101
11110
GP Fast external Boot
EMAC
UART
Зарезервировано
11111
[StarterWare AM335X bootloader]
StarterWare AM335X предоставляет простой загрузчик, который может быть прошит в носитель, доступный для загрузки платы после включения питания (power-on-reset). Загрузчик может запустить приложение, скопировав его с носителя в память SDRAM/DDR.
При включении питания запускается код из ПЗУ процессора AM335X (ROM Code) [5]. ROM Code проверяет установки режима загрузки, и в зависимости от установленного boot mode копирует код вторичного загрузчика (secondary bootloader, SPL), считывая его из соответствующего носителя. ROM Code требует, чтобы загружаемый bootloader был в специальном формате, с добавленным к двоичному образу заголовком. В этом заголовке содержится адрес загрузки для SPL, и размер загружаемого образа SPL. ROM Code копирует содержимое кода SPL во внутреннее ОЗУ процессора (OCMC RAM), находящуюся по адресу 0x402F0400, и передает ему управление.
После своего запуска SPL инициализирует блоки PLL, разрешает тактирование периферийных устройств, и затем инициализирует SDRAM DDR. Частота тактов ядра процессора устанавливается на 720 МГц. Как только инициализация завершилась, загрузчик SPL копирует приложение (например из flash) в SDRAM, после чего передает управление приложению. Приложение начинает выполнять свой код из памяти SDRAM DDR.
Примечание: двоичный код приложения должен быть преобразован в специальный формат для режимов загрузки NAND, SPI и MMCSD. Это требуется для SPL, чтобы он прочитал размер приложения и адрес, по которому приложение должно быть загружено в SDRAM. В специальном формате заголовка как раз и содержится эта необходимая информация. Для загрузки через UART добавление заголовка не требуется, загружаемый файл должен быть простым двоичным исполняемым кодом.
Стадии SPI-загрузки (SPI Boot). На диаграмме ниже показаны стадии автономной загрузки (без операционной системы) приложений StarterWare из памяти SPI flash.
Стадии NAND-загрузки. NAND boot выполняет те же шаги, что и SPI Boot, отличается только смещение - 0x80000.
Стадии SD-загрузки.
1. При сбросе системы (включении питания) ROM Code копирует загрузчик из файла MLO, который находится в корне карты SD по адресу, указанному в заголовке файла MLO. Затем ROM Code передает управление загрузчику MLO.
2. Загрузчик MLO копирует приложение StarterWare из файла app, находящегося в корне карты SD, по адресу, указанному в заголовке файла app. После этого загрузчик MLO передает управление на начальный адрес загруженного приложения.
3. Выполняется приложение StarterWare.
Стадии UART-загрузки.
1. При сбросе системы (включении питания) ROM Code ждет через UART передачи по протоколу XMODEM кода StarterWare Bootloader (в консоли UART появляются символы CCC..).
2. Когда образ StarterWare Bootloader скомпилирован для режима UART boot mode (сырой двоичный код, без заголовка, по умолчанию это файл boot.bin), он может быть передан по протоколу XMODEM. ROM code копирует принимаемые данные загрузчика в OCMC RAM, и по окончании загрузки передает ему управление.
3. StarterWare Bootloader ожидает передачи образа приложения через консоль UART по протоколу XMODEM (в консоли UART появляются символы CCC..).
4. Образ приложения StarterWare (< image>.bin, сырой двоичный код без заголовка) может быть передан по протоколу XMODEM через консоль UART. StarterWare Bootloader копирует этот образ в память SDRAM DDR, и по окончании загрузки запускает приложение на выполнение.
[Алгоритм работы загрузчика]
1. Точка входа в загрузчик - функция Entry(), которая находится в модуле bl_init.s (папка src/gcc). Эта функция инициализирует стек и секцию bss.
2. Вызывается функция bl_start(), которая находится в файле bl_main.c. Она выполняет следующие действия:
- Вызывается DeviceConfig(), реализация которой зависит от системы (EVM, BBB и т. п.). Для процессора AM335x эта функция представлена в файле bl_am335x.c. В ней вызываются функции инициализации PLL и DDR. - PLLInit() инициализирует блоки PLL0 и PLL1. - DDRInit() инициализирует DDR.
3. Инициализируется UART вызовом UartConfigure().
4. Выполняется функция Imagecopy(), которая находится в зависимом от устройства файле bl_copy.c. В зависимости от определенного режима загрузки (boot mode) эта функция вызывает SPIBootcopy() или NANDBootcopy(). В результате загруженный код приложения копируется в DDR.
5. Управление передается приложению, и оно начинает выполняться.
[Как использовать ti_image Tool]
Утилита tiimage.exe, которая находится в каталоге tools, предназначена для добавления заголовка к сырому образу загрузчика или приложения. В зависимости от операционной системы хоста использование утилиты несколько отличается (для Windows и Linux имеются разные исполняемые файлы утилиты).
Windows:
1. Запустите окно командной строки (cmd.exe). 2. Командой cd перейдите в каталог /tools/ti_image (либо сразу запускайте cmd.exe в этом каталоге). 3. Если по какой-то причине файла tiimage.exe в этом каталоге нет, то скомпилируйте его с помощью пакета Cygwin или MingW командой "gcc tiimage.c -o tiimage". 4. Используется утилита путем указания в командной строке адреса загрузки, режима загрузки, пути до входного файла образа и пути до выходного файла, к которому должен быть добавлен заголовок. Примеры:
1. Перейдите в каталог /tools/ti_image. 2. Если исполняемый файл tiimage недоступен, то сгенерируйте его командой "gcc tiimage.c -o tiimage". 3. Используется утилита путем указания в командной строке адреса загрузки, режима загрузки, пути до входного файла образа и пути до выходного файла, к которому должен быть добавлен заголовок. Примеры:
Примечание: для загрузчика в качестве режима загрузки нужно указать имя носителя/источника данных загрузки: NAND, SPI, MMCSD или UART. Для приложения в качестве режима загрузки нужно указать NONE. При сборке загрузчика его двоичный образ автоматически преобразуется в специальный формат, и помещается в каталог binary/armv7a/gcc/am335x/< EVM >/bootloader/boot_ti.bin (здесь EVM обозначает используемую плату разработки). При сборке приложения двоичный образ автоматически преобразуется в специальный формат, и помещается в каталог binary/armv7a/gcc/am335x/< EVM >/< application >/< application >_ti.bin (здесь EVM обозначает используемую плату разработки, application это имя приложения.
[Ссылки]
1. AM335X StarterWare Booting And Flashing site:ti.com. 2. StarterWare AM335x: быстрый старт. 3. StarterWare Getting Started 02.00.XX.XX site:ti.com. 4. HP USB Disk Storage Format Tool site:mediafire.com. 5. Процесс загрузки TI CPU.