У всех процессоров Blackfin есть на кристалле встроенная память boot ROM (ПЗУ, содержащее код загрузчика), или загрузчик ROM. Этот загрузчик может загрузить код из различных источников. Файлы, которые загружаются, имеют специальный формат, так называемый формат LDR (подробнее см. [2]). Различные модели процессоров Blackfin имеют разные режимы загрузки (boot modes, сокращенно BMODEs), поэтому для получения подробной информации по возможностям встроенного Boot ROM проконсультируйтесь с даташитом на процессор.
[Режимы загрузки]
Все режимы загрузки подразумевают наличие файла в формате LDR. Есть 2 исключение из этого правила - режим ожидания (Idle mode, поскольку никакой код в действительности не выполняется) и режим пропуска загрузки (Bypass mode, этот режим доступен не на всех моделях процессоров Blackfin).
Имейте в виду, что хотя группа разработчиков Blackfin проверяет работу всех режимов загрузки с точки зрения кремния, но не все режимы загрузки полностью протестированы совместно с open source загрузчиками. Хотя наверняка они все работают, в таблице ниже будут перечислены загрузчики с информацией о тестировании (если код тестировался, то в столбце Тест стоит галочка).
Тест |
Boot Mode |
Описание |
Формат файла |
✔ |
No boot / IDLE |
Не выполнять загрузку, просто выполнить инструкцию IDLE. Режим полезен для восстановления программы через JTAG. |
- |
✔ |
Bypass Boot ROM |
Безусловный переход в первый банк асинхронной памяти по адресу 0x20000000, и инструкции по этому адресу начинают выполняться как программа. |
двоичный |
✔ |
Flash |
Загрузка из 8-битной/16-битной памяти flash, подключенной к первому банку асинхронной памяти по адресу 0x20000000. |
LDR |
✔ |
SPI |
Загрузка из микросхемы памяти, подключенной через SPI (SPI serial flash). |
LDR |
|
SPI Slave |
Внешнее устройство-мастер загружает код через SPI. |
LDR |
|
I2C |
Загрузка из микросхемы памяти, подключенной через I2C/TWI (I2C serial flash). |
LDR |
|
I2C Slave |
Внешнее устройство-мастер загружает код через I2C. |
LDR |
✔ |
UART |
Внешнее устройство-мастер загружает код через UART. |
LDR |
|
RAM |
Выполняется "теплая загрузка" (warm boot) из внешней оперативной памяти (SRAM, SDRAM). |
двоичный |
|
OTP |
Загрузка из встроенной в кристалл однократно программируемой памяти (One-Time-Programmable memory). |
LDR |
✔ |
NAND |
Загрузка из памяти типа NAND flash. |
LDR |
|
FIFO |
Внешнее устройство-мастер загружает код через FIFO. |
LDR |
|
Host DMA |
Внешнее устройство-мастер загружает код через DMA. |
LDR |
[Немного подробностей]
• Выполнение из 16-битной внешней памяти начинается с адреса 0x20000000, с 16-битной упаковкой данных инструкций. Запуск boot-ROM в этом режиме пропускается. Все настройки аппаратуры устанавливаются с расчетом самого медленного устройства памяти (3 цикла hold time, 15 циклов доступа R/W, 4 циклов setup).
• Загрузка из 8- и 16-битной внешней памяти – подпрограмма загрузки из этой памяти размещена в области памяти boot ROM, и использует как источник данных Asynchronous Memory Bank 0. Все настройки аппаратуры устанавливаются в расчете на самое медленное устройство памяти (3 цикла hold time, 15 циклов доступа R/W, 4 циклов setup). Код boot ROM анализирует первый байт по адресу 0x20000000. Если он равен 0x40, то выполняется 8-битная загрузка, если 0x60, то 16-битная [2, 3].
• Загрузка из микросхемы памяти, подключенной через последовательный интерфейс SPI (EEPROM или FLASH). Могут поддерживаться 8-, 16- или 24-битно адресуемые микросхемы памяти, и также поддерживаются микросхемы SPI dataflash.
• Стандартные микросхемы памяти SPI с 8-, 16- и 24-битной адресацией определяются как память, которая получает байт команды 0x03, за которым следуют:
• 1 байт адреса (для микросхем SPI с 8-битной адресацией), • 2 байта адреса (для микросхем SPI с 16-битной адресацией), • или 3 байта адреса (для микросхем SPI с 24-битной адресацией).
• После корректной отправки команды чтения и адреса данные, сохраненные в микросхеме памяти по выбранному адресу, выдвигаются через вывод MISO. Данные посылаются в процессор Blackfin последовательно от этого адреса, с тактированием бит сигналом SCK.
• Микросхемы памяти Data flash могут быть совместимы с микросхемами AT45DB321, AT45DB041, AT45DB081 или AT45DB161 компании Atmel.
• Ознакомьтесь с даташитом на используемый процессор Blackfin, чтобы определить выходной вывод PF, используемый как сигнал выборки (chip select) для микросхемы SPI EEPROM/flash.
• Загрузка под управлением хоста SPI (мастера) – процессор Blackfin работает как подчиненное устройство на шине (SPI slave), и сконфигурирован принимать байты .LDR-файла через SPI, который передает ему мастер. Чтобы приостанавливать передачу хоста, когда boot ROM занят, процессор Blackfin выставляет сигнал на своем специальном выводе, чтобы показать хосту, что пока не нужно посылать новые данные, пока сигнал занятости не будет снят. Этот флаг выбирается пользователем, и эта информация передается процессору Blackfin через биты 8:5 поля FLAG заголовка.
• Загрузка через UART – с использованием последовательности рукопожатия с автоопределением скорости (autobaud handshake sequence) программа, генерирующая форматированный поток загрузки, запускается на компьютере хоста. Хост выбирает скорость передачи UART. Когда выполняется автодетект скорости, UART ожидает появления на выводе RXD символа @ (boot stream) с форматом кадра 8 бит данных, один стоп-бит, без бита четности, и по этому символу вычисляет скорость приема. После этого Blackfin подтверждает коннект 4 байтами: 0xBF, значение UART_DLL, значение UART_DLH (это два регистра, определяющие скорость UART) и байт 0x00. После этого хост может начать передавать поток загрузки. Когда процессору нужно приостановить хост, он снимает сигнал CTS. Таким образом, хост должен мониторить состояние этого сигнала.
• Загрузка из микросхемы памяти, подключенной через I2C/TWI (EEPROM/flash) – процессор Blackfin работает в режиме мастера, и выбирает подчиненное устройство с уникальным идентификатором 0xA0. Процессор последовательно выдает команды чтения в микросхему памяти, начиная с 2-байтного внутреннего адреса 0x0000, после чего данные из микросхемы вдвигаются в процессор. Микросхема памяти I2C/TWI должно быть совместима со стандартом шины Philips I2C версии 2.1, и должна предоставлять функцию автоинкремента адреса в своем внутреннем счетчике адреса, чтобы содержимое памяти можно было вычитывать последовательно.
• Загрузка под управлением хоста I2C – хост I2C/TWI выбирает подчиненное устройство с уникальным идентификатором 0x5F. Процессор отвечает подтверждением, после чего хост может передавать поток загрузки. Хост I2C/TWI должен соответствовать стандарту шины Philips I2C версии 2.1. Может использоваться мультиплексор I2C, чтобы выбрать один процессор из нескольких, когда несколько процессоров загружается через один TWI.
[Память NAND]
Нужно сделать некоторые специальные замечания, когда нужно загрузить напрямую из памяти NAND новые процессоры (такие как BF54x). Blackfin on-chip Boot ROM ожидает размещение блоков ECC/bad в резервной области, отличающееся от обычно используемой загрузчиком U-Boot или Linux.
Все биты в маркере плохого блока должны быть в лог. 1, иначе страница считается плохой.
Легенда на приведенных ниже картах памяти следующая:
Ключ |
Что означает |
BB |
Bad Block, маркер плохого блока. |
NA |
Not Available, маркер недоступен, пропуск блока. |
EC |
Байт ECC (используется в группах 3). |
По умолчанию обычно используется следующее размещение:
00: BB NA NA NA NA NA NA NA
08: NA NA NA NA NA NA NA NA
10: NA NA NA NA NA NA NA NA
18: NA NA NA NA NA NA NA NA
20: NA NA NA NA NA NA NA NA
28: EC EC EC EC EC EC EC EC
30: EC EC EC EC EC EC EC EC
38: EC EC EC EC EC EC EC EC
Однако Blackfin Boot ROM требует следующего размещения:
00: EC EC EC NA NA NA NA NA
08: EC EC EC NA NA NA NA NA
10: EC EC EC NA NA NA NA NA
18: EC EC EC NA NA NA NA NA
20: EC EC EC NA NA NA NA NA
28: EC EC EC NA NA NA NA NA
30: EC EC EC NA NA NA NA NA
38: EC EC EC NA NA NA NA BB
Какие источники загрузки доступны? В этом документе не приведена актуальная привязка между выводами BMODE и маркой процессора. Эту информацию ищите в даташите на процессор. Также имейте в виду, что некоторые режимы могут быть недоступны на всех версия силикона для определенного семейства процессора. Опять-таки за этой информацией обращайтесь к даташиту на процессор.
Boot Mode |
BF52x |
BF53[123] |
BF53[467] |
BF53[89] |
BF54x |
BF561 |
IDLE |
✔ |
|
|
|
✔ |
|
Bypass |
|
✔ |
✔ |
✔ |
|
✔ |
Flash |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
SPI |
✔ |
✔ |
✔ |
✔ |
✔ |
✔ |
SPI Slave |
✔ |
✔ |
✔ |
✔ |
✔ |
|
I2C |
✔ |
|
✔ |
|
✔ |
|
I2C Slave |
✔ |
|
✔ |
|
✔ |
|
UART |
✔ |
|
✔ |
|
✔ |
|
RAM |
✔ |
|
|
|
✔ |
|
OTP |
✔ |
|
|
|
✔ |
|
NAND |
|
|
|
|
✔ |
|
FIFO |
✔ |
|
|
|
✔ |
|
Host DMA |
✔ |
|
|
|
✔ |
|
[Абсолютные адреса подпрограмм Boot ROM]
Boot ROM обычно жестко привязан к адресу 0xEF000000 как память только для чтения в адресном пространстве процессора Blackfin. Эта память может быть прочитана в любом режиме процессора - и в режиме пользователя, и в режиме супервизора. В то время как у старых версий не было вызываемых функций, в новых версиях эта возможность есть. Не все функции ограничены использованием в режиме загрузки, их можно использовать и во время выполнения программы.
Заголовочные файлы Blackfin предоставляют определения как для адресов функций, так и для их C-прототипов. Обратите внимание, что все определяемые макросы начинаются с префикса _BOOTROM_. Так, например, когда в списке ниже Вы видите функцию SPIBOOT, используйте определение _BOOTROM_SPIBOOT.
Для всесторонней информации по этим функциям проконсультируйтесь с разделом "System Reset and Booting" аппаратного руководства на процессор (Hardware Reference Manual, HRM).
Функция |
Адрес |
Описание |
RESET |
0xEF000000 |
Стартовый адрес при сбросе |
FINAL_INIT |
0xEF000002 |
Адрес перехода в EVT1 |
PDMA |
0xEF000004 |
Загрузка блока LDR через периферийное DMA |
MDMA |
0xEF000006 |
Загрузка блока LDR через DMA памяти |
MEMBOOT |
0xEF000008 |
Загрузка LDR из внешней памяти |
TWIBOOT |
0xEF00000C |
Загрузка LDR из I2C |
SPIBOOT |
0xEF00000A |
Загрузка LDR из SPI |
/* зарезервировано */ |
0xEF00000E |
|
GET_DXE_ADDRESS_FLASH |
0xEF000010 |
Унаследовано: выборка адреса из Flash |
GET_DXE_ADDRESS_SPI |
0xEF000012 |
Унаследовано: выборка адреса из SPI |
GET_DXE_ADDRESS_TWI |
0xEF000014 |
Унаследовано: выборка адреса I2C |
/* зарезервировано */ |
0xEF000016 |
|
OTP_CONTROL |
0xEF000018 |
Инициализация и управление для памяти OTP |
OTP_READ |
0xEF00001A |
Чтение памяти OTP |
OTP_WRITE |
0xEF00001C |
Запись памяти OTP |
ECC_TABLE |
0xEF00001E |
|
BOOTKERNEL |
0xEF000020 |
Внутренняя точка входа для boot kernel |
GETPORT |
0xEF000022 |
|
NMI |
0xEF000024 |
Обработчик по умолчанию для NMI |
HWERROR |
0xEF000026 |
Обработчик по умолчанию для аппаратной ошибки |
EXCEPTION |
0xEF000028 |
Обработчик по умолчанию для исключения |
CRC32 |
0xEF000030 |
Вычисление CRC32 для области памяти |
CRC32POLY |
0xEF000032 |
Генерация таблицы просмотра из полинома CRC32 |
CRC32CALLBACK |
0xEF000034 |
Вход в функцию обратного вызова для CRC32 |
CRC32INITCODE |
0xEF000036 |
Инициализация подпрограмм CRC32 |
SYSCONTROL |
0xEF000038 |
Управление питанием и сбросом |
VERSION |
0xEF000040 |
Информация о версии Boot ROM |
[Исходный код]
Исходный код для Boot ROM обычно поставляется вместе с VisualDSP.
[Ссылки]
1. Blackfin Boot ROM site:blackfin.uclinux.org. 2. Blackfin: утилита elfloader.exe. 3. Как происходит загрузка ADSP-BF533 Blackfin. |