Программирование ARM Процесс загрузки TI CPU Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Процесс загрузки TI CPU Печать
Добавил(а) microsin   

Загрузка ядра Linux на встраиваемой системе это не простой перевод программного счетчика процессора на место нахождения ядра в памяти и запуск кода на выполнение. В этой статье (перевод [1]) дан обзор четырем стадиям работы программного обеспечения загрузчика (bootloader software), которые должны выполняться перед тем, как будет загружено ядро Linux и устройство заработает.

AM335x это сложное аппаратное устройство, но с ограниченной внутренней памятью RAM (128 килобайт). Из-за этого ограниченного размера оперативной памяти (ОЗУ) понадобилось ввести несколько стадий загрузки. На этих стадиях загрузки постепенно разблокируется полный функционал устройства, чтобы для ядра Linux раскрылись все необходимые функциональные возможности аппаратуры.

У AM335x имеется 4 отдельные стадии загрузки (bootloader stages):

1. ROM (или Boot ROM - код в ПЗУ, находящемся на кристалле процессора).
2. SPL (сокращение от Secondary Program Loader, вторичный загрузчик программы).
3. U-BOOT (GNU-загрузчик, широко используемый в среде встраиваемых систем Linux).
4. Linux Kernel (ядро операционной системы).

AM335x boot order

[1-я стадия загрузки: Boot ROM]

Код первой стадии загрузки находится в ПЗУ процессора (ROM bootloader, или Boot ROM). Этот код - самое первое, что получает управление после сброса процессора или сброса при включении питания (power-on reset, POR). Код Boot ROM аппаратно встроен в процессор, и его пользователь поменять не может. Поэтому очень важно знать, что реально делает код Boot ROM.

У кода Boot ROM две основные функции:

1. Конфигурирование устройства и инициализация его основных периферийных устройств.

   • Настройка стека.
   • Конфигурирование сторожевого таймера (Watchdog Timer 1, он настраивается на 3 минуты).
   • Конфигурирование PLL и системных тактовых частот.

2. Подготовка устройства к запуску следующего загрузчика (т. е. к переходу ко второй стадии загрузки).

   • Проверка источников загрузки для следующего загрузчика (SPL).
   • Действия по перемещению кода загрузчика SPL в память и его запуск.

Основное назначение кода Boot ROM - настроить устройство процессора для запуска загрузчика SPL. Список устройств загрузки (boot device list), через которые код Boot ROM ищет код SPL, конфигурируется уровнями напряжений выводов корпуса AM335x SYSBOOT [15:0] при его старте. Эти выводы также устанавливают другие параметры загрузки (boot parameters). Например, этими параметрами устанавливается ожидаемая частота внешнего кварца, ширина шины внешней памяти, где находится код SPL. Для дополнительной информации по этим параметрам загрузки см. Главу 26 технического руководства пользователя [2].

На на оценочной плате разработчика Starter Kit EVM [3] (EVM это сокращение от EValuation Module, т. е. оценочный модуль) нет простого способа управления списком устройств загрузки, потому что ножки SYSBOOT установлены на фиксированные напряжения логических уровней:

SYSBOOT[15:0] = 010000000000110111b

Логические уровни на ножках SYSBOOT конфигурируют порядок использования устройств загрузки (устанавливается выводами корпуса SYSBOOT[4:0]) для MMC, SPI0, UART0, USB0. Курьезный момент - подтягивающие резисторы pullup/pulldown ножек SYSBOOT можно найти на нижней стороне платы Starter Kit EVM, возле коннектора J8 I2C. На фотографии ниже показано, что не запаянные посадочные места резисторов относятся к подтяжке вниз (pulled down 10 кОм), в то время как запаянные посадочные места это подтяжка вверх (100 кОм). Имейте в виду, что Starter Kit не поддерживает загрузку из flash.

AM335x Starter Kit EVM SYSBOOT resistors

На оценочной плате разработчика общего назначения (General Purpose AM335x EVM [4]) ножки SYSBOOT можно конфигурировать в любое состояния с помощью переключателей (SYSBOOT Dip Switches, SW3 и SW4). Ниже показаны эти переключатели и соответствующие им ножки SYSBOOT.

AM335x General Purpose EVM SYSBOOT DIP switches

[2-я стадия загрузки: SPL]

Загрузчик второй стадии, также известный как SPL (сокращение от second stage bootloader), иногда называют MLO (сокращение от Minimal LOader). SPL это первая стадия для загрузчика U-boot, и SPL должен быть загружен во внутреннюю память RAM через один из физических интерфесов. У SPL очень ограничены возможности по конфигурированию или взаимодействию с пользователем.

[3-я стадия загрузки: U-boot]

U-BOOT дает пользователю продвинутый управляющий интерфейс команд через последовательный терминал (UART). Эти команды позволяют настроить процесс загрузки ядра Linux (kernel boot environment). Пользователь получает управление над такими параметрами, как аргументы загрузки (boot arguments) и командой загрузки ядра (kernel boot command). Дополнительно могут быть настроены переменные окружения, управляющие загрузкой на третьей стадии (U-boot environment variables). Они сохраняются в файле uEnv.txt, размещенном на устройстве хранения. Эти переменные окружения можно просмотреть, изменить, сохранить с помощью команд printenv, setenv и saveenv соответственно. Ниже показан пример вывода в UART-терминале первой загрузки U-BOOT.

U-Boot SPL 2009.11 (Jul 26 2012 - 17:18:20)
Texas Instruments Revision detection unimplemented
Found a daughter card connected
OMAP SD/MMC: 0
reading u-boot.img
reading u-boot.img
 
U-Boot 2011.09 (Jul 26 2012 - 17:13:38)
 
I2C: ready
DRAM: 256 MiB
WARNING: Caches not enabled
Found a daughter card connected
NAND: HW ECC Hamming Code selected
256 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Warning - bad CRC or NAND, using default environment
 
Net:   cpsw
Hit any key to stop autoboot: 0
U-Boot#

Примеры команд U-boot см. в его руководстве пользователя [5].

[4-я стадия загрузки: Linux Kernel]

uImage это образ ядра операционной системы (Linux Kernel) в обертке информации заголовка, которая это ядро описывает. Заголовок представляет собой блок размером 64 килобайта, и информация в нем включает целевую архитектуру, разновидность операционной системы, размер ядра, точки входа и т. д. Когда uImage загружается с помощью U-boot, информация заголовка отображается в выводе терминала.

AM335x uImage booting header info

После чтения и вывода информации из заголовка файла образа ядра, u-boot начинает загрузку ядра Linux в сконфигурированную память SDRAM. Если во время этого процесса Вы столкнулись с ошибками, то см. статью [6], где приведено описание общих проблем загрузки ядра Linux.

[Физические источники загрузки AM335x]

CPU AM335x может найти загрузчик из нескольких физических источников (интерфейсы или носители данных): карты памяти MMC/SD, flash-память NAND, NOR, интерфейсы UART, ETHERNET, USB, SPI и I2C. Какой источник загрузки доступен - определяется на текущей стадии загрузки. Например, загрузчики SPL и U-BOOT могут быть загружены только с того носителя, который может обнаружить код Boot ROM (и SPL, и U-BOOT должны быть записаны на один и тот же носитель данных). Для ядра и файловой системы доступны различные варианты мест, откуда возможна их загрузка.

Как только было определено, откуда брать загрузчик, важно понимать, в какое место памяти он должен быть помещен. Процессоры наподобие AM335x определяют карту памяти таким образом, что и внутренняя память, и память SDRAM (DDR) отображены на определенные адреса в едином адресном пространстве. Процессор ожидает, что внешние загрузчики (SPL, U-BOOT и Linux kernel) загружаются в специфические области памяти. Однако после своего старта загрузчики могут переместить свой код в памяти. Дополнительную информацию по карте памяти можно найти в главе 2 руководства TRM [2].

Загрузчики Boot ROM и SPL могут использовать для своего запуска внутреннюю оперативную память (internal RAM, начальный адрес 0x80000000), в то время как загрузчики U-boot и kernel ожидают для своей работы памяти SDRAM/DDR (начальный адрес 0x82000000). Это показано на рисунке ниже:

AM335x boot process stages

[Ссылки]

1. The Boot Process site:processors.wiki.ti.com.
2. AM335x and AMIC110 Sitara™ Processors Technical Reference Manual site:ti.com.
3. AM335x Starter Kit TMDSSK3358 site:ti.com.
4. AM335x General Purpose EVM HW User Guide site:ti.com.
5. AM335x U-Boot User's Guide site:processors.wiki.ti.com.
6. Kernel - Common Problems Booting Linux site:processors.wiki.ti.com.
7. Загрузка процессоров TI, создание загрузочной флешки SD.

 

Добавить комментарий


Защитный код
Обновить

Top of Page