среда, 4 сентября 2013 г.

BeagleBone Black - AM3359 Boot (Initialization)

Сегодня, тема статьи - сплошная теория, поэтому кому не интересно читать многобукав,  те кто считает, что ему это не нужно, могут не читать дальше. Мой друг Руслан (в моём блоге он один из авторов - m68k ), попросил меня описать загрузку МП BBB - AM3359. Эта тема достаточно обширна (в официальной документации от TI она занимает почти 70 страниц). Но общий алгоритм не очень то и сложен.


Общая информация

МП семейства Sitara имеют обширные возможности для загрузки. Причина этого, наличие встроенной в чип (записанной в ПЗУ), программы инициализации. Важно помнить, что МП всегда запускается в защищенном режиме (security mode), и только потом переводится в открытый режим (public mode).
Соответственно у чипа есть два ПЗУ - общая, объемом в 128 КБ в которой по видимому находится сервисный код и открытая (public) объёмом в 48 КБ. В последнюю и записан наш загрузчик (подчёркнуто зелёным):


Загрузчик

Не знаю на чём писали в TI эту подсистему, но в 48 КБ размещен поистине общирный функционал:
В этот функционал включены:

  • Hardware Abstraction Level (HAL) для различной периферии МП используемой при загрузке.
  • Драйвера для основных носителей информации
  • Код высокого уровня, который собственно производит загрузку. Этот код содержит набор функционала для определения типа носителя и высокоуровневых операций с ним. Также, в коде содержится инициализация периферии для работы загрузчика.


Загрузка доступна из следующих источников:

  • MMC/SD - MMC (eMMC)/SD cards, карты и чипы памяти поддерживающие стандарт MMC/SD, используется в BBB: набортный eMMC объёмом 2 ГБ и слот для microSD card.
  • NAND - NAND FLASH накопители самых различных размеров (этот способ загрузки недоступен для BBB - нет носителя)
  • SPI - SPI FLASH накопители (не используется но по идее можно прикрутить, хотя на фоне имеющихся носителей нет необходимости).
  • XIP - NOR FLASH самый быстрый способ загрузки, заключающийся в прямом исполнении кода в носителе, т.е. доступный для памяти с непосредственным доступом (этот способ также не доступен в BBB - нет носителя)
  • UART - возможность загрузки ч/з последовательный порт используя для передачи данных протокол X-modem. Самый старый из всех способов загрузки. Доступен для BBB в случае порчи/отсутсвия загрузчика на eMMC и отсутствия карты в слоте microSD. Также, доступ к этому способу можно получить нажав кнопку пользователя (над слотом для карты памяти) перед подачей питания на плату.
  • EMAC - сетевая загрузка платы, на плату после инициализации возможна загрузка кода по протоколу TFTP (данный способ возможен для BBB после доработки платы - перепайки резисторов конфигурации загрузки)
  • USB - аналогичен EMAC за исключением что сетевая карта виртуальная (usb).
В общем виде алгоритм загрузки выглядит так:
После перехода в к исполнению кода загрузчика (а это происходит только при подаче питания), происходит опрос выводов конфигурации загрузки, после чего в соответствии с ними происходит выбор последовательности действий. Далее идёт обход каждого из пунктов последовательности. В случае удачного завершения загрузки, происходит прыжок на загруженный в ОЗУ код (переход к выполнению загруженного кода), либо в случае неудачи переход к следующему пункту загрузки. Если же пунктов загрузки больше не осталось, то происходит переход в dead loop (Цикл смерти) - бесконечный цикл.

Всего есть 16 выводов конфигурации загрузки (BOOT PINS). Эти выводы разбиты на группы:
  • SYSBOOT[15:14] - отвечают за указания частоты основного кварца. Выставляя эту настройку не забывайте, что в случае её неправильной установки, возможно вообще не будет работать загрузка и загрузчик МП не сможет корректно запустить систему.
  • SYSBOOT[13:12] - по умолчанию оба бита равны 0 и не могут принимать другое значение (зарезервировано)
  • SYSBOOT[11:10] - для XIP эти биты показывают на режим подключения, для NAND они должны быть равны 0.
  • SYSBOOT[9] - для NAND означают включение ECC, для XIP определяют включение WAIT на шине (не актуально для ROM)
  • SYSBOOT[8] - для NAND и XIP определяет ширину шины: 0 для 8 бит и 1 для 16.
  • SYSBOOT[7:6] - для EMAC определят тип интерфейса соединения: 00b для MII, 01b - RMII, 10b - RGMII с внутренней задержкой, 11b - то же самое что и 10b но без задержки.
  • SYSBOOT[5] - включение вывода тактовой частоты ч/з XDMA_EVENT_INTR0: 1 для включения.
  • SYSBOOT[4:0] - выбор последовательностей загрузки. Каждая последовательность состоит из 4 блоков каждый из которых представляет один из способов загрузки. Блоки не повторяются.
Для BBB 16 выводов конфигурации уже заданы схематично (распаяны резисторы определённых номиналов, однако воспользовавшись схемой платы можно изменить режим загрузки, на любой из возможных), единственное исключение составляет вывод SYSBOOT[2] - значение которого по умолчанию 1, но при нажатии пользовательской кнопки над слотом microSD происходит смена значения на 0:



Это позволяет менять последовательности загрузки. Также, необходимо помнить, что выводы конфигурации при старте мультиплексированы с другими функциями назначенными на эти выводы, в частности это общие выводы ввода-вывода (GPIO), а также выходы для контроллера дисплея. Поэтому при подключении любой периферии необходимо помнить об этом.
Итак для BBB доступны 2 последовательности - 11000 при нажатой кнопке и 11100 при не нажатой кнопке:
Итак, судя по данной таблице (на самом деле, это часть полной таблицы из мануала МП расположенной в диапазоне страниц с 4542 по 4547 включительно) у нас доступны следующие способы загрузки:
  • MMC0 - тип загрузки MMC, на нулевом порту у нас находится слот microSD
  • MMC1 - тип загрузки MMC, на первом порту у нас eMMC
  • SPI0 - может и работает (но разработчики платы уверяют что нет), выведен на гребёнку выводов
  • USB0 - тип загрузки USB, устройство определяется как внешняя сетевая карта.
  • UART0 - тип загрузки UART, используется отладочный разъем для последовательного порта, так сказать спасательный круг.
Смысл выбора этих двух режимов следующий - если кнопка не нажата, то загрузка начинается с eMMC, если же нажата, то с microSD. При отсутствии microSD (или же недоступности загрузчика, об этом позднее), начинается ожидание загрузки с портов USB0 или UART0.

Т.к. SPI0 собственно не интересен, да и не нужен, рассмотрим остальные способы загрузки.

MMC

Собственно, как следует из названия режима загрузка будет вестись из MMC. Вообще заявлена загрузка как из RAW, так и поддержка файловой системы FAT 12/16/32 (Внимание в случае форматирования накопителя в системе Linux используйте только FAT16, т.к. получаемый на выходе FAT32 не поддерживается загрузчиком MП).
Схема загрузки:
При входе в режим происходит поиск и инициализация накопителя. В случае удачи, происходит конфигурирование адреса доступа и определение режима носителя.
Для RAW происходит посекторное считывание с определённых адресов. Размер считываемого определён заголовком пакета данных.
Для FAT 12/16/32 происходит определение типа ФС, затем поиск в корневой директории файла с именем MLO, который затем и будет загружен и выполнен.

USB

Данный вид загрузки осуществляется с помощью представления МП как USB-Device типа RNDIS:

Представившись этим устройством, МП ожидает подключения в течении 3-х секунд. (стандартная пауза для нумерации устройств USB), получив одобрение от ПК начинается работа в качестве клиента TFTP (для загрузки необходимо настроить на ПК сервер TFTP):

UART

Самый простой из способов загрузки. Используется UART0 (настройки 115200 бит/c, проверка на четность , 1 стоп-бит, нет контроля скорости потока).
Для передачи образа используется протокол X-modem. Размер пакетов стандартный - 1к (4 кБайт/с).
После приветствия в течении максимум 3 секунд, если хост ответил то загрузчик инициирует приём образа, иначе выход из процедуры приёма. В случае паузы между пакетами более 3 секунд также срабатывает выход из процедуры приёма. При задержках в передаче байт более 2мс в пакете, инициируется повторная передача пакета, также подобное происходит и для пакетов у которых неверная контрольная сумма.

Формат загрузочного образа

Для способов загрузки кроме непосредственного исполнения кода (XIP) используется определённый формат загрузочного образа, состоящий из двух частей - заголовка и исполняемого кода:
Заголовок этого образа также имеет определённый формат:
Заголовок для не XIP образов содержит:

  1. Размер образа в байтах
  2. Адрес загрузки/исполнения
Далее идёт сам исполняемый код.

Исполнение кода

После успешной загрузки образа начинается исполнение кода.
При запуске в регистре r0 процессорного ядра, находится ссылка на сервисную структуру из которой можно узнать о том, кто загрузил этот код, каким образом и почему собственно произошла загрузка:
Старт процессорного ядра происходит в открытом (public) режиме мастера (supervisor). Это означает, что вы имеет права осуществлять любые действия с периферией и ядром системы.

На этом теоретическая часть заканчивается, далее идут примеры работы загрузчика. В качестве демонстрационной платы используется BBB.

Примеры

В качестве примера, рассмотрим загрузку со встроенной eMMC и с microSD card. Также будет продемонстрировано то, как плата выбирает другой способ загрузки из последовательности, в случае неудачи с текущим способом:


При подготовке материалов использовался основной мануал от TI - AM335x ARM® Cortex™-A8 Microprocessors (MPUs) Technical Reference Manual

Комментариев нет:

Отправить комментарий