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
Проверим работоспособность, для этого будем включать светодиоды.
GPIO в Linux поддерживаются через sysfs.