BeagleBone Black Build System
===
因為想玩embedded linux,買了一本書 -- [精通嵌入式Linux程式設計](https://www.books.com.tw/products/0010841433),於是買了書上範例開發板來玩。
書上採用BeagleBone Black開發版。該開發版採用TI的解決方案。[參考](https://beagleboard.org/black)
書上將bootloader, Linux裝在板載emmc上,但bootloader發生錯誤可能導致無法開機。於是我找了一些方法,利用sdcard開機(將bootloader和Linux裝在sdcard上)。
[安裝過程參考](https://forum.digikey.com/t/debian-getting-started-with-the-beaglebone-black/12967#basic-requirements)
本篇主要是紀錄我的安裝過程和方法。
:::info
* 本篇主要建置分為: bootloader, linux kernel, rootfs,三個部分。
* 本篇Toolchain採用arm-linux-gnueabi-,請先安裝完成。
:::
---
### 準備硬體工具:
1. TTL to USB (Debug用)
2. BeagleBone Black開發版
3. 一台裝有Linux的電腦(我使用ubuntu)
---
## Bootloader:
顧名思義,就是銜接板子Firmware到Operate System(OS)之間的啟動載入器。書上有介紹u-boot和Barebox兩種。本篇選擇u-boot(因為我對u-boot比較熟)。
1. 從官方下載u-boot:
```bash=
git clone -b v2019.04 https://github.com/u-boot/u-boot --depth=1
cd u-boot/
export CC=arm-linux-gnueabi-
```
:::info
請使用2019.04這個分支
arm toolchaion - arm-linux-gnueabi,需要事先安裝好
:::
2. 下載並安裝patches:
```bash=
wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0002-U-Boot-BeagleBone-Cape-Manager.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch
```
3. 設定和建置u-boot:
```bash=
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}
```
:::info
編譯成功後,會在u-boot跟目錄出現數個檔案。
我們只會用到MLO(Secondary Program Loader時期使用)和u-boot.img
:::
---
## 下載rootfs,並解壓縮
```bash=
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.4-minimal-armhf-2020-05-10.tar.xz
tar xf debian-10.4-minimal-armhf-2020-05-10.tar.xz
```
:::info
"安裝過程參考" 有說明Debian和Ubuntu兩個rootfs的使用方法。本篇採用Debian的rootfs。
:::
---
## 設定sdcard
我的sdcard位於/dev/sdb
1. 建立boot分割區,並安裝u-boot:
```bash=
export DISK=/dev/sdb
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
```
2. 建立rootfs分割區,並格式化:
```bash=
sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__
```
```bash=
sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1
```
3. 掛載rootfs分區:
```bash=
sudo mount ${DISK}1 /media/rootfs/
```
4. 備份bootloader:
```bash=
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. 安裝rootfs:
```bash=
sudo tar xfvp ./debian-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync
sudo chown root:root /media/rootfs/
sudo chmod 755 /media/rootfs/
```
---
## Linux kernel:
1. 下載Linux kernel:
```bash=
git clone -b v5.12 https://github.com/torvalds/linux
cd linux
export CC=arm-linux-gnueabi-
```
2. 使用armv7的通用設定檔:
```bash=
make ARCH=arm multi_v7_defconfig
```
3. 原始編譯出來的Kernel為vmlinux檔案。經過處理會變成以下映像檔格式:
* Image: vmlinux的二進位檔案。
* zImage: 壓縮過的映像檔,並自帶解壓縮。
* uImage: 加了64位元U-boot標頭檔的zImage。
:::info
u-boot支援zImage和uImage。本篇映像檔格式採用zImage。
:::
```bash=
make -j6 ARCH=arm CROSS_COMPILE=${CC} zImage
```
4. 編譯device tree(硬體描述檔案):
```bash=
make ARCH=arm dtbs
```
5. 編譯內核模組:
```bash=
make -j6 ARCH=arm CROSS_COMPILE=${CC} modules
```
6. 確認內核版本,並將開機設定寫入uEnv.txt:
```bash=
kernel_version=`make kernelversion`
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"
```
7. 安裝剛剛編譯過的映像檔, device tree, 內核模組:
```bash=
sudo cp -v arch/arm/boot/zImage /media/rootfs/boot/vmlinuz-${kernel_version}
sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}
sudo cp -v arch/arm/boot/dts/*.dtb /media/rootfs/boot/dtbs/${kernel_version}
sudo make -j6 ARCH=arm CROSS_COMPILE=${CC} INSTALL_MOD_PATH=/media/rootfs modules_install
```
8. 設定系統檔案表:
```bash=
sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab"
```
9. 編輯網路設定檔案:
```bash=
sudo nano /media/rootfs/etc/network/interfaces
```
內容新增:
```text=
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
```
10. 移除記憶卡:
```bash=
sync
sudo umount /media/rootfs
```
---
## 硬體接線:


1. TTL to USB連接至TXD, RXD, GND和PC
2. 按住User/Boot按紐(不要放)
3. 插入Power jack
4. 直到PC端Console軟體出現u-boot的開機log,放開User/Boot按紐
:::info
預設BeagleBone Black從內建emmc開機。這些步驟可讓開發版從sd card開機
:::
最後開機完成:
