На сайте uclinux.org [1] описано несколько способов готовых загрузчиков для Blackfin, поддерживаемых uclinux:
Boot ROM. Стандартная опция для загрузки - встроенное в кристалл процессора Blackfin ПЗУ с кодом загрузчика (on-chip bootrom). Das U-Boot. Расширяемый, портируемый и конфигурируемый загрузчик. MicroMonitor. Бесплатная платформа загрузки для встраиваемых систем.
Также это может быть и самописный загрузчик [4]. Ниже показан общий обзор того, что происходит при включении питания/сбросе типовой системы на основе процессора Blackfin.
1. При включении питания процессоре переходит в режим супервизора на уровне приоритета прерывания IVG5.
I. Если происходит пропуск загрузки (bypass), то выполнение кода начинается с адреса 0x20000000 (первый банк асинхронной памяти).
II. Если активируется встроенный загрузчик, то код начинает выполняться с адреса 0xEF000000 (Boot ROM [2]).
2. Начинает выполняться код Boot ROM.
I. Проверяются логические уровни на выводах BMODE (они определяют режим загрузки процессора [3]).
II. Проверяется память OTP (если она доступна).
III. Конфигурируется выбранный источник загрузки.
IV. Загружается LDR (что такое LDR и его формат описано в статье [4]) из выбранного источника, и выполняется код инициализации (init section).
• Перепрограммируется тактирование процессора (SCLK, CCLK). • Инициализируется память SDRAM (если она присутствует). • Происходит возврат в Boot ROM.
V. Загружается остальная часть приложения во внутреннюю и внешнюю память (если это необходимо).
• Обычно этим приложением служит загрузчик Das U-Boot. • Или это может быть MicroMonitor. • Это может быть обычная встроенная программа (на основе VDK, другой RTOS или просто приложение с одним потоком и прерываниями). • Это может быть ядро Linux.
VI. Происходит переход на начало приложения.
3. Если не приложение, то на этом шаге работает так называемый загрузчик второй стадии (2nd stage boot loader, Das U-Boot или MicroMonitor).
I. Выполняется любое необходимое перераспределение памяти.
II. Опционально выполнение кода переводится на более низкий уровень приоритета IVG15.
III. Инициализируются устройства (встроенные в процессор, внешние, и т. д.).
IV. Выполняется последовательность команд:
a. Настройка рабочего окружения (setup environment). b. Загрузка приложения. Это может происходит из источника, который поддерживает загрузчик (локальная сеть, SPI Flash, NOR Flash, NAND Flash, HDD, флешка USB, привод CD-ROM, последовательный порт UART, и т. д.). c. Подготовка приложения к запуску (перераспределение памяти, распаковка). d. Запуск приложения на выполнение.
• Это может быть обычная встроенная программа (на основе VDK, другой RTOS или просто приложение с одним потоком и прерываниями). • Также это может быть uC/OS. • Это может быть и приложение U-Boot. • Если это ядро Linux, тогда:
4. Загружается Linux.
I. Инициализируются устройства (встроенные в процессор, внешние, и т. д.).
II. Запускаются приложения уровня пользователя.
5. Возврат на верхний уровень:
I. Если приложение не уничтожило содержимое областей памяти, где находится U-Boot, то приложение может вернуть управление в U-Boot.
II. Выполняется программный сброс системы (software system reset) для возврата в Boot ROM.
[Ссылки]
1. Blackfin Bootloaders site:blackfin.uclinux.org. 2. Blackfin Boot ROM. 3. Как происходит загрузка ADSP-BF533 Blackfin. 4. Blackfin: практическая реализация загрузчика (bootloader). 5. Blackfin: утилита elfloader.exe. |