beaglebone AI環(huán)境搭建與運(yùn)行
掃描二維碼
隨時(shí)隨地手機(jī)看文章
beaglebone AI環(huán)境搭建與運(yùn)行
-
1.前言
-
2.beaglebone AI 開(kāi)發(fā)板特性
-
3.beaglebone AI開(kāi)發(fā)環(huán)境搭建
-
3.1 硬件連接
-
3.2 arm 交叉編譯工具鏈
-
3.3 編譯uboot
-
4.beaglebone AI啟動(dòng)方式
-
5.beaglebone AI的Linux編譯
-
5.1 編譯kernel
-
5.2 選擇根文件系統(tǒng)
-
6.將Linux的鏡像燒錄
-
6.1 格式化SD卡
-
6.2 拷貝rootfs到SD卡中
-
6.3 拷貝Linux內(nèi)核鏡像
-
6.4 拷貝設(shè)備樹(shù)文件
-
6.5 拷貝內(nèi)核模塊
-
7.啟動(dòng)與驗(yàn)證
-
8.總結(jié)
1.前言
本文主要介紹beaglebone的開(kāi)發(fā)過(guò)程與啟動(dòng)方式。同時(shí)將一套嵌入式Linux開(kāi)發(fā)環(huán)境搭建起來(lái)。以便于更好的掌握和理解beaglebone AI的使用。工欲善其事,必先利其器,搭建好完整的開(kāi)發(fā)環(huán)境,后續(xù)的工作才能更好的開(kāi)展起來(lái)。要想用好一款芯片,也需要很好的理解其啟動(dòng)方式。下面來(lái)實(shí)際的展示操作流程。
2.beaglebone AI 開(kāi)發(fā)板特性
首先我選擇beaglebone AI作為嵌入式Linux學(xué)習(xí)的開(kāi)發(fā)板,是因?yàn)橛兄己玫男酒琩atasheet支持,以及TI芯片的大規(guī)模的使用,使得其通用性和擴(kuò)展性更強(qiáng)。板子顏值高,性能強(qiáng)、可玩性好、可以DIY的工程很多。這些都讓我對(duì)這個(gè)板子有著推進(jìn)下去的動(dòng)力,在不斷挖坑與填坑的過(guò)程中,也會(huì)將其作為我除了樹(shù)莓派4之外另一個(gè)主要業(yè)余推進(jìn)的開(kāi)發(fā)學(xué)習(xí)項(xiàng)目。在國(guó)內(nèi),這款板子并不是很熱門(mén),但是在國(guó)外,玩的人還是很多,我也希望有更多的人一起去玩,從而學(xué)習(xí)更好的設(shè)計(jì),寫(xiě)出更多的更好的文章和大家分享。
3.beaglebone AI開(kāi)發(fā)環(huán)境搭建
3.1 硬件連接
當(dāng)前的開(kāi)發(fā)環(huán)境搭建在ubuntu上,首先連接開(kāi)發(fā)板的debug串口。
正面的圖示如下所示:
該輸出作為debug串口使用。
3.2 arm 交叉編譯工具鏈
首先確保默認(rèn)的pc機(jī)是64位,不適合32位機(jī)器的使用。
wget -c https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz tar xf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz export CC=`pwd`/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
其中pwd是默認(rèn)設(shè)定的路徑。
然后檢測(cè)一下gcc的版本
${CC}gcc --version
可以看到下面的結(jié)果
3.3 編譯uboot
然后就可以開(kāi)始進(jìn)行uboot的編譯了。
git clone -b v2019.07-rc4 https://github.com/u-boot/u-boot --depth=1 cd u-boot/
然后為uboot生成補(bǔ)丁文件
wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.07-rc4/0001-am57xx_evm-fixes.patch patch -p1 < 0001-am57xx_evm-fixes.patch
接著開(kāi)始編譯
make ARCH=arm CROSS_COMPILE=${CC} distclean make ARCH=arm CROSS_COMPILE=${CC} am57xx_evm_defconfig make ARCH=arm CROSS_COMPILE=${CC}
編譯完成就可以進(jìn)行下面的操作了。
4.beaglebone AI啟動(dòng)方式
學(xué)習(xí)一款嵌入式開(kāi)發(fā)板的使用,首先就要理解其啟動(dòng)模式。
按照https://github.com/beagleboard/beaglebone-ai/BeagleBone-AI_sch.pdf上標(biāo)注,可以知道,在啟動(dòng)上,首先會(huì)從USB中尋找程序,然后第二啟動(dòng)項(xiàng)是SD卡,接著是eMMC。
本文主要介紹SD卡與eMMC的啟動(dòng)模式。并且將uboot燒錄到SD卡中進(jìn)行啟動(dòng)。
首先準(zhǔn)備一張小于等于16GB的SD卡(實(shí)測(cè)32GB的卡插入沒(méi)用),接著插入U(xiǎn)buntu系統(tǒng)中。
輸入lsblk。
bigmagic@bigmagic:~/work$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop1 7:1 0 55.3M 1 loop /snap/core18/1885 loop2 7:2 0 162.9M 1 loop /snap/gnome-3-28-1804/145 loop3 7:3 0 217.9M 1 loop /snap/gnome-3-34-1804/60 loop4 7:4 0 255.6M 1 loop /snap/gnome-3-34-1804/36 loop5 7:5 0 62.1M 1 loop /snap/gtk-common-themes/1506 loop6 7:6 0 43.2M 1 loop /snap/snap-store/415 loop7 7:7 0 50.7M 1 loop /snap/snap-store/481 loop8 7:8 0 31M 1 loop /snap/snapd/9607 loop9 7:9 0 31M 1 loop /snap/snapd/9721 loop10 7:10 0 55.4M 1 loop /snap/core18/1932 sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 465.9G 0 part / └─sda2 8:2 0 465.7G 0 part sdb 8:16 0 223.6G 0 disk ├─sdb1 8:17 0 200M 0 part /boot/efi ├─sdb2 8:18 0 99.4G 0 part ├─sdb3 8:19 0 589M 0 part ├─sdb4 8:20 0 115.4G 0 part └─sdb5 8:21 0 8G 0 part sdc 8:32 1 15G 0 disk └─sdc1 8:33 1 15G 0 part
可以看的標(biāo)識(shí)是sdc,則我們可以通過(guò)下面的命令導(dǎo)出到全局變量。
export DISK=/dev/sdc
輸入下面三條指令則可以將uboot燒錄到卡里了。
sudo dd if=/dev/zero of=${DISK} bs=1M count=10 sudo dd if=./u-boot/MLO of=${DISK} count=2 seek=1 bs=128k sudo dd if=./u-boot/u-boot.img of=${DISK} count=4 seek=1 bs=384k
完成后輸入sync后,可以看到uboot已經(jīng)正常啟動(dòng)了。
從上面的過(guò)程不難分析,一般的TI芯片都會(huì)將啟動(dòng)分為三部分
ROM->MLO(SPL)->uboot.img
5.beaglebone AI的Linux編譯
5.1 編譯kernel
git clone https://github.com/RobertCNelson/ti-linux-kernel-dev.git cd ti-linux-kernel-dev/
如果是編譯正常的內(nèi)核
git checkout origin/ti-linux-4.14.y -b tmp
編譯實(shí)時(shí)性內(nèi)核
git checkout origin/ti-linux-rt-4.14.y -b tmp
其中實(shí)時(shí)性內(nèi)核是就是RT_LINUX。輸入下面的命令開(kāi)始編譯。
./build_kernel.sh
中途會(huì)有個(gè)menuconfig的界面需要配置
直接選擇Exit即可,程序會(huì)繼續(xù)編譯下去。直到編譯結(jié)束。
5.2 選擇根文件系統(tǒng)
跟文件系統(tǒng)可以選擇Debian 10或者Ubuntu 20.04 LTS
Debian 10
首先下載
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.4-minimal-armhf-2020-05-10.tar.xz
可以校驗(yàn)一下
sha256sum debian-10.4-minimal-armhf-2020-05-10.tar.xz
得到結(jié)果如下即可
接著解壓
tar xf debian-10.4-minimal-armhf-2020-05-10.tar.xz
解壓后進(jìn)入目錄可以看到下面的文件
其中user_password.list中存放的是用戶名和密碼。
debian:temppwd
Ubuntu 20.04 LTS
可以下載
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz
校驗(yàn)一下
sha256sum ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz
校驗(yàn)的結(jié)果如下:
de0177ac9259fdbcc626ee239f4258b64070c0921dbc38c45fab6925a5becaa1 ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz
解壓即可
tar xf ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz
在ubuntu上可以使用輸入用戶名Ubuntu,密碼temppwd即可。
6.將Linux的鏡像燒錄
接下來(lái)燒錄Linux的鏡像到SD卡中。
6.1 格式化SD卡
首先和燒錄uboot的方式一樣,如果檢測(cè)到sd卡的號(hào)為sdc。
export DISK=/dev/sdc
如果是mmcblk0則修改成該名稱。
輸入下面的命令查看sfdisk的版本。
sudo sfdisk --version
看到輸出
sfdisk,來(lái)自 util-linux 2.34
如果檢測(cè)到sfdisk >= 2.26.x則輸入:
sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__
如果檢測(cè)到sfdisk <= 2.25.x則輸入:
sudo sfdisk --unit M ${DISK} <<-__EOF__
4,,L,*
__EOF__
然后格式化SD卡
for: DISK=/dev/mmcblkX sudo mkfs.ext4 -L rootfs ${DISK}p1 for: DISK=/dev/sdX sudo mkfs.ext4 -L rootfs ${DISK}1
掛載分區(qū)
sudo mkdir -p /media/rootfs/ for: DISK=/dev/mmcblkX sudo mount ${DISK}p1 /media/rootfs/ for: DISK=/dev/sdX sudo mount ${DISK}1 /media/rootfs/
6.2 拷貝rootfs到SD卡中
為了可以進(jìn)行內(nèi)核版本的區(qū)分,我們可以為內(nèi)核鏡像定義一個(gè)名字,該名字可以查看編譯出來(lái)的文件得到4.14.108-ti-r137.zImage。
export kernel_version=4.14.108-ti-r137
Linux完全引導(dǎo)起來(lái)需要rootfs,所以可以將rootfs解壓到指定的路徑下:
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/ sync sudo chown root:root /media/rootfs/ sudo chmod 755 /media/rootfs/
為了方便,此時(shí)我們可以重名了內(nèi)核版本,在/boot/uEnv.txt文件中。
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"
接著輸入文件系統(tǒng)掛載
sudo sh -c "echo '/dev/mmcblk0p1 / auto errors=remount-ro 0 1' >> /media/rootfs/etc/fstab"
6.3 拷貝Linux內(nèi)核鏡像
進(jìn)入到剛才編譯ti-linux-kernel-dev的上層目錄,輸入
sudo cp -v ./ti-linux-kernel-dev/deploy/*.zImage /media/rootfs/boot/vmlinuz-${kernel_version}
6.4 拷貝設(shè)備樹(shù)文件
sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/ sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/
6.5 拷貝內(nèi)核模塊
sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/
7.啟動(dòng)與驗(yàn)證
上述過(guò)程完成后,可以移除SD卡,并插入beaglebone AI的板子中。
sync sudo umount /media/rootfs
上電后,首先會(huì)從SD卡中啟動(dòng),最后的效果如下:
由于燒錄了ubuntu系統(tǒng),可以看到啟動(dòng)信息。
8.總結(jié)
對(duì)于beaglebone的程序的編譯與燒錄SD卡,主要需要注意的是SD卡的大小不要大于16MB,官方推薦最好是8MB比較合適。編譯uboot,Linux kernel比較看起來(lái)比較麻煩,實(shí)際按照步驟操作下來(lái),也可以熟悉Linux的開(kāi)發(fā)流程。beaglebone官方提供了可以一鍵燒錄的模式,可以直接燒錄底層的鏡像,這種方式不適合Linux底層開(kāi)發(fā)學(xué)習(xí)。關(guān)于uboot、Linux kernel、rootfs的編譯,可以使用buildroot來(lái)構(gòu)建,后面會(huì)介紹這種更加方便的模式。但是底層的探索更加能夠了解和掌握工程的構(gòu)建與系統(tǒng)的執(zhí)行流程。