Здесь приведен перевод раздела "Operating Modes And States" документа [1], где рассказывается о различных режимах работы и особенностях сброса аппаратуры процессоров Blackfin компании Analog Devices. Непонятные термины и сокращения см. в разделе "Словарик" статьи [6].
Процессор Blackfin поддерживает следующие режимы:
• User mode (режим выполнения кода пользователя) • Supervisor mode (режим супервизора) • Emulation mode (режим эмуляции)
В режимах Emulation и Supervisor доступ к ресурсам ядра ничем не ограничен. В режиме User к определенным ресурсам доступ ограничивается, что может быть использовано для защиты рабочего окружения выполняемого кода.
Режим User считается доменом (областью действия) программ приложения. Режимы Supervisor и Emulation обычно резервируются для кода ядра операционной системы.
Примечание: это не всегда так, зависит от реализации операционной системы. Так, к примеру, код задач проектов VDK (а это операционная система реального времени, RTOS) выполняется в режиме супервизора. Таким образом, код приложения VDK ничем не ограничен в доступе к ресурсам. VDK имеет свою собственную библиотеку для управления ресурсами и прерываниями [2].
Режим процессора определяется контроллером событий (Event Controller [3]). Когда обрабатывается обычное прерывание, не маскируемое прерывание (nonmaskable interrupt, NMI) или исключение (exception), процессор находится в режиме Supervisor. Когда обрабатывается событие эмуляции (emulation event, активизация отладчика JTAG), процессор находится в режиме Emulation. Когда не обрабатываются события, процессор находится в режиме User. Это стандартная модель поведения системы.
Текущий режим процессора может быть идентифицирован с помощью опроса регистра IPEND, как показано в таблице 3-1.
Следует иметь в виду, что IPEND относится к регистрам, отображенным на память процессора (memory-mapped register, MMR), а регистры MMR не могут быть прочитаны в режиме User.
Таблица 3-1. Идентификация текущего режима (Mode) процессора в зависимости от события (Event).
Event
Mode
IPEND
Interrupt
Supervisor
≥ 0x10, но IPEND[3:0] = b#000.
Exception
≥ 0x08 Ядро обрабатывает событие исключения, если IPEND[3:0] = b#1000, и IPEND[15:4] нули или единицы.
NMI
≥ 0x04 Ядро обрабатывает событие не маскируемого прерывания, если IPEND[2:0] = b#100, и IPEND[15:3] нули или единицы.
Reset
=0x02 Как только произошел выход из состояния сброса, IPEND устанавливается в значение 0x02, и код по вектору сброса работает в режиме супервизора.
Emulation
Отладка (JTAG)
=0x01 Процессор находится в режиме эмуляции, если IPEND[0] = 1, независимо от состояния бит IPEND[15:1].
None (нет события)
User
=0x00
Дополнительно процессор поддерживает следующие 2 режима, в которых не выполняется код:
• Idle state (состояние ожидания) • Reset state (состояние сброса)
Рис. 3-1 иллюстрирует режимы и состояния процессора, как и условия перехода между ними.
Рис. 3-1. Режимы и состояния процессора.
Примечание (1): нормальный выход из Reset в режим Supervisor. Однако аппаратура эмуляции также может инициировать сброс, и если это так, то выход из сброса приведет к переходу в режим Emulation.
[User Mode]
Процессор находится в режиме пользователя (User mode), когда он не находится в состоянии сброса (Reset) или ожидания (Idle), и когда он не обрабатывает событие обычного прерывания, прерывания NMI, событие исключения или эмуляции. User mode используется для обработки кода уровня приложения, который не требует исключительного доступа к системным регистрам. Любая попытка доступа к ограниченным системным регистрам приведет к событию исключения (exception event). Таблица 3-2 перечисляет регистры, которые могут быть доступны в режиме пользователя.
Таблица 3-2. Регистры, к которым возможен доступ в User Mode.
Защищенные ресурсы и инструкции. Системные ресурсы состоят из подмножества регистров процессора, всех MMR, и из подмножества защищенных инструкций. Эти MMR системы и ядра начинаются с адреса 0xFFC0 0000. Этот регион памяти защищен от доступа в режиме пользователя. Любая попытка доступа к области MMR в режиме пользователя приведет к исключению (exception).
Список защищенных инструкций приведен в таблице 3-3. Любая попытка вызвать защищенную инструкцию в режиме пользователя приведет к событию исключения (exception event).
Таблица 3-3. Защищенные инструкции.
Инструкция
Описание
RTI
Возврат из прерывания (Interrupt).
RTX
Возврат из исключения (Exception).
RTN
Возврат из не маскируемого прерывания (NMI).
CLI
Запрет прерываний.
STI
Разрешение прерываний.
RAISE
Генерация прерывания или сброса.
RTE
Возврат из эмуляции. Приводит к исключению, если выполняется не в режиме Emulation.
Защищенная память. В режиме пользователя могут быть защищены от доступа дополнительные ячейки памяти. Для этой цели может быть создана и разрешена запись Cacheability Protection Lookaside Buffer (CPLB). Подробнее см. раздел "Memory Management Unit" в документе [1] (также см. [4, 5]).
Вход в User Mode. Когда происходит выход из сброса, процессор находится в режиме Supervisor, потому что он обрабатывает событие сброса (reset event). Чтобы войти в режим User из состояния Reset, должны быть выполнены 2 шага. Во-первых, адрес возврата должен быть загружен в регистр RETI. Во вторых, должна быть выполнена инструкция RTI. Следующий пример кода показывает, как войти в режим пользователя после сброса.
//Листинг 3-1. Вход в User Mode из Reset.
P1.L = lo(START); // Указывает на начало кода пользователя.
P1.H = hi(START); //
RETI = P1;
RTI; // Возврат из события сброса (Reset Event)
START:// Поместите сюда код пользователя.
Инструкции возврата, которые вовлекают вход в User Mode. В таблице 3-4 суммарно приведены инструкции возврата, которые могут использоваться для вовлечения режима пользователя из различных подпрограмм обработчиков системных событий процессора. Когда эти инструкции используются в обработчиках прерывания (ISR), значение адреса возврата должно быть предварительно сохранено в соответствующем регистре события RETx. В случае ISR, если этот ISR может быть прерван другим ISR, адрес возврата сохраняется в стеке. Для этого случая адрес может быть найден путем выталкивания из стека (POP) в регистр RETI. Как только RETI загружен, может вызвана инструкция RTI.
Обратите внимание, что выталкивание из стека является опциональным (не обязательным). Если регистр RETI не сохранен/восстановлен (для него не было последовательности PUSH/POP), то ISR становится не прерываемым, потому что адрес возврата не был сохранен в стек.
Процессор остается в режиме пользователя, пока не произойдет одно из следующих событий:
• Событие прерывания, NMI или исключения приведут к входу в режим Supervisor. • Событие эмуляции переведет процессор в режим Emulation. • Событие сброса переведет процессор в состояние Reset.
Таблица 3-4. Инструкции возврата, которые могут вовлекать User Mode.
Активность текущего процесса
Инструкция возврата
Выполнение продолжится по адресу из регистра
Interrupt Service Routine (обработчик прерывания, ISR)
RTI
RETI
Exception Service Routine (обработчик исключения)
RTX
RETX
Обработчик не маскируемого прерывания (NMI).
RTN
RETN
Emulation Service Routine (обработчик эмуляции)
RTE
RETE
[Supervisor Mode]
Процессор обслуживает все события прерываний, NMI и исключений в режиме супервизора (Supervisor).
Режим Supervisor имеет полный, не ограниченный доступ ко всем системным ресурсам процессора, включая все ресурсы эмуляции, если не были разрешены и сконфигурированы записи CPLB [5]. Только режим супервизора может использовать псевдоним регистра USP (User Stack Pointer), который ссылается на память стека пользователя. Этот псевдоним регистра необходим, потому что в режиме Supervisor имя регистра SP относится к указателю стека ядра (kernel stack pointer) вместо указателя стека пользователя.
При выходе из состояния Reset нормальная обработка начинается в режиме Supervisor. Снятие сигнала сброса RESET переключает процессор из состояния Reset в режим Supervisor, где процессор остается, пока событие эмуляции или инструкция возврата не приведет к смене режима. Перед выдачей инструкции возврата в регистр RETI должен быть загружен правильный адрес, куда будет осуществлен переход при возврате.
Рабочее окружение обычного приложения. Когда выполняется программа не в условиях операционной системы (Non-OS Environments), то код приложения должен оставаться в режиме Supervisor, чтобы он мог получить доступ ко всем ресурсам ядра и системы. Когда снят сигнал RESET, процессор инициирует свою работу в обработчике события сброса (обычно это адрес 0xFFA00000). Только событие эмуляции может перехватить эту активность процессора. Таким образом, более низкоуровневые события не могут быть обработаны.
Одним из способов, которым можно удержать процессор в режиме Supervisor, и разрешить при этом обработку событий, является способ настроить и вызвать самое низкоуровневое прерывание (IVG15). События и прерывания подробнее описаны в разделе "Events and Interrupts" документа [1] (также см. [3]). После того, как было вызвано низкоуровневое прерывание командой RAISE 15, в регистр RETI может быть загружен адрес возврата, который указывает на код пользователя, который будет выполняться до тех пор, пока не будет вызвано прерывание IVG15. После загрузки RETI может быть выполнена инструкция RTI для возврата из события сброса.
Обработчик прерывания IVG15 может быть настроен для перехода в адрес начала приложения пользователя. Дополнительная команда RTI не требуется. В результате процессор остается в режиме Supervisor, потому что остается установленным IPEND[15]. Начиная с этого момента процессор обрабатывает прерывание самого нижнего уровня. Это гарантирует, что могут обрабатываться прерывания всех более высоких уровней.
Как оставить режим Supervisor при выходе из сброса. Ниже дан код примера, который позволяет выполнять код приложения в режиме Supervisor.
//Листинг 3-2. Сохранение Supervisor Mode при выходе из Reset.
P0.L = lo(EVT15); // Указывает на IVG15 в таблице векторов
P0.H = hi(EVT15); // прерываний (Event Vector Table, EVT)
P1.L = lo(START); // Указывает на начало кода пользователя
P1.H = hi(START); //
[P0] = P1; // Размещение адреса START в IVG15 EVT
P0.L = lo(IMASK);
R0 = [P0];
R1.L = lo(EVT_IVG15);
// Установка бита IVG15 (разрешение прерывания) в регистре IMASK.
R0 = R0 | R1;
[P0] = R0;
RAISE 15; // Запуск прерывания IVG15
P0.L = lo(WAIT_HERE);
P0.H = hi(WAIT_HERE);
RETI = P0; // В RETI загружен адрес возврата
RTI; // Возврат из Reset Event
// Бесконечный цикл ожидания, пока обрабатывается прерывание IVG15:
WAIT_HERE:
JUMP WAIT_HERE;
// Сюда указывает вектор прерывания IVG15:
START:// Разрешение прерывания и сохранение адреса возврата в стеке,// это разрешить обработку других прерываний в системе:
[--SP] = RETI;
// Далее идет код приложения пользователя, который работает// в режиме супервизора процессора:
...
[Emulation Mode]
Процессор входит в режим эмуляции (Emulation), если разрешен режим эмуляции, и удовлетворено одно из условий:
• Произошло событие внешней эмуляции (external emulation event). Оно вызывается подключением отладчика через интерфейс JTAG. • Выполнена инструкция EMUEXCPT.
Процессор остается в режиме Emulation, пока обработчик события эмуляции не выполнит инструкцию RTE. Если нет ожидающих обработки прерываний, когда выполнится инструкция RTE, то процессор перейдет в режим пользователя (User mode). Иначе процессор переключится в режим Supervisor для обработки прерывания.
Режим Emulation самый высокий по приоритету, и в нем процессор имеет неограниченный доступ ко всем системным ресурсам.
[Idle State]
Состояние ожидания (Idle state) останавливает активность процессора по усмотрению пользователя, что обычно используется для экономии энергии источника питания, когда наблюдается затишье в активности. В этом состоянии никакие инструкции кода не обрабатываются. Состояние Idle запускается инструкцией IDLE, она оповещает аппаратуру процессора, что запрашивается вход в режим ожидания.
Процессор остается в состоянии Idle до того момента, когда какое-либо периферийное устройство, такое как SPORT или часы реального времени (Real-Time Clock, RTC), сгенерируют прерывание, требующее обработки.
Примечание: система DMA в состоянии Idle не работает, что довольно печально.
В листинге 3-3 прерывания ядра запрещаются, и выполняется инструкция IDLE. Когда завершены все ожидающие обработки процессы, ядро запрещает работу своих тактов. Поскольку прерывания запрещены, состояние Idle может быть прервано выставлением сигнала WAKEUP. Для дополнительной информации см. описание регистров SIC_IWR в документе [1]. Если это необходимо для работы, для выхода из Idle кроме сигнала WAKEUP также могут быть разрешены прерывания.
Когда выставлен сигнал WAKEUP, процессор просыпается, и инструкция STI снова разрешает прерывания.
//Листинг 3-3. Демонстрация перехода в Idle State.
CLI R0; // Запрет прерываний.
IDLE; // Опустошение конвейера и отправка ядра в состояние IDLE.
STI R0; // Разрешение прерываний после пробуждения.
[Reset State]
Состояние сброса (Reset State) инициируется логикой процессора. Во время состояния сброса программа приложения и операционная система не выполняют код, и тактирование остановлено.
Процессор остается в состоянии Reset, пока внешняя логика удерживает в активном состоянии внешний сигнал RESET. После того, как этот сигнал снят, процессор завершает последовательность сброса и переключается в режим Supervisor, где он выполняет код, находящийся по вектору сброса (reset event vector).
Программное обеспечение в режиме Supervisor или Emulation может запустить состояние Reset без вовлечения установки внешнего сигнала RESET. Это можно сделать выдачей версии инструкции RAISE, предназначенной для сброса.
Программа приложения в режиме пользователя (User mode) не может вызвать состояние Reset, кроме использования системного вызова, который предоставляется ядром операционной системы специально для этой цели. В таблице 3-5 суммарно показано состояние процессора при сбросе.
Таблица 3-5. Состояние процессора при сбросе.
Элемент
Описание состояния сброса
Ядро
Рабочий режим
Supervisor в обработчике события сброса, тактирование остановлено.
Режим округления
Не смещенное округление (Unbiased Rounding).
Cycle Counters (счетчики тактов)
Запрещены и обнулены.
Регистры DAG (генераторы адреса I, L, B, M)
Случайные значения (должны быть очищены при инициализации).
Определяются уровнями на выводах BMODE в момент сброса.
Выбор тактовой частоты MSEL
См. описание поля MSEL регистра PLL_CTL руководства по Вашему процессору, где описано состояние этих бит по умолчанию.
PLL Bypass Mode (пропуск системы ФАПЧ при формировании тактовых частот)
Запрещено.
Соотношение частот VCO/ядра
См. описание поля CSEL регистра PLL_DIV руководства по Вашему процессору, где описано состояние этих бит по умолчанию.
Тактирование периферийных устройств
Запрещено.
[Системный сброс и включение питания]
В таблице 3-6 показано 5 типов сброса. Обратите внимание, что все сбросы, кроме системного программного (System Software), сбрасывают ядро процессора.
Таблица 3-6. Виды сброса.
Тип сброса
Источник
Результат
Hardware Reset
Активный импульс на выводе RESET приводит к аппаратному сбросу.
Сброс ядра и периферийных устройств, включая контроллер динамического управления питанием Dynamic Power Management Controller (DPMC). Сбрасывает No Boot бита Software Reset регистра SYSCR (см. ниже описание этого регистра).
System Software Reset
Запись b#111 в биты [2:0] системного MMR-регистра SWRST по адресу 0xFC00 0100 приводит к программному сбросу.
Сбрасываются только периферийные устройства, кроме RTC (часы реального времени) и DPMC (контроллер динамического управления питанием). DPMC сбрасывает только No Boot в бите Software Reset регистра SYSCR. Ядро не сбрасывается. Процесс загрузки не инициируется.
Watchdog Timer Reset
Программирование сторожевого таймера
То же самое, что и аппаратный сброс, но сторожевой таймер не работает, если процессор находится в режиме сна (Sleep mode). Может быть прочитан регистр SWRST, чтобы определить, чем был вызван сброс.
Core Double-Fault Reset
Если это разрешено битом DOUBLE_FAULT регистра SWRST, этот сброс происходит, когда ядро входит в состояние double-fault.
То же самое, что и аппаратный сброс. Может быть прочитан регистр SWRST, чтобы определить, чем был вызван сброс.
Core-Only Software Reset
Этот сброс осуществляется выполнением инструкции RAISE 1 или установкой бита Software Reset (SYSRST) в регистре управления отладкой (DBGCTL). Регистр DBGCTL ядро не видит, он доступен только для программного обеспечения эмулятора через порт JTAG.
Сбрасывается только ядро. Периферийные устройства этот сброс не распознают.
Hardware Reset. Аппаратный сброс кристалла процессора (Hardware Reset) является асинхронным событием. Чтобы сброс успешно завершился, входной сигнал RESET должен быть переведен из активного уровня в неактивное. Для дополнительной информации см. даташит на используемый процессор.
Аппаратно-инициированный сброс влияет на всю систему процессора целиком, включая ядро и периферийные устройства. После того, как снят сигнал сброса с вывода RESET, процессор гарантирует, что все асинхронные периферийные устройства распознали и завершили свой сброс. После сброса процессор переходит к выполнению последовательности загрузки кода (Boot mode sequence), которая сконфигурирована состоянием выводов BMODE [7].
Выводы корпуса BMODE специально предназначены для выбора режима загрузки процессора. Они не выполняют никаких других функций, кроме как эти выводы должны постоянно подтянуты к уровням VDD или VSS. Эти выводы и соответствующие биты регистра SYSCR конфигурируют режим загрузки, который работает после аппаратного сброса (hardware reset) или программного сброса системы (System Software). Подробнее см. описание "Reset Interrupt" и таблицу 4-12 документа [1].
Регистр SYSCR. Значения, которые были прочитаны с выводов BMODE при сбросе, зеркально отображаются в битах регистра конфигурации системного сброса (System Reset Configuration register, сокращенно SYSCR). Эти значения доступны для программного доступа и модификации после выполнения последовательности аппаратного сброса. Из SYSCR различные конфигурационные параметры переносятся в соответствующие места. Для получения подробной информации обратитесь к главе с описанием сброса и загрузки (Reset and Booting) руководства используемого процессора (также см. [7]).
Рис. 3-2. Регистр System Reset Configuration (SYSCR). Значения бит, помеченных крестиками X, инициализируется от внешних выводов режима загрузки BMODE1 и BMODE0 процессора в момент аппаратного сброса (см. [7]).
Виды программного сброса и сторожевой таймер. Программный сброс (Software Reset) может быть инициирован тремя способами:
• С помощью сторожевого таймера (Watchdog Timer), если он был правильно сконфигурирован. • Установкой поля сброса системы (биты System Reset) в регистре программного сброса (см. рис. 3-3). • Инструкцией RAISE 1.
Сторожевой таймер сбрасывает как ядро, так и периферийные устройства. Системный сброс (System Reset) приводит к сбросу периферийных устройств без сброса ядра и без инициирования последовательности загрузки (booting sequence).
System Reset должен быть выполнен, когда код выполняется из памяти L1 (используемой либо как кэш, либо как SRAM). Когда память инструкций L1 сконфигурирована как кэш, гарантируйте, что последовательность кода System Reset прочитана в кэш.
После сброса, инициированного либо сторожевым таймером Watchdog Timer, либо System Reset, процессор гарантирует, что все асинхронные периферийные устройства распознали и завершили сброс.
Для сброса, инициированного сторожевым таймером, процессор переходит к выполнению Boot mode sequence, и находится в состоянии полного включения (Full-On) или режиме активности (Active mode). Режим загрузки (Boot mode) конфигурируется состоянием битов управления BMODE и NOBOOT (no boot при программном сбросе).
Если очищен бит NOBOOT в регистре SYSCR, последовательность сброса определяется битами управления BMODE. Обратите внимание, что устройство регистра SYSCR может меняться между семействами процессоров. Специфику реализации см. в руководстве по аппаратному устройству (hardware reference manual) Вашего процессора.
Регистр SWRST. Программный сброс (software reset) может быть инициирован установкой поля System Reset в регистре программного сброса (Software Reset register, SWRST, см. рис. 3-3). Бит 15 этого регистра показывает, был ли программный сброс с момента последнего чтения SWRST. Биты 14 и 13 соответственно показывают, был ли сброс вызван Watchdog Timer или ошибкой Core Double Fault. Биты [15:13] доступны только для чтения, и автоматически очищаются после того, как прочитан регистр SWRST. Биты [3:0] доступны на чтение и запись.
Когда выводы BMODE не установлены в b#00, и установлен бит No Boot в регистре SYSCR, процессор начинает выполнение кода от начала внутренней памяти L1 (работа загрузчика boot ROM отменяется). В этой конфигурации ядро начинает выборку инструкций от начала памяти L1, находящейся на кристалле процессора.
Когда биты BMODE установлены в b#00, при установленном бите No Boot в регистре SYSCR ядро начинает выборку инструкций с адреса 0x2000 0000 (начало банка 0 асинхронной памяти ASYNC Bank 0, обычно это память FLASH).
Рис. 3-3. Регистр Software Reset (SWRST).
Software Reset. Программный сброс (Software Reset) инициируется выполнением инструкции RAISE 1 или установкой бита Software Reset (SYSRST) в регистре управления отладкой (Debug Control register, DBGCTL) программным обеспечением эмулятора через порт JTAG (регистр DBGCTL не виден на карте памяти процессора).
На некоторых процессорах программный сброс влияет только на состояние ядра. На других процессорах код загрузки (boot ROM) немедленно сбрасывает систему, когда он выполняется из-за программного сброса. Обратите внимание, что состояние системных ресурсов может быть неопределенным, либо они могут находиться в ненадежном состоянии, это может зависеть от активности системы в момент сброса.
Ядро и системный сброс (Core and System Reset). Для выполнения сброса системы и ядра используйте последовательность кода, показанную в Листинге 3-4. Как описано в комментариях, system soft reset занимает по длительности 5 тактов системной шины, поэтому для завершения сброса требуется некая задержка, выполненная в виде организации цикла. Этот код должен находится в памяти L1, чтобы программный сброс системы смог сработать правильно.
//Листинг 3-4. Сброс ядра и системы (Core and System Reset).// Выдача программного сброса системы (system soft reset).
P0.L = LO(SWRST);
P0.H = HI(SWRST);
R0.L =0x0007;
W[P0] = R0;
SSYNC;
// Ожидание завершения System reset (требует 5 периодов SCLK)// Если предположить самый крайний случай соотношения CCLK:SCLK (15:1),// для счетчика циклов будет использоваться число 5*15 = 75.
P1 =75;
LSETUP(start, end) LCO = P1;
Имейте в виду, что точное поведение при сбросе и используемые для этого инструкции могут меняться в зависимости от типа процессора. Последовательность кода в Листинге 3-4 рекомендуется только для устройств, в которых не реализована API-функция bfrom_SysControl() в ПЗУ процессора (ROM).
• Выполнение RAISE 1 не выставляет напрямую сброс ядра. Эта инструкция просто создает прерывание уровня 1 (interrupt level 1). • Используйте EVT1 для вектора прерывания RAISE 1, что разрешается очисткой бита 15 регистра EVT_OVERRIDE.
Прерывания уровня 1 будут использовать бит 15 регистра EVT_OVERRIDE, чтобы определить EVT1 или сброс шины адреса на выводах ядра будут использоваться как место размещения вектора.
Если в приложении нужен функционал RAISE 1, то для стандартной работы подразумевается следующее программное управление:
• После загрузки EVT1 программируется на место размещения ISR для программной обработки interrupt level 1. • Очищен бит 15 в регистре EVT_OVERRIDE. • Когда выполняется RAISE 1:
- Код ISR проходит через соответствующие механизмы через RCU (Reset Core Unit), чтобы выключить все интерфейсы ядра. - Затем RCU сбрасывает ядро. Ядро это увидит как внешний сброс.
[Методы загрузки Blackfin]
Внутреннее ПЗУ процессора (boot ROM) содержит маленькое загрузочное ядро, загрузчик (boot kernel), запуск которого можно либо пропустить, либо его можно использовать для загрузки кода пользователя из устройства внешней памяти, см. таблицу 4-10.
Таблица 4-10. Адреса векторов сброса.
Источник загрузки
BMODE[1:0]
Стартовый адрес
Выполнение кода из внешней 16-битной памяти
00
0x20000000
Загрузка из параллельной внешней памяти FLASH разрядностью 8 или 16 бит.
01
0xEF000000
Загрузка с получением данных от хоста, режим подчиненного устройства (SPI slave mode)
10
Загрузка из 8-, 16- или 24-битной внешней памяти SPI EEPROM (SPI master mode)
11
Boot kernel читает состояние внешних выводов процессора BMODE[1:0] в момент сброса, чтобы идентифицировать источник загрузки (см. таблицу 4-7 в документации на процессор или в статье [3]). В режиме загрузки boot mode 0 процессор устанавливается на выполнение кода из 16-битной внешней памяти, находящейся по адресу 0x20000000 (ASYNC bank 0).
Доступно несколько методов загрузки, с помощью которых код пользователя может быть загружен в оперативную память из внешней памяти или из данных, передаваемых хостом (в этом последнем случае активен режим загрузки SPI slave mode, в котором процессор Blackfin ведет себя как подчиненное устройство SPI, принимая данные загрузки от другого процессора). В этих режимах загрузки boot kernel настраивает выбранное периферийное устройство, откуда будет идти загрузка, базируясь на логических уровнях внешних выводов BMODE[1:0] процессора (см. таблицу 1 из статьи [7]).
В каждом из режимов загрузки код пользователя из устройства памяти помещается в начальную область памяти L1, также могут быть загружены и другие области памяти, например SDRAM. Информация, какие данные должны быть загружены по какому адресу, берется из данных загрузки (loader file). Boot kernel завершает процесс загрузки переходом в начало памяти инструкций L1. После этого процессор начинает выполнение кода с этого адреса.
Если происходит загрузка через последовательный периферийный интерфейс (SPI0), то вывод порта GPIO PF2 используется как сигнал выборки (SPI-chip select), этот вывод должен быть правильно подсоединен.
Core-only software reset также перенаправляет ядро на boot ROM. Такой сброс сбрасывает только ядро, не влияя на остальную часть системы. Boot ROM kernel определяет в момент программного сброса по битам SYSCR, что произошел software reset, чтобы избежать инициации. Если этот бит установлен при software reset, то процессор пропускает нормальный процесс загрузки, переходит в начало памяти L1 и начинает оттуда выполнение кода.
В режиме загрузки из FLASH (flash boot mode, BMODE = 01) boot kernel ожидает следующие рабочие условия:
• Разрешен банк 0 асинхронной памяти (AMB0). • Для банка AMB0 разрешена 16-битная упаковка данных. • Сигнал готовности банка (bank 0 RDY) установлен в активную лог. 1. • Время удержания банка (bank 0 hold time, сигнал чтения/записи снимается для снятия AOE) = 3 цикла. • Времена доступа чтения/записи банка (bank 0 read/write access times) = 15 циклов.
Для режима загрузки SPI master (BMODE = 11) boot kernel подразумевает, что скорость передачи SPI0 составляет 500 кГц. Поддерживаются микросхемы SPI serial EEPROM с разрядностью 8, 16 и 24 бита. SPI использует ножку выхода PF2, чтобы выбрать одну микросхему SPI EEPROM. Контроллер SPI0 отправляет последовательные команды чтения по адресам 0x00, 0x0000 и 0x000000, пока не будет детектировано допустимое устройство памяти EEPROM разрядностью 8, 16 или 24 бита. Затем он начнет вычитывать данные и помещать их в начало памяти L1.
Вывод MISOx должен быть подтянут к лог. 1 для режима загрузки SPI master (BMODE = 11).
Для каждого из режимов загрузки сначала из внешнего устройства памяти вычитывается 10-байтный заголовок. Этот заголовок задает количество передаваемых байт и адрес назначения (куда должны быть записаны загружаемые данные). После того, как все блоки загружены, выполнение программы начинается от начала памяти инструкций L1 SRAM.
Для режима загрузки SPI slave (BMODE = 10) предполагается, что используется аппаратная конфигурация, показанная на рис. 3-4.
Рис. 3-4. SPI Slave Boot Mode.
Определяемая пользователем ножка порта ввода/вывода GPIO PFx работает как выход процессора Blackfin и вход процессора хоста. Этот вывод позволяет удерживать процессор хоста от отправки новых данных, когда данные помещаются в нужные секции памяти в процессе загрузки. Когда сигнал на этом выводе снимается, хост может продолжить отправлять данные загрузчику Blackfin.