Uboot linux что такое

Обновлено: 01.07.2024

Загрузчик второго уровня. Копирует кусок данных из указанного ему места из энергонезависимой памяти в ОЗУ. Так как он считает, что это запакованный образ Linux , он его распаковывает и запускает. Образ ядра должен быть предварительно запакован в понятный формат для U-Boot с помощью утилиты mkimage . U-Boot позволяет производить загрузку образов через ftp, а также менять параметры запуска из командной строки, что удобно в момент отладки системы, когда требуется часто пересобирать ядро, файловую систему.

Используем U-Boot 1.3.4 + патч от linux4sam.

tar xvjf u-boot-x.x.x.tar.bz2

cat u-boot-x.x.x-exp.diff | patch -p1

Адаптация кода

Проверить стартовый адрес в /u-boot/board/at91sam9260ek/config.mk . Он должен совпадать с адресом, указанным в Bootstrap (JUMP_ADDRESS).

Установить размер памяти, рабочие частоты в /include/configs/at91sam9260.h :

Понизить при необходимости частоту SPI (согласовать с Bootstrap ):

Задать параметры запуска в соответствующей секции (или во всех).

"rootfstype=ubifs rootflags=bulk_read,chk_data_crc rw"

Для ramfs и монтировании UBIFS файловой системы:

Обратить внимание на параметр:

0xD0042000 = адрес, где находится образ ядра. См. Логическая карта памяти.

0x210000 = 2162688 = максимальный размер образа ядра Linux .

0x22000000 = 32 M = адрес загрузки образ ядра, зависит от объёма установленной памяти.

Установить адрес микросхемы физического интерфейса Ethernet в cpu/arm926ejs/at91sam9/ether.c :

macb_eth_initialize(0, (void *)AT91SAM9260_BASE_EMAC, 0x01);

Компилятор

Используется не новее 2007q1-21. Причина: непонятное увеличение размера скомпилированного файла.

Компиляция

В Makefile определить путь к компилятору (около 130 строки):

Для запуска Linux из Dataflash сделать файл следующего содержания и запустить:

export PATH=/<path to toolchain>/arm-2007q1/bin:$

make ARCH=arm distclean

make ARCH=arm CROSS_COMPILE=arm-none-eabi-

Для запуска Linux из Nandflash сделать файл следующего содержания и запустить:

export PATH=/<path to toolchain>/arm-2007q1/bin:$

make ARCH=arm distclean

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

Результат сборки: /<path to u-boot>/board/at91sam9260ek/dataflash/u-boot.bin

Утилита mkimage для упаковки ядра Linux : /<path to u-boot>/tools/mkimage

размер файла не должен превышать параметр IMG_SIZE, указанный в Bootstrap .


Статья посвящена U-Boot и uClinux. Основной тип операционных систем используемых для микроконтроллеров остается RTOS. При наличии большой бизнес логики используют Linux. Для обеспечения реального времени применяют AMP, RTLinux и др. U-Boot (Universal bootloader) — универсальный загрузчик.

Что касается микроконтроллеров, необходимо значительный объем памяти на микроконтроллере, или поддержка нативной адресации ПЗУ (ROM) со стороны внешней памяти микроконтроллера, в случае отсутствии последнего, bin файл загружается из внешней памяти (NOR, SD и др.) в RAM с нативной адресацией.

Важность Das U-Boot в Embedded Linux системах достаточно лаконично изложена в книге Embedded Linux системы, Карим Ягмур. Текст о U-Boot начинается словами: «Хотя существует довольно много других загрузчиков, Das U-Boot, универсальный загрузчик, возможно, является самым богатым, самым гибким и наиболее активно развивающимся из загрузчиков с открытым исходным кодом». U-boot может использовать следующие файловые системы:

Для работы с U-Boot и uClinux для микроконтроллеров понадобиться репозиторий с github u-boot.

Все эксперименты будут происходит на базе данного репозитория, в качестве отладочной платы используется stm32f746g-disco и операционная система ubuntu 14.04 (можно использовать иные дистрибутивы Linux).

Для сборки u-boot нам понадобиться GNU Cross-Build Tools (возможно вам придется еще установить ia32-libs).

Распаковываем Cross-Build Tools и добавляем его в PATH.

В конце файла добавляем строку.

Основные директории для нашей отладочной платы:

Для примера изменим файл board.c функцию checkboard.

В директории lib-arm нужно открыть файл config.mk и изменить компилятор на arm-uclinuxeabi (можно передать как аргумент при сборке системы).

Сохраняем файл и в корне каталога выполняем следующею команду.

Затем находим необходимый VCP(COM-порт).

Затем bin файл зашиваем в плату с помощью openocd.

Запускаем sudo minicom -s или запускаем sudo gtkterm и

Embedded Linux для микроконтроллеров. U-Boot.


подключить VCP к Serial 6.

Для читателей которые еще не использовали openocd, переходим по ссылке openocd и скачиваем данный репозиторий к себе на компьютер.

Следующим моментом будет настройка tftp сервера.

Аргумент /srv/tftp команды in.tftpd указывает на каталог в котором будут храниться файлы TFTP сервера. Заменим /srv/tftp на /tftpboot.

Создадим директорию /tftpboot:

Чтобы новые настройки вступили в силу, перезапустим службу inetd:

нужно записать в директорию с проектом networking.uImage (скачиваемым образ с emcraft) и настраиваем окружение для u-boot (нужно воспользоваться командой setenv, saveenv, printenv).

U-Boot и uClinux.

U-Boot и uClinux.

U-Boot и uClinux.

Итого: установили U-Boot и uClinux, собрали исполняемый bin файл и запустили uClinux.

U-Boot — универсальный загрузчик, используемый для загрузки ОС Linux™ и других ОС .

Образ

U-Boot использует образы, создаваемые программой mkimage , сборка которой выполнятся при сборке U-Boot (см. <u-boot>/tools/mkimage ) и которую, вероятно, можно поставить из пакета uboot-mkimage вашего дистрибутива GNU/Linux.

mkimage добавляет 64 байта информации: название, контрольную сумму и пр.

Для отображения информации об образе:

На host-компьютере:
mkimage -l <img> , где <img> — название файла образа.

Создание образа

Поставьте mkimage из пакета uboot-mkimage вашего дистрибутива GNU/Linux Или скопируйте программу mkimage полученную при сборке U-Boot в одну из директорий указанных в переменной окружения PATH (см. echo $PATH ) или измените её значение (например, export PATH+=:/path/to/mkimage_dir ).

После этого вы можете для сборки ядра и создания из собранного ядра образа U-Boot выполнять make uImage .

Также вы можете создать образ из командной строки, см. встроенную помощь mkimage -h .

Корневая файловая система

Запись образа во Flash

Для записи созданного образа ядра или КФС во Flash требуется:

Скопировать образ с хоста в оперативную память целевой платы Проверить целостность скопированного образа в оперативной памяти Скопировать образ из оперативной памяти в стёртую область Flash

Создание из образа оригинального файла

Для получения из образа U-Boot оригинального файла у файла образа нужно убрать начальные 64 байта, например:
dd if=uImage of=zImage bs=1 skip=64

Переменные

Список переменных и их значения отображаются командой printenv .

Для вывода значения отдельной переменной используйте команду printenv <var> , где <var> — название переменной.

Загрузка

При запуске U-Boot, после задержки , выполняет команды содержащиеся в переменной bootcmd .

Задержка

Задержка при загрузке задаётся переменной bootdelay .

Параметры ядра

Параметры передаваемые ядру ( cmdline ) задаются переменной bootargs .

Идентификатор ядра

Идентификатор ядра machid задаётся переменной machid , указывается шестнадцатеричное значение без префикса.

Сохранение переменных

Сохранение переменных во Flash выполняется командой saveenv . При её выполнении автоматически снимается и устанавливается защита от записи сектора Flash, в котором хранятся переменные.

Пример вывода команды:

Проверка контрольной суммы

При загрузке ядра и КФС U-Boot проверяет контрольную сумму (КС, CRC). Если подсчитанная КС не совпадает с КС подсчитанной при создании образа , выполняется перезагрузка.

Проверка КС может быть отключена установкой переменой verify значения no .

Проверка КС кода самого U-Boot не выполняется.

Доступ к переменным из Linux

Прочесть переменные U-Boot из Linux можно программой fw_printenv , см. <u-boot>/tools/env . Конфигурация задается файлом /etc/fw_env.config .

Пример файла конфигурации для Тион, Тион-Про:

Пример чтения переменой ethaddr :

MAC-адрес

Для плат на базе процессора:

Flash

Отображение информации о Flash – команда flinfo .

Идентификатор Flash задаётся переменной mtdids , например, значением nor0=flash .

Команда mtdparts выводит список текущих разделов, например:

Команда ls выводит содержимое ФС JFFS2 для раздела указанного командой chpart (в переменной partition ), например, nor0,2 .

Командой protect off выполняется снятие программной или аппаратной защиты от записи или стирания Flash. Например, защиту с раздела nor0,2 можно снять командой:

См. также команды fsinfo , fsload .

Заставка

Для заставки используется изображение в формате bmp с индексированной палитрой из 256 цветов. Для преобразования изображения можно воспользоваться GIMP.

Адрес изображения указывается в переменой splashimage . Если по указанному адресу изображение не распознано, то отображается логотип.

Экран очищается командой cls , при этом отображается логотип вместо заставки, но палитра остаётся без изменения.

Перенаправление вывода консоли на экран:
setenv stdout lcd

При использовании (U-Boot 2010.09 из Git-репозитория ниже и U-Boot 1.3.3 начиная с svn598 патчей для плат на основе EP93xx) тип дисплея задаётся переменной panel :

Указанный дисплей используется после сброса (переменную panel следует сохранить ).

Для отображения фона и символов используется нулевой и 15-ый цвета палитры, соответственно.

Примечание: для оперативной подсказки по командам u-boot необходимо набрать команду «help» для получения списка всех поддерживаемых команд, либо «help some_command_you_need», чтобы узнать какие параметры у конкретной, одной команды.

Настройка переменных окружения

Для того, чтобы создать или изменить переменную окружения надо выполнить команду:

Пояснение на реальном примере:

Данная запись означает, что u-boot создаст (если этой переменной еще не было) либо изменит уже существующую переменную окружения «bootcmd».

При первом запуске U-boot, программа запускается с переменными окружения «по умолчанию» и будет их использовать до тех пор, пока пользователь не выполнит команду «saveenv». Любая модификация переменных окружения хранится лишь в энергозависимой памяти и не будет сохранена во флеш память до выполнения команды «saveenv». Это удобно при отладке, например, чтобы на один сеанс изменит параметры загрузки ядра Linux и не портить рабочие значения.

Загрузка образов по сети

Эта запись означает, что с помощью протокола NFS будет скачан файл «name_of_file» с компьютера в сети с адресом «host_ip» из директории «export_dir».

Примечание: для передачи данных по NFS в Linux на компьютере директория, к которой обращается u-boot, должна быть доступна по NFS.

Пояснение на реальном примере:

Данная запись означает, что u-boot скачает по протоколу TFTP файл uImage с компьютера, имеющего адрес, прописанный в переменной окружения «serverip».

Запись данных в NOR flash

Запись в NOR flash рассмотрим на примере записи ядра Linux - uImage:

1) Загружаем образ по сети (например, используя TFTP)

обратите внимание, что далее мы будем использовать размер «1a3070». В вашем случае данное число будет другим

2) Стираем флеш перед записью (обязательно)

стереть место под ядро (очищаем с нулевого по 10й сектор, размер сектора - 0x20000):

3) Производим запись ядра во флеш:

4) Модификация переменных окружения для старта с NOR-flash

Ядро выполняется прямо с флеш (возможно только для NOR)

на самом деле ядро считывается из флеш и копируется по нужным адресам в SDRAM, указанным при создании uImage.

данные действия выполняют при запуске ядра с последовательной или NAND флеш.

Параметры ядра Linux

Для того, чтобы запустить Linux, ему требуется файловая система. Она может находиться на удаленном компьютере в сети и быть доступна по NFS, либо быть на флеш памяти платы. При этом флеш память должна быть разбита на разделы (partitions) и быть представлена в виде файловой системы (JFFS2, YAFFS).

Загрузка файловой системы Linux с флеш памяти на плате

Параметр «ip=..» может иметь следующие значения:

В Linux сеть не будет сконфигурирована

В Linux сетевой интерфейс платы будет иметь ip-адрес 192.168.1.1

Примечание: данный параметр доступен лишь, если DHCP поддержка включена в ядро

При запуске ядра Linux, оно само определит ip-адрес, маску и прочие параметры по DHCP протоколу (если в данном сегменте сети есть DHCP-сервер).

Читайте также: