понедельник, 13 января 2014 г.

BeagleBone Black & mainline Linux Kernel

Начиная эту статью (2-ю в этом году и 2^6 вообще - 0x64) я хотел бы предупредить: Все дальнейшие действия мною ещё до конца не проверены, поэтому вы делаете их на свой страх и риск. Также пока не известно, чем это может закончится. Для тех, кому не страшно - как всегда добро пожаловать под кат.



Исходя из статьи - Mainline Linux on the Beaglebone Black существует не нулевая вероятность, запустить ядро 3.13-r7 (весёлый номер, да) из основного дерева Linux Kernel на Beaglebone Black.
Давайте попробуем это сделать.

В статье описан способ, когда у нас происходит кросскомпиляция, а также запуск с нуля. Но поскольку у нас уже есть рабочая система, поэтому попробуем запустить ядро в текущем окружении, тут же его и собрав. Попутно, попробуем его протестировать на том, на чём тестировали то ядро которое сейчас является основным. Не будем его трогать, оно нам ещё может внезапно пригодиться.

Подготовка
Для начала необходимо обновить дерево portage чтобы получить последнюю его версию.
Если вы всё правильно сделали то у вас должно появится следующее:

beaglebone ~ # eix git-sources
* sys-kernel/git-sources
     Available versions:  
     (3.13_rc1) ~3.13_rc1^bs
     (3.13_rc2) ~3.13_rc2^bs
     (3.13_rc3) ~3.13_rc3^bs
     (3.13_rc4) ~3.13_rc4^bs
     (3.13_rc5) ~3.13_rc5^bs
     (3.13_rc6) ~3.13_rc6^bs
     (3.13_rc7) ~3.13_rc7^bs
       {build symlink}
     Homepage:            http://www.kernel.org
     Description:         The very latest -git version of the Linux kernel

Итак, у нас есть исходные коды ядра. Давайте их установим:

beaglebone ~ # emerge -av "=sys-kernel/git-sources-3.13_rc7"

На что возможно будет предупреждение, что данный пакет замаскирован и это можно исправить использовав опцию --autounmask-write. Размаскировав пакет, продолжим установку.
Необходимо также подключить SWAP, если он у вас ещё не подключен, т.к. для установки требуется больше памяти чем установлено на BeagleBone Black.

Подождав некоторое время (т.к. у нас microSD а не SSD) мы получаем директорию в /usr/src в которой у нас находятся исходники ядра:

beaglebone ~ # cd /usr/src/
beaglebone src # ls
kernel  linux  linux-3.13-rc7

Конфигурация
Перейдя в каталог новоиспечённого ядра, можно приступить к его настройке. Для этого мы воспользуемся настройкой по умолчанию, как нам рекомендует мануал:

beaglebone linux-3.13-rc7 # make omap2plus_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

Также можно настроить дополнительные опции:

beaglebone linux-3.13-rc7 # make menuconfig

Можно указать те опции которые были в настройке текущего ядра.

Сборка
Настроив все необходимые опции можно приступить к сборке:

beaglebone linux-3.13-rc7 # make zImage dtbs -j2

Затем можно как говорят в самолёте - откинутся на спинку кресла и расстегнуть ремни. Для компиляции ядра требуется время, причём значительно большее, чем при его распаковке и конфигурации.
Отдельно, хочу сказать, что если у вас не собирается ядро, значит вы что-то забыли указать, например физический уровень для USB.
После того как сборка окончена:

   .....
  AS      arch/arm/boot/compressed/lib1funcs.o
  AS      arch/arm/boot/compressed/ashldi3.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready

Можно приступать к установке модулей и образа ядра.

Установка
Начнём всё с установки модулей ядра, для этого соберём и установим модули:

beaglebone linux-3.13-rc7 # make -j2
  .....
  IHEX2FW firmware/emi62/bitstream.fw
  IHEX2FW firmware/emi62/spdif.fw
  IHEX2FW firmware/emi62/midi.fw
beaglebone linux-3.13-rc7 # make modules_install

Итак модули готовы и собраны, осталось переместить образ ядра и бинарное дерево устройств:

beaglebone linux-3.13-rc7 # cp arch/arm/boot/{zImage,dts/am335x-boneblack.dtb} /boot/

Также не забудем создать файл конфигурации uBoot, для запуска текущей конфигурации ядра:

beaglebone ~ # vim uEnv.txt
kernel_file=/boot/zImage
fdtfile=/boot/am335x-boneblack.dtb
mmcpart=2

loadzimage=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${kernel_file}
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} ${fdtfile}

console=ttyO0,115200n8
mmcroot=/dev/mmcblk0p2
mmcrootfstype=ext2 rootwait

mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs}

uenvcmd=run loadzimage; run loadfdt; run mmcargs; bootz ${loadaddr} - ${fdtaddr} 

И поместим этот конфигурационный файл в загрузочный раздел:

beaglebone ~ # mkdir /mnt/boot
beaglebone ~ # mount /dev/mmcblk0p1 /mnt/boot/
beaglebone ~ # cp uEnv.txt /mnt/boot/

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

beaglebone ~ # umount /dev/mmcblk0p1
beaglebone ~ # reboot

Broadcast message from root@beaglebone (pts/0) (Sun Jan 12 18:37:58 2014):
The system is going down for reboot NOW!

Загрузка
Если у вас всё правильно получилось, то в консоли можно наблюдать загрузку UBoot, Linux Kernel и наконец Gentoo Linux. Если же, возникли какие-нибудь проблемы, изучите тексты ошибок, возможно вы что-то упустили. Так у меня например был забыт хост контроллер для USB 2.0. К сожалению, это не следствие кривизны моих  рук, а следствие того, что ядро просто не запускает драйвер физического уровня USB.

После загрузки можно наблюдать следующее в командной строке:

beaglebone ~ # uname -a
Linux beaglebone 3.13.0-rc7 #3 Mon Jan 13 21:42:26 OMST 2014 armv7l Generic AM33XX (Flattened Device Tree) GNU/Linux

Далее, небольшое видео процесса загрузки:

На этом пока всё, однако ядро пришлось вернуть прежнее - т.к. без USB и менеджера энергосбережения (который тоже не заработал), как-то грустно что-ли.

Всем спасибо.