Blackfin Boot ROM Печать
Добавил(а) microsin   

У всех процессоров 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.