Все это собиралось из под Ubuntu 16.04.
Решение собрать прошивку родилось из за отсутствия в свободном доступе образа для этой платы (Olimex A13-Olinuxino). А производитель предлагал преобрести SD карту с образом и стоило что то около 10 евро на тот момент, что очень не устроило, к тому же она была рассчитана на наличие монитора.
Конфигурирование загрузчика будем формировать для загрузки с SD карты. Поскольку NAND памяти на плате нету а все остальные варианты загрузки слегка кривоваты (у кого получиться собрать uboot для загрузки с USB носителя, пусть сделает два шага вперед и поделится). Алгоритм загрузки процессора allwinner a13 можно найти на сайте производителя. Или вот вырезка из даташита.
Из алгоритма хорошо видно что сначала идет проверка загрузчика на SD карте, потом все остальные и только в конце проверяется наличие загрузчика на USB. Поэтому планшеты и смартфоны вполне можно сделать с Ubuntu если им подсунуть SD карту с соответствующим образом. И судя по всему примерно такой алгоритм будет если не у всех, то у многих производителей arm процессоров.
Для начала нужно разбить SD карту, для этого дабы не ошибится в процессе набора комманд, сведем весь процесс в файл скрипта (я предпочитаю все сводить к таким файлам, так как запускать его придется не раз).
Остановимся по подробней на загрузчике, а в качестве оного выбираем UBOOT выкачиваем версию u-boot-2018.05, последнюю на тот момент.
Предполагается что уже стоит весь необходимый софт для сборки. И начнем сборку с конфигурирования загрузчика.
Для запуска конфигурирования необходимо зайти в папку с UBOOT и из неё выполнить команду:
В результате выполнения получим такое окно.
Это так называемый иксовый вариант конфигуратора, обычно пользуются вариантом консольным в нём больше информации предоставлено, но в этом всё более наглядней и он вполне покроет наши потребности.
А дальше если у вас много времени или вам себя не жалко, можно самим с нуля сконфигурировать загрузчик. Однако лучше через меню файл загрузить готовую конфигурацию этой платы. В папке с исходником загрузчика по адресу /u-boot-2018.05/configs/ выбираем файл A13-OlinuXino_defconfig это и есть наша конфигурация, где все уже установлено. Дальше нажимаем сохранить и закрываем окно, ибо менять тут ничего не нужно.
Остаётся запустить команду сборки:
В этой команде элементы все те же самые что и в предыдущей, только без параметра xconfig, что и означает конфигурирование. Вот собственно и все, загрузчик собран.
После окончания сборки, в папке указанной в команде, нам нужно найти этот файл “u-boot-sunxi-with-spl.bin” это и есть нужный загрузчик.
Дальше для заливки загрузчика на SD карту воспользуемся командой:
Загрузчик что только что записали после загрузки укажет на следующий раздел SD карты /dev/sdb1, и там будет искать скрипт файл с переменными окружения в котором содержаться инструкции по дальнейшей загрузке.
Этот файл должен иметь имя boot.scr, файл с этим названием ищет uboot после своей загрузки. Название файла конечно можно изменить как и метод загрузки если влезть в конфигурацию UBOOT, но остановимся на этом варианте.
Также следует за одно скомпилировать devicetree файлы, они лежат в исходниках с загрузчиком по адресу /u-boot-2018.05/arch/arm/dts/ нас интересует файл sun5i-a13-olinuxino.dts. Он представляет собой конфигруацию регистров и переферии процессора. Этакий универсальный файл конфигурации, поэтому вполне возможен вариант когда один загрузчик uboot используется для разных процессоров но при этом используются разные файлы dts. Такие же файлы dts есть и в исходниках ядра линукса, они в принципе одинаковы только написанны немного по разному и откуда брать собранное дерево устройств это уже выбирать вам. В общем для сборки dts файлов нужно запустить эту команду:
Скомпилированный файл будет лежать по адресу ../olimex-uboot/arch/arm/dts/.
Рассмотрим подробней получение файла boot.scr.
Для начала создадим файл boot.cmd с содержимым:
Но для того чтоб uboot понял инструкции, этот файл должен быть в виде скрипта и для этого нужно запустить команду:
Где boot.scr необходимый файл.
Первая строка load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb загружает файл дерева устройств по указанному адресу в оперативной памяти. load mmc 0 указывает что загружать нужно файл с первого раздела SD карты, при этом нумерация для uboot происходит нуля а не единицы.
Вторая строка load mmc 0 0x42000000 uImage загружает по указанному адресу собранное ядро линукса.
Для нашего варианта переменная setenv video-mode которая обычно дальше используется, нам не нужна так как монитор использовать не планируется.
Третья строка:
Ну и последняя команда bootm загружает ядро с раннее загруженного в памяти.
В следующей статье будет последняя часть что должна размещаться на первом разделе SD карты, это формирование ядра линукса kernell.
Первая часть статьи
Решение собрать прошивку родилось из за отсутствия в свободном доступе образа для этой платы (Olimex A13-Olinuxino). А производитель предлагал преобрести SD карту с образом и стоило что то около 10 евро на тот момент, что очень не устроило, к тому же она была рассчитана на наличие монитора.
Конфигурирование загрузчика будем формировать для загрузки с SD карты. Поскольку NAND памяти на плате нету а все остальные варианты загрузки слегка кривоваты (у кого получиться собрать uboot для загрузки с USB носителя, пусть сделает два шага вперед и поделится). Алгоритм загрузки процессора allwinner a13 можно найти на сайте производителя. Или вот вырезка из даташита.
Из алгоритма хорошо видно что сначала идет проверка загрузчика на SD карте, потом все остальные и только в конце проверяется наличие загрузчика на USB. Поэтому планшеты и смартфоны вполне можно сделать с Ubuntu если им подсунуть SD карту с соответствующим образом. И судя по всему примерно такой алгоритм будет если не у всех, то у многих производителей arm процессоров.
Для начала нужно разбить SD карту, для этого дабы не ошибится в процессе набора комманд, сведем весь процесс в файл скрипта (я предпочитаю все сводить к таким файлам, так как запускать его придется не раз).
#!/bin/sh
DEViCELINK=/dev/sdb
fdisk $DEViCELINK <<EOF
n # создать новый раздел
p # печать раздела
1 # номер раздела
2048 # создать раздел с отступом 2MiB
+64M # размер раздела, тут будет лежать kernel файл с переменными и dts файл
n
p
2
+2G # этот раздел для ubuntu
n
p
3
+2G # этот в дальнейшем станет для каскадной файловой системы
n
p
4 # а в этом разделе будет весь остальной размер
w
EOF
mkfs.ext2 /dev/sdb1 << EOF # раздел с kernell должен быть либо fat16 либо ext2
y
EOF
mkfs.ext4 /dev/sdb2 << EOF
y
EOF
mkfs.ext4 /dev/sdb3 << EOF
y
EOF
mkfs.ext4 /dev/sdb4 << EOF
y
EOF
Сборка UBOOT
Остановимся по подробней на загрузчике, а в качестве оного выбираем UBOOT выкачиваем версию u-boot-2018.05, последнюю на тот момент.
Предполагается что уже стоит весь необходимый софт для сборки. И начнем сборку с конфигурирования загрузчика.
Для запуска конфигурирования необходимо зайти в папку с UBOOT и из неё выполнить команду:
make O=../olimex-uboot # адрес где будет лежать результат сборки
-j4 # количество потоков для сборки
ARCH=arm # тип архитектуры для которой собирается
CROSS_COMPILE=arm-linux-gnueabihf- # кроскомпилятор нашего процессора
xconfig # команда запуска GUI конфигуратора
В результате выполнения получим такое окно.
Это так называемый иксовый вариант конфигуратора, обычно пользуются вариантом консольным в нём больше информации предоставлено, но в этом всё более наглядней и он вполне покроет наши потребности.
А дальше если у вас много времени или вам себя не жалко, можно самим с нуля сконфигурировать загрузчик. Однако лучше через меню файл загрузить готовую конфигурацию этой платы. В папке с исходником загрузчика по адресу /u-boot-2018.05/configs/ выбираем файл A13-OlinuXino_defconfig это и есть наша конфигурация, где все уже установлено. Дальше нажимаем сохранить и закрываем окно, ибо менять тут ничего не нужно.
Остаётся запустить команду сборки:
make O=../olimex-uboot
-j4
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
В этой команде элементы все те же самые что и в предыдущей, только без параметра xconfig, что и означает конфигурирование. Вот собственно и все, загрузчик собран.
После окончания сборки, в папке указанной в команде, нам нужно найти этот файл “u-boot-sunxi-with-spl.bin” это и есть нужный загрузчик.
Дальше для заливки загрузчика на SD карту воспользуемся командой:
dd if=../olimex-uboot/u-boot-sunxi-with-spl.bin # откуда брать файл для загрузки
of=/dev/sdb # загружаем в самое начало SD карты
bs=1024 seek=8 # отступаем 8KiB от начала, отсюда будет записано начало загрузчика
Загрузчик что только что записали после загрузки укажет на следующий раздел SD карты /dev/sdb1, и там будет искать скрипт файл с переменными окружения в котором содержаться инструкции по дальнейшей загрузке.
Этот файл должен иметь имя boot.scr, файл с этим названием ищет uboot после своей загрузки. Название файла конечно можно изменить как и метод загрузки если влезть в конфигурацию UBOOT, но остановимся на этом варианте.
Также следует за одно скомпилировать devicetree файлы, они лежат в исходниках с загрузчиком по адресу /u-boot-2018.05/arch/arm/dts/ нас интересует файл sun5i-a13-olinuxino.dts. Он представляет собой конфигруацию регистров и переферии процессора. Этакий универсальный файл конфигурации, поэтому вполне возможен вариант когда один загрузчик uboot используется для разных процессоров но при этом используются разные файлы dts. Такие же файлы dts есть и в исходниках ядра линукса, они в принципе одинаковы только написанны немного по разному и откуда брать собранное дерево устройств это уже выбирать вам. В общем для сборки dts файлов нужно запустить эту команду:
make O=../olimex-uboot
-j4
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
dtbs # опция указывающая что необходимо собрать dts файлы
Скомпилированный файл будет лежать по адресу ../olimex-uboot/arch/arm/dts/.
Рассмотрим подробней получение файла boot.scr.
Для начала создадим файл boot.cmd с содержимым:
load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb
load mmc 0 0x42000000 uImage
setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait console=ttyS0,115200
bootm 0x42000000 – 0x43000000
Но для того чтоб uboot понял инструкции, этот файл должен быть в виде скрипта и для этого нужно запустить команду:
mkimage -C none -A arm -T script -d boot.cmd boot.scr
Где boot.scr необходимый файл.
Первая строка load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb загружает файл дерева устройств по указанному адресу в оперативной памяти. load mmc 0 указывает что загружать нужно файл с первого раздела SD карты, при этом нумерация для uboot происходит нуля а не единицы.
Вторая строка load mmc 0 0x42000000 uImage загружает по указанному адресу собранное ядро линукса.
Для нашего варианта переменная setenv video-mode которая обычно дальше используется, нам не нужна так как монитор использовать не планируется.
Третья строка:
setenv bootargs # объявляет агрументы загрузки
root=/dev/mmcblk0p2 # указатель на раздел SD карты где размещен rootfs
rootfstype=ext4 # тип файловой системы rootfs
rw # перезаписываемая файловая система
rootwait
console=ttyS0,115200 # порт для консоли uart0
Ну и последняя команда bootm загружает ядро с раннее загруженного в памяти.
В следующей статье будет последняя часть что должна размещаться на первом разделе SD карты, это формирование ядра линукса kernell.
Первая часть статьи
Комментарии (9)
DrBulkin
02.01.2019 12:34С наступившим! А возможно как-то сделать чтобы UBOOT запускал recovery, если основная система не стартовала в прошлый раз?
dombran Автор
02.01.2019 12:43По крайней мере препятствий для этого нет. UBOOT есть возможность загружать пользовательское ПО, т.е то что вы сами напишите. Конечно и в существующем варианте uboot довольно широкий набор команд из которых можно состряпать необходимый скрипт. Но на мой взгляд для восстановления упавшей системы проще использовать каскадно монтируемую файловую систему, вот тут можно почитать про неё, правда kernell не поддерживает такого и патчи нужно будет накладывать вручную. Я планирую затронуть эту тему в одной из статей.
toxxin
02.01.2019 23:41Пара вопросов, если можно:
- kernel с одной буквой 'l' на конце пишется или с двумя? А то неловко даже как-то ;)
Решение собрать прошивку родилось из за отсутствия в свободном доступе образа для этой платы (Olimex A13-Olinuxino).
Вот тут вот есть какие-то образы. Что с ними не так? Для sd карты как раз.- Не понятно для кого статья, для новичков или для опытных? Если для опытных, то наверное им не очень будет это интересно, а для новичков очень много недосказанностей, которые оборачиваются бесконечными тырканиями с железкой. Дальше по списку то, что сильно бросается в глаза.
- alexac прав по поводу команды p в Вашем скрипте. Это не печать раздела, а вторичное меню после предыдущей команды. Просто запустите fdisk руками, выполните все те же команды, что и в скрипте и увидите, что после первой команды (создание нового раздета) идет выбор: p — primary, e — extended.
-
Предполагается что уже стоит весь необходимый софт для сборки.
Простите, вот тут у меня бомбануло… Если это статья для новичков, и каждый, кто собирал всякие загрузчики, ядра, какие-то сложные сборки, тот знает, что toolchain это не всегда просто. Ну так укажите в статье, какой взяли, укажите версию, версию дополнительных утилит(банально make хотя бы). Почему Вы взяли arm-linux-gnueabihf-, а не arm-linux-gnueabi- например? Это сильно упростит жизнь новичкам. И начнем сборку с конфигурирования загрузчика.
Ну так где конфигурирование? Ну можно было написать export ARCH=arm; make A13-OlinuXino_defconfig
DEViCELINK=/dev/sdb
А если у новичка /dev/sdb это второй раздел его диска? Ни пояснений, ни предостережений...# создать раздел с отступом 2MiB
А не 2К там?
И да, хочется «шаманства» прям и «кастомной» прошивки. А получается скомпилировать стоковый загрузчик со стоковым конфигом. Кликбейт какой-то прям, но может в 3-й статья будет прям хардкор? Очень хочется)
alexac
Поправьте комментарий, пожалуйста. p — это «primary partition», а не «печать раздела».
А еще в этом же скрипте было бы не плохо выставлять типы разделов (команда t у fdisk), те, что проставляются по умолчанию, не всегда соответствуют реальности.
eri
типы разделов не используются в реальности (только бут раздел в винде в проводнике скрыть)
alexac
Разумеется. Но правильно проставленные типы вместе с внятными метками разделов позволяют проще и быстрее ориентироваться в том, какая система разделов на носителе и что где находится. Можно называть это правилом хорошего тона, перфекционизмом, занудством или чем угодно еще. Но когда я больше недели не трогаю флешку, на которой больше одного раздела, я предпочту глянуть на таблицу разделов и увидеть что где находится, хотя бы по типам.
dombran Автор
В данном случае это именно печать, т.к. это все делается из под ubuntu и запустив в эту утилиту нажав -m- на клавиатуре вылезет справка:
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
lost55
Вы не правы, смотрите:
Как говорится — опа…
А вообще, для кого эта статья?