Показаны сообщения с ярлыком beaglebone. Показать все сообщения
Показаны сообщения с ярлыком beaglebone. Показать все сообщения

пятница, 15 марта 2019 г.

Создание device-tree overlay для BBB

Установка на BBB ядра версии 4.1 с поддержкой CapeManager описана здесь, версии 4.4 - здесь. Убедиться, что ядро собрано с поддержкой CapeManager'а, можно проверив конфиги сборки:

zcat /proc/config.gz | grep CONFIG_BONE_CAPEMGR

Вывод, в случае поддержки CapeManager'а, должен быть следующий:

CONFIG_BONE_CAPEMGR=y

Установим пакет для сборки оверлеев на BBB:

sudo apt update ; sudo apt install bb-cape-overlays

Обновим скрипты:

cd /opt/scripts/tools
git pull

Посмотреть подключенные оверлеи можно либо через dmesg | grep bone_capemgr, либо выполнив:

cat /sys/devices/platform/bone_capemgr/slots

Устанавливаем на BBB исходники оверлеев (проект bb.org-overlays):

cd /opt/scripts/tools
git clone https://github.com/beagleboard/bb.org-overlays

Наш оверлей (dts-файл) надо положить в папку /opt/scripts/tools/bb.org-overlays/src/arm

Чтобы получить из имеющихся файлов dts в вышеназванной папке файлы dto, а затем скопировать их в папку /lib/firmware, вызываем:

cd /opt/scripts/tools/bb.org-overlays
make clean
./install.sh

Для вывода изображения мы используем пины p8.31-p8.45 (lcd_data0-lcd_data15), p8.27 (lcd_vsync), p8.28 (lcd_pclk), p8.29 (lcd_hsync), p8.30 (lcd_ac_bias_en). В дефолтном девайстри am335x-boneblack.dtb (am335x-boneblack.dts) эти пины используются hdmi-подсистемой (nxp_hdmi_bonelt_pins). Вместо стандартного мы будем использовать am335x-boneblack-emmc-overlay.dtb (am335x-boneblack-emmc-overlay.dts), в котором lcd-пины не связаны с hdmi-подсистемой. Для этого добавим следующую строчку в файл /boot/uEnv.txt:
dtb=am335x-boneblack-emmc-overlay.dtb

Для загрузки оверлея (например, BB-BONE-LCD7-01-00A1.dts из проекта bb.org-overlays) в режиме runtime надо набрать следующую команду в bash'е:

sudo sh -c "echo 'BB-BONE-LCD7-01:00A1' > /sys/devices/platform/bone_capemgr/slots"

У нас есть разные аппаратные конфигурации, которые ведут к появлению разных параллельных ветвлений оверлеев, выбором которых будет заниматься пользователь в расширенных настройках. Загрузку конкретного оверлея я буду производить в bash-скрипте, который запускается при старте системы (например, mystart.sh).

Настройка используемых интерфейсов uart1uart4i2c2spi0gpio1_16 (файл BB-STER-TEST-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
"P9.24", // uart1_txd
"P9.26", // uart1_rxd
"uart1", // hardware ip used

"P9.13", // uart4_txd
"P9.11", // uart4_rxd
"uart4", // hardware ip used

/* the pin header uses */
"P9.19", /* i2c2_sda */
"P9.20", /* i2c2_scl */
/* the hardware ip uses */
"i2c2",

/* the pin header uses */
"P9.17", /* spi0_cs0 */
"P9.18", /* spi0_d1 */
"P9.21", /* spi0_d0 */
"P9.22", /* spi0_sclk */
/* the hardware ip uses */
"spi0",

  "P9.15",        // сигнал от платы поддержки питания на выключение
  "gpio1_16";

fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_uart1_pins: pinmux_bb_uart1_pins {
pinctrl-single,pins = <
BONE_P9_24 (PIN_OUTPUT | MUX_MODE0) // uart1_txd.uart1_txd
BONE_P9_26 (PIN_INPUT | MUX_MODE0) // uart1_rxd.uart1_rxd
>;
};
};
};

fragment@1 {
target = <&uart1>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_uart1_pins>;
};
};

fragment@2 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_uart4_pins: pinmux_bb_uart4_pins {
pinctrl-single,pins = <
BONE_P9_13 (PIN_OUTPUT | MUX_MODE6) // gpmc_wpn.uart4_txd_mux2
BONE_P9_11 (PIN_INPUT  | MUX_MODE6) // gpmc_wait0.uart4_rxd_mux2
>;
};
};
};

fragment@3 {
target = <&uart4>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_uart4_pins>;
};
};

fragment@4 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_i2c2_pins: pinmux_bb_i2c2_pins {
pinctrl-single,pins = <
0x178 0x73 /* i2c2_sda, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */
0x17c 0x73 /* i2c2_scl, SLEWCTRL_SLOW | INPUT_PULLUP | MODE3 */
>;
};
};
};

fragment@5 {
target = <&i2c2>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_i2c2_pins>;

/* this is the configuration part */
clock-frequency = <100000>;

#address-cells = <1>;
#size-cells = <0>;
};
};


fragment@6 {
target = <&am33xx_pinmux>;
__overlay__ {
/* default state has all gpios released and mode set to uart1 */
bb_spi0_pins: pinmux_bb_spi0_pins {
pinctrl-single,pins = <
0x150 0x30 /* spi0_sclk.spi0_sclk, INPUT_PULLUP | MODE0 */
0x154 0x30 /* spi0_d0.spi0_d0, INPUT_PULLUP | MODE0 */
0x158 0x10 /* spi0_d1.spi0_d1, OUTPUT_PULLUP | MODE0 */
0x15c 0x10 /* spi0_cs0.spi0_cs0, OUTPUT_PULLUP | MODE0 */
>;
};
};
};

fragment@7 {
target = <&spi0>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_spi0_pins>;

spidev0: spi@0 {
compatible = "spidev";
reg = <0>;
spi-max-frequency = <500000>;
};
};
};

fragment@8 {
target = <&am33xx_pinmux>;
__overlay__ {
pinmode_p9_15: pinmux_gpio_1_16 {
pinctrl-single,pins = < BONE_P9_15 0x3F >;
};
};
};

fragment@9 {
target = <&ocp>;
__overlay__ {
pinmux_gpio_1_16 {
pinctrl-0 = <&pinmode_p9_15>;
                 compatible = "bone-pinmux-helper";
status = "okay";
pinctrl-names = "default";
};
};
};

};


Для монитора Lilliput, работающего у нас на разрешении 640x480, оверлей будет выглядеть следующим образом (файл BB-STER-VGA-01-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-VGA-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"lcdc",
"tscadc";

fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {

bb_lcd_lcd_pins: pinmux_bb_lcd_lcd_pins {
pinctrl-single,pins = <
0xa0 0x08 /* lcd_data0.lcd_data0, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa4 0x08 /* lcd_data1.lcd_data1, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xa8 0x08 /* lcd_data2.lcd_data2, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xac 0x08 /* lcd_data3.lcd_data3, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb0 0x08 /* lcd_data4.lcd_data4, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb4 0x08 /* lcd_data5.lcd_data5, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xb8 0x08 /* lcd_data6.lcd_data6, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xbc 0x08 /* lcd_data7.lcd_data7, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc0 0x08 /* lcd_data8.lcd_data8, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc4 0x08 /* lcd_data9.lcd_data9, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xc8 0x08 /* lcd_data10.lcd_data10, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xcc 0x08 /* lcd_data11.lcd_data11, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd0 0x08 /* lcd_data12.lcd_data12, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd4 0x08 /* lcd_data13.lcd_data13, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xd8 0x08 /* lcd_data14.lcd_data14, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xdc 0x08 /* lcd_data15.lcd_data15, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA */
0xe0 0x00 /* lcd_vsync.lcd_vsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe4 0x00 /* lcd_hsync.lcd_hsync, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xe8 0x00 /* lcd_pclk.lcd_pclk, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
0xec 0x00 /* lcd_ac_bias_en.lcd_ac_bias_en, OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT */
>;
};
};
};

fragment@1 {
target = <&lcdc>;
__overlay__ {
status = "okay";
};
};

fragment@2 {
target = <&tscadc>;
__overlay__ {

compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};
};

fragment@3 {
target-path="/";
__overlay__ {

/* avoid stupid warning */
#address-cells = <1>;
#size-cells = <1>;

panel {
compatible = "tilcdc,panel";
pinctrl-names = "default";
pinctrl-0 = <&bb_lcd_lcd_pins>;
panel-info {
ac-bias           = <255>;
ac-bias-intrpt    = <0>;
dma-burst-sz      = <16>;
bpp               = <16>;
fdd               = <0x80>;
tft-alt-mode      = <0>;
stn-565-mode      = <0>;
mono-8bit-mode    = <0>;
sync-edge         = <0>;
sync-ctrl         = <1>;
raster-order      = <0>;
fifo-th           = <0>;
};
display-timings {
native-mode = <&timing0>;
timing0: 640x480 {
hactive         = <640>;
vactive         = <480>;
hback-porch     = <48>;
hfront-porch    = <16>;
hsync-len       = <96>;
vback-porch     = <33>;
vfront-porch    = <10>;
vsync-len       = <2>;
clock-frequency = <30000000>;
hsync-active    = <0>;
vsync-active    = <0>;
};
};
};
};
};
};

Для монитора HDMI (файл BB-STER-HDMI-01-00A0.dts):

/*
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
/dts-v1/;
/plugin/;

#include <dt-bindings/board/am335x-bbw-bbb-base.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

/* identification */
part-number = "BB-STER-HDMI-01";
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.45", /* lcd: lcd_data0 */
"P8.46", /* lcd: lcd_data1 */
"P8.43", /* lcd: lcd_data2 */
"P8.44", /* lcd: lcd_data3 */
"P8.41", /* lcd: lcd_data4 */
"P8.42", /* lcd: lcd_data5 */
"P8.39", /* lcd: lcd_data6 */
"P8.40", /* lcd: lcd_data7 */
"P8.37", /* lcd: lcd_data8 */
"P8.38", /* lcd: lcd_data9 */
"P8.36", /* lcd: lcd_data10 */
"P8.34", /* lcd: lcd_data11 */
"P8.35", /* lcd: lcd_data12 */
"P8.33", /* lcd: lcd_data13 */
"P8.31", /* lcd: lcd_data14 */
"P8.32", /* lcd: lcd_data15 */
"P8.27", /* lcd: lcd_vsync */
"P8.29", /* lcd: lcd_hsync */
"P8.28", /* lcd: lcd_pclk */
"P8.30", /* lcd: lcd_ac_bias_en */
"lcdc",
"tscadc";


fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {

nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr0 */
AM33XX_IOPAD(0x8a0, PIN_OUTPUT | MUX_MODE0) /* lcd_data0.lcd_data0 */
AM33XX_IOPAD(0x8a4, PIN_OUTPUT | MUX_MODE0) /* lcd_data1.lcd_data1 */
AM33XX_IOPAD(0x8a8, PIN_OUTPUT | MUX_MODE0) /* lcd_data2.lcd_data2 */
AM33XX_IOPAD(0x8ac, PIN_OUTPUT | MUX_MODE0) /* lcd_data3.lcd_data3 */
AM33XX_IOPAD(0x8b0, PIN_OUTPUT | MUX_MODE0) /* lcd_data4.lcd_data4 */
AM33XX_IOPAD(0x8b4, PIN_OUTPUT | MUX_MODE0) /* lcd_data5.lcd_data5 */
AM33XX_IOPAD(0x8b8, PIN_OUTPUT | MUX_MODE0) /* lcd_data6.lcd_data6 */
AM33XX_IOPAD(0x8bc, PIN_OUTPUT | MUX_MODE0) /* lcd_data7.lcd_data7 */
AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE0) /* lcd_data8.lcd_data8 */
AM33XX_IOPAD(0x8c4, PIN_OUTPUT | MUX_MODE0) /* lcd_data9.lcd_data9 */
AM33XX_IOPAD(0x8c8, PIN_OUTPUT | MUX_MODE0) /* lcd_data10.lcd_data10 */
AM33XX_IOPAD(0x8cc, PIN_OUTPUT | MUX_MODE0) /* lcd_data11.lcd_data11 */
AM33XX_IOPAD(0x8d0, PIN_OUTPUT | MUX_MODE0) /* lcd_data12.lcd_data12 */
AM33XX_IOPAD(0x8d4, PIN_OUTPUT | MUX_MODE0) /* lcd_data13.lcd_data13 */
AM33XX_IOPAD(0x8d8, PIN_OUTPUT | MUX_MODE0) /* lcd_data14.lcd_data14 */
AM33XX_IOPAD(0x8dc, PIN_OUTPUT | MUX_MODE0) /* lcd_data15.lcd_data15 */
AM33XX_IOPAD(0x8e0, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_vsync.lcd_vsync */
AM33XX_IOPAD(0x8e4, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_hsync.lcd_hsync */
AM33XX_IOPAD(0x8e8, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_pclk.lcd_pclk */
AM33XX_IOPAD(0x8ec, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* lcd_ac_bias_en.lcd_ac_bias_en */
>;
};
nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9b0, PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr0 */
>;
};
};
};

fragment@1 {
target = <&lcdc>;
__overlay__ {
status = "okay";
port {
lcdc_0: endpoint@0 {
remote-endpoint = <&hdmi_0>;
};
};
};
};

fragment@2 {
target = <&i2c0>;
__overlay__ {
tda19988 {
compatible = "nxp,tda998x";
reg = <0x70>;
pinctrl-names = "default", "off";
pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;

port {
hdmi_0: endpoint@0 {
remote-endpoint = <&lcdc_0>;
};
};
};
};
};

fragment@3 {
target = <&tscadc>;
__overlay__ {

compatible = "ti,am3359-tscadc";
reg = <0x44e0d000 0x1000>;
interrupt-parent = <&intc>;
interrupts = <16>;
ti,hwmods = "adc_tsc";
status = "okay";

tsc {
compatible = "ti,am3359-tsc";
  };

adc {
compatible = "ti,am3359-adc";
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};
};
};

Использованный материал:
1) https://github.com/beagleboard/beaglebone-black/wiki/System-Reference-Manual
2) https://github.com/beagleboard/bb.org-overlays/blob/master/readme.md
3) https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/overview
4) http://www.jumpnowtek.com/beaglebone/BeagleBone-Black-pinmuxing-and-other-device-tree-notes.html
5) http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator
6) http://elinux.org/EBC_Exercise_11a_Device_Trees
7) http://www.devicetree.org/specifications
8) http://elinux.org/Device_Tree_Reference
9) http://elinux.org/Device_Tree_Usage
10) http://elinux.org/Capemgr
11) https://mazdermind.wordpress.com/2016/07/31/bbblack-lcd-cape-with-the-latest-debian-jessie-kernel-4-4/
12) http://www.weigu.lu/sb-computer/bbb_device_tree/index.html

среда, 18 октября 2017 г.

Сборка и установка ядра 4.1, u-boot, rootfs на BBB с поддержкой CapeMgr

У меня есть плата beagle bone black rev. C element 14 (еMMC размером 4GB) с предустановленной ОС (debian 8). Купить ее можно на алиэкспресс за 4250 рублей (04.02.2021) или, например, здесь за 6000 рублей (цены актуальны на 03.10.2017). На рабочей машине у меня установлена ОС Ubuntu 16.04 amd64. Beagle Bone Green на aliexpress стоит 4900 рублей (04.02.2021).

Питание платы BBB производится через USB. Подключение к BBB можно осуществить либо по RS-232 через плату-конвертор (подробнее), либо по USB (подробнее).
С рабочей машины под управлением Ubuntu 16.04 amd64 мы можем увидеть терминал следующим образом:

1) для RS232:

sudo screen /dev/ttyS0 115200,cs8

2) для USB:

sudo screen /dev/ttyUSB0 115200,cs8

Плата BBB подключена к локальной сети с действующим DHCP-сервером через коммутатор, к которому подключена рабочая машина. Дополнительно к плате я подключаю carpc-монитор с тачскрином либо через hdmi (примерно такой), либо через RGB-пины и дополнительную плату (примерно такой).

Собирать ядро, u-boot и rootfs будем по следующей инструкции https://eewiki.net/display/linuxonarm/BeagleBone+Black (версия страницы 125).

1. Скачиваем кросскомпилятор (версия 5.3.1-2016.05-x86_64_arm) отсюда, распаковываем и перемещаем в директорию /usr/local/tools/linaro-gnueabihf-5.3, настраиваем переменную окружения для сборки:

export CC=/usr/local/tools/linaro-5.3/bin/arm-linux-gnueabihf-

Проверить установленную переменную можно, выполнив echo $CC. Вывод должен соответствовать ( /usr/local/tools/linaro-5.3/bin/arm-linux-gnueabihf- ).

Для скачивания и сборки ядра, u-boot и rootfs нужна временная директория. Можно воспользоваться, как предложено в инструкции, домашней директорией(~), я же создам отдельную папку на общем диске (/media/Data/Kernel). 

2. Собираем U-boot. Переходим в папку, клонируем главную ветку репозитария, берем срез файлов коммита 2016.09-rc2скачиваем и применяем патчи, настраиваем сборку с помощью установленной переменной окружения $СС и собираем U-boot (после окончания сборки бинарник будет лежать в корне папки):

cd /media/Data/Kernel
git clone https://github.com/u-boot/u-boot
cd u-boot/
git checkout v2016.09-rc2 -b tmp


wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2016.09-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch


make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}


3. Собираем ядро. Переходим в нашу папку, клонируем ветку репозитария разработчика, берем срез файлов для ядра 4.1 am33x-v4.1 и запускаем скрипт сборки build_kernel.sh:

cd /media/Data/Kernel
git clone https://github.com/RobertCNelson/bb-kernel

cd bb-kernel/
git checkout origin/am33x-v4.1 -b tmp
./build_kernel.sh

4. Скачиваем rootfs с набором утилит для Debian 8:

cd /media/Data/Kernel

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.5-minimal-armhf-2016-08-16.tar.xz
tar xf debian-8.5-minimal-armhf-2016-08-16.tar.xz

5. Записываем все это на microsd-карту (можно взять microsd-карту размером от 2GB,  у меня размером 4GB). Воспользуемся microsd-картридером или sd-картридером, предварительно вставим microsd-карту в sd-переходник. 

5.1. Вставим microsd-карту через переходник и удалим через gparted имеющиеся разделы. Выясним, выполнив команду lsblk, номер устройства, соответствующего вставленной microsd-карте (у меня это устройство /dev/sdc):

adil@adil:/media/Data/Kernel$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0     11:0    1  1024M  0 rom
sdc      8:32   1   3,7G  0 disk
sda      8:0    0 465,8G  0 disk
├─sda2   8:2    0   100M  0 part
├─sda5   8:5    0 229,6G  0 part /media/adil/Data
├─sda1   8:1    0   133G  0 part
└─sda6   8:6    0 103,1G  0 part /

Определим вспомогательную переменную окружения для карты:

export DISK=/dev/sdc

5.2. Очистим карту и прошьем на неё бинарники u-boot:

sudo dd if=/dev/zero of=${DISK} bs=1M count=10
sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k


5.3. Создадим раздел на карте при помощи утилиты sfdisk. Определим версию

adil@adil:/media/Data/Kernel$ sudo sfdisk --version
sfdisk из util-linux 2.27.1


У меня версия util-linux 2.27.1 - старше 2.26 (для версии младше 2.26 эта команда выглядит иначе):

sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__


5.4. Создадим файловую систему с помощью утилиты mkfs.ext4. Определим версию:

adil@adil:/media/Data/Kernel$ sudo mkfs.ext4 -V
mke2fs 1.42.13 (17-May-2015)
Using EXT2FS Library version 1.42.13

У меня версия mkfs.ext4 1.42.13 (=1.42) и устройство /dev/sdX (для устройства  /dev/mmcblkX и старшей версии mkfs.ext4 следующие команды будут выглядеть иначе):

sudo mkfs.ext4 -L rootfs ${DISK}1

5.5. Создадим папку для монтирования и смонтируем microsd-карту (для устройства  /dev/mmcblkX следующие команды будут выглядеть иначе):

sudo mkdir -p /media/rootfs/
sudo mount ${DISK}1 /media/rootfs/

5.6. Сделаем backup файлов u-boot'а:

sudo mkdir -p /media/rootfs/opt/backup/uboot/
sudo cp -v ./u-boot/MLO /media/rootfs/opt/backup/uboot/
sudo cp -v ./u-boot/u-boot.img /media/rootfs/opt/backup/uboot/


5.7. Скопируем rootfs на примонтированный раздел карты:

sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/

5.8. Установим вспомогательную переменную окружения для копирования ядра (версию ядра можно взять из вывода скрипта сборки ядра, у меня версия 4.1.38-bone24):

export kernel_version=4.1.38-bone24

5.9. Установим вывод uname и скопируем бинарник ядра, device tree base и модули ядра:

Для отображения версии в uname:
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

Для HDMI дисплея 640x480:
sudo sh -c "echo 'optargs="consoleblank=0" video=HDMI-A-1:640x480@75' >> /media/rootfs/boot/uEnv.txt"

sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

5.10. Сформируем файл монтируемых при загрузке разделов (/etc/fstab), добавив туда раздел встроенного eMMC:

sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab"

5.11. Настроим сеть. Отредактируем файл /etc/network/interfaces:

sudo nano /media/rootfs/etc/network/interfaces

Добавим:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

Для того, чтобы у нас был один сетевой интерфейс eth0, отредактируем файл  /etc/udev/rules.d/70-persistent-net.rules:

sudo nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules


Добавим:

# BeagleBone: net device ()
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


5.12 (может вам это не нужно). Дадим возможность root-го доступа через ssh. Для этого отредактируем файл /etc/ssh/sshd_config:

sudo nano /media/rootfs/etc/ssh/sshd_config

Поменяем значение PermitRootLogin со значения without-password на yes.

5.13 (может вам это не нужно). Настроим доступ по RS-232. Создадим файл /etc/init/serial.conf:

sudo nano /media/rootfs/etc/init/serial.conf

Добавим:

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty 115200 ttyO0

6. Отмонтируем карту:

sync
sudo umount /media/rootfs


7. Загрузка BBB c нашей microsd-карты. Вставляем карту в BBB и, удерживая кнопку загрузки, подключаем к USB-разъему рабочей машины. Начинается загрузка с microsd-карты. После загрузки входим под пользователем debian пароль temppwd.

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

sudo passwd root

7.1. Свой скрипт при загрузке. Если мы хотим, чтобы при загрузке BBB выполнялся наш скрипт (например, файл mystart.sh), нужно создать файл в папке /etc/init.d:

sudo nano /etc/init.d/mystart.sh

Например, со следующим содержимым:

#!/bin/sh
echo "My script started!"

Записываем файл и выполняем скрипт update-rc.d, который размещает ссылки на вызов нашего скрипта в системных папках запуска ядра в стиле SystemV:

sudo update-rc.d mystart.sh defaults

Даем скрипту права на исполнение:

sudo chmod +x mystart.sh

7.2. Скачаем из инета скрипт для записи содержимого microsd-карты на встроенную память eMMC и запустим:

wget https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-ext4.sh
chmod +x bbb-eMMC-flasher-eewiki-ext4.sh
sudo /bin/bash ./bbb-eMMC-flasher-eewiki-ext4.sh

После окончания прошивки вынимаем microsd-карту и загружаемся с eMMC, не нажимая кнопку загрузки.

7.3. Чтобы пересобрать ядро с изменениями в конфигурации или исходном коде, лучше запускать не скрипт build_kernel.sh, который коннектится к стабильной ветке репозитария kernel.org и скачивает fix'ы и обновления, а запустить ./tools/rebuild.sh :

cd /media/Data/Kernel/bb-kernel
./tools/rebuild.sh

После сборки надо заново залить измененные части ядра на установочную флешку (пункт 5.9), затем загрузиться с флешки (пункт 7) и перекинуть её содержимое на внутреннюю память eMMC (пункт 7.2).

Использованный материал:
1) https://eewiki.net/display/linuxonarm/BeagleBone+Black