Embedded Linux на BeagleBone Black

 

Embedded Linux на BeagleBone Black

BeagleBone Black — отличный выбор для embedded проектов, где сочетается высокая производительность и большие возможности для подключения внешней периферии, построена отличная работа с сетью, и хороший инструментарий Linux.

Характеристики устройства:

  • Главный процессор AM335X 1GHz ARM Cortex-A8 (Sitara AM3359AZCZ100)
  • Графический процессор SGX530
  • 2x PRU 32-bit RISC CPUs
  • 512 MB оперативной памяти DDR3L 800MHz
  • флеш-память 2GB, (eMMC)
  • 2х High Speed USB 2.0 порта: Host и Device
  • Последовательный порт UART(RS-232) TTL, 3.3В
  • MicroSD
  • HDMI
  • Ethernet
  • 2 колодки по 46 пинов для подключения электронных модулей и компонентов

Первоначально на плате установлен Ångström Linux. Данный дистрибутив стартует за 10 секунд после подачи питания, имеет настроенный демон Avahi, благодаря которому вы можете подключиться к плате по адресу «beaglebone.local», предоставляет облачную среду разработки Cloud9 IDE.

Установка Embedded Linux на BeagleBone Black.

  • ARM кросс компилятор: GCC (Linaro GCC). Необходимо скачать и распаковать архив.

~/

wget -c https://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/arm-linux-gnueabihf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf.tar.xz
export CC=`pwd`/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

Проверяем правильность установки и работоспособность дистрибутива.
~/

${CC}gcc --version
arm-linux-gnueabihf-gcc (Linaro GCC 5.3-2016.05) 5.3.1 20160412
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • Загрузчик : U-Boot.

Скачиваем дистрибутив
~/

git clone https://github.com/u-boot/u-boot
cd u-boot/
git checkout v2016.11-rc3 -b tmp

Патчим дистрибутив
~/u-boot

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

Настраиваем и собираем загрузчик 2-го уровня.

make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}
  • Ядро Linux.

Для сборки ядра, модулей ядра и дерева устройств будем использовать скрипт build_kernel.sh.
Скачиваем дистрибутив от RobertCNelson.
~/

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

Для am33x-v4.4 (Longterm 4.4.x):
~/bb-kernel

git checkout origin/am33x-v4.4 -b tmp

Для am33x-rt-v4.4 (Longterm 4.4.x + Real-Time Linux):
~/bb-kernel

git checkout origin/am33x-rt-v4.4 -b tmp

Для am33x-v4.8 (стабильная версия):
~/bb-kernel

git checkout origin/am33x-v4.8 -b tmp

Для am33x-v4.9 (Пропатченная версия):
~/bb-kernel

git checkout origin/am33x-v4.9 -b tmp

Собираем проект:
~/bb-kernel/

./build_kernel.sh
  • TI BSP.

~/

git clone https://github.com/RobertCNelson/ti-linux-kernel-dev.git
cd ti-linux-kernel-dev/

Для TI v4.4.x:
~/ti-linux-kernel-dev

git checkout origin/ti-linux-4.4.y -b tmp

Для TI v4.4.x: Real-Time
~/ti-linux-kernel-dev

git checkout origin/ti-linux-rt-4.4.y -b tmp

Для TI v4.9.x:
~/ti-linux-kernel-dev

git checkout origin/ti-linux-4.9.y -b tmp

Собираем проект:
~/ti-linux-kernel-dev/

./build_kernel.sh
  • RootFS (Root File System).

Debian 8
Пользователь/Пароль
root/root
debian/temppwd
Скачиваем rootfs:
~/

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.6-minimal-armhf-2016-09-17.tar.xz

Проверяем скаченный дистрибутив:
~/

sha256sum ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
2883cdd3416e0bd5988aa351c88db72ca089a184c5a670662d750568ca0869d8  ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz

Распаковываем скаченный дистрибутив:
~/

tar xf ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
  • RootFS (Root File System) небольшого размера .

Debian 8 (небольшого объема около 100 MB для пользовательских приложений).
Пользователь/Пароль
root/root
debian/temppwd
Скачиваем rootfs:
~/

wget -c https://rcn-ee.com/rootfs/eewiki/barefs/debian-8.6-bare-armhf-2016-09-17.tar.xz

Проверяем скаченный дистрибутив:
~/

sha256sum debian-8.6-bare-armhf-2016-09-17.tar.xz
93f88fe892adf8cb01d3e8829f02827a3d991f68497aeb929770dc3a21400614  debian-8.6-bare-armhf-2016-09-17.tar.xz

Распаковываем скаченный дистрибутив:
~/

tar xf debian-8.6-bare-armhf-2016-09-17.tar.xz
  • Ubuntu 16.04 LTS.

Пользователь/Пароль
ubuntu/temppwd
Скачиваем rootfs:
~/

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz

Проверяем скаченный дистрибутив:
~/

sha256sum ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
2883cdd3416e0bd5988aa351c88db72ca089a184c5a670662d750568ca0869d8  ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz

Распаковываем скаченный дистрибутив:
~/

tar xf ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
  • Установка и подготовка microSD карты для Embedded Linux на BeagleBone Black
  • Необходимо принять во внимание, что карта памяти в системе использует DISK=/dev/mmcblk0
export DISK=/dev/mmcblk0
  • Отчищаем область таблицы и меток на карте памяти
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

Формирования разделов флеш памяти:

sfdisk

sudo sfdisk --version
sfdisk from util-linux 2.27.1

sfdisk >= 2.26.x

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

sfdisk <= 2.25.x

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

Форматируем раздела памяти.

mkfs.ext4 -V
sudo mkfs.ext4 -V
mke2fs 1.43-WIP (15-Mar-2016)
        Using EXT2FS Library version 1.43-WIP
mkfs.ext4 >= 1.43

for: DISK=/dev/mmcblk0

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}p1
  
for: DISK=/dev/sdX

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1

mkfs.ext4 <= 1.42

for: DISK=/dev/mmcblk0

sudo mkfs.ext4 -L rootfs ${DISK}p1
  
for: DISK=/dev/sdX

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

Монтируем разделы памяти.

sudo mkdir -p /media/rootfs/
  
for: DISK=/dev/mmcblk0
sudo mount ${DISK}p1 /media/rootfs/
  
for: DISK=/dev/sdX
sudo mount ${DISK}1 /media/rootfs/

Резервная копия для загрузчика.
~/

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/

Если у Вас нет желания изменять загрузчик необходимо создать текстовый файл со следующей спецификацией.
~/uEnv.txt

##This will work with: Angstrom's 2013.06.20 u-boot.
  
loadaddr=0x82000000
fdtaddr=0x88000000
rdaddr=0x88080000
  
initrd_high=0xffffffff
fdt_high=0xffffffff
  
#for single partitions:
mmcroot=/dev/mmcblk0p1
  
loadximage=load mmc 0:1 ${loadaddr} /boot/vmlinuz-${uname_r}
loadxfdt=load mmc 0:1 ${fdtaddr} /boot/dtbs/${uname_r}/${fdtfile}
loadxrd=load mmc 0:1 ${rdaddr} /boot/initrd.img-${uname_r}; setenv rdsize ${filesize}
loaduEnvtxt=load mmc 0:1 ${loadaddr} /boot/uEnv.txt ; env import -t ${loadaddr} ${filesize};
loadall=run loaduEnvtxt; run loadximage; run loadxfdt;
  
mmcargs=setenv bootargs console=tty0 console=${console} ${optargs} ${cape_disable} ${cape_enable} root=${mmcroot} rootfstype=${mmcrootfstype} ${cmdline}
  
uenvcmd=run loadall; run mmcargs; bootz ${loadaddr} - ${fdtaddr};

~/

sudo cp -v ./uEnv.txt /media/rootfs/

Установка ядра и корневой файловой системы.
Перед установкой необходимо посмотреть имя созданного образа для переменной kernel_version.

export kernel_version=4.X.Y-Z

Копируем корневую файловую систему
~/

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

Устанавливаем uname_r в /boot/uEnv.txt

sudo sh -c "echo 'uname_r=${kernel_version}' >> /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/

Systems Table (/etc/fstab)
Настраиваем fstab.
fstab (file systems table) — один из конфигурационных файлов в UNIX-подобных системах, который содержит информацию о различных файловых системах и устройствах хранения информации компьютера; описывает, как диск (раздел) будет использоваться или как будет интегрирован в систему.

Полный путь к файлу — /etc/fstab.
/etc/fstab

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

Сеть.

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

Редактируем файл сети.
/etc/network/interfaces

auto lo
iface lo inet loopback
  
auto eth0
iface eth0 inet dhcp

Сеть: Использование общей SD карты для работы с использованием нескольких BeagleBone.

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

/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"

Отсоединяем карту памяти.

sync
sudo umount /media/rootfs

Распиновка BBB.

Распиновка UART/Debug BBB.

Проверим работоспособность, для этого будем включать светодиоды.
GPIO в Linux поддерживаются через sysfs.