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開機 ::: 最後開機完成: 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up