前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beaglebone AI环境搭建与运行

beaglebone AI环境搭建与运行

作者头像
bigmagic
发布2020-11-25 11:50:42
2.1K0
发布2020-11-25 11:50:42
举报
文章被收录于专栏:嵌入式iot

beaglebone AI环境搭建与运行

  • 1.前言
  • 2.beaglebone AI 开发板特性
  • 3.beaglebone AI开发环境搭建
    • 3.1 硬件连接
    • 3.2 arm 交叉编译工具链
    • 3.3 编译uboot
  • 4.beaglebone AI启动方式
  • 5.beaglebone AI的Linux编译
    • 5.1 编译kernel
    • 5.2 选择根文件系统
  • 6.将Linux的镜像烧录
    • 6.1 格式化SD卡
    • 6.2 拷贝rootfs到SD卡中
    • 6.3 拷贝Linux内核镜像
    • 6.4 拷贝设备树文件
    • 6.5 拷贝内核模块
  • 7.启动与验证
  • 8.总结

1.前言

本文主要介绍beaglebone的开发过程与启动方式。同时将一套嵌入式Linux开发环境搭建起来。以便于更好的掌握和理解beaglebone AI的使用。工欲善其事,必先利其器,搭建好完整的开发环境,后续的工作才能更好的开展起来。要想用好一款芯片,也需要很好的理解其启动方式。下面来实际的展示操作流程。

2.beaglebone AI 开发板特性

首先我选择beaglebone AI作为嵌入式Linux学习的开发板,是因为有着良好的芯片datasheet支持,以及TI芯片的大规模的使用,使得其通用性和扩展性更强。板子颜值高,性能强、可玩性好、可以DIY的工程很多。这些都让我对这个板子有着推进下去的动力,在不断挖坑与填坑的过程中,也会将其作为我除了树莓派4之外另一个主要业余推进的开发学习项目。在国内,这款板子并不是很热门,但是在国外,玩的人还是很多,我也希望有更多的人一起去玩,从而学习更好的设计,写出更多的更好的文章和大家分享。

3.beaglebone AI开发环境搭建

3.1 硬件连接

当前的开发环境搭建在ubuntu上,首先连接开发板的debug串口。

正面的图示如下所示:

该输出作为debug串口使用。

3.2 arm 交叉编译工具链

首先确保默认的pc机是64位,不适合32位机器的使用。

代码语言:javascript
复制
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是默认设定的路径。

然后检测一下gcc的版本

代码语言:javascript
复制
${CC}gcc --version

可以看到下面的结果

3.3 编译uboot

然后就可以开始进行uboot的编译了。

代码语言:javascript
复制
git clone -b v2019.07-rc4 https://github.com/u-boot/u-boot --depth=1
cd u-boot/

然后为uboot生成补丁文件

代码语言:javascript
复制
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

接着开始编译

代码语言:javascript
复制
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am57xx_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}

编译完成就可以进行下面的操作了。

4.beaglebone AI启动方式

学习一款嵌入式开发板的使用,首先就要理解其启动模式。

按照https://github.com/beagleboard/beaglebone-ai/BeagleBone-AI_sch.pdf上标注,可以知道,在启动上,首先会从USB中寻找程序,然后第二启动项是SD卡,接着是eMMC。

本文主要介绍SD卡与eMMC的启动模式。并且将uboot烧录到SD卡中进行启动。

首先准备一张小于等于16GB的SD卡(实测32GB的卡插入没用),接着插入Ubuntu系统中。

输入lsblk

代码语言:javascript
复制
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

可以看的标识是sdc,则我们可以通过下面的命令导出到全局变量。

代码语言:javascript
复制
export DISK=/dev/sdc

输入下面三条指令则可以将uboot烧录到卡里了。

代码语言:javascript
复制
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已经正常启动了。

从上面的过程不难分析,一般的TI芯片都会将启动分为三部分

代码语言:javascript
复制
ROM->MLO(SPL)->uboot.img

5.beaglebone AI的Linux编译

5.1 编译kernel

代码语言:javascript
复制
git clone https://github.com/RobertCNelson/ti-linux-kernel-dev.git
cd ti-linux-kernel-dev/

如果是编译正常的内核

代码语言:javascript
复制
git checkout origin/ti-linux-4.14.y -b tmp

编译实时性内核

代码语言:javascript
复制
git checkout origin/ti-linux-rt-4.14.y -b tmp

其中实时性内核是就是RT_LINUX。输入下面的命令开始编译。

代码语言:javascript
复制
./build_kernel.sh

中途会有个menuconfig的界面需要配置

直接选择Exit即可,程序会继续编译下去。直到编译结束。

5.2 选择根文件系统

跟文件系统可以选择Debian 10或者Ubuntu 20.04 LTS

Debian 10

首先下载

代码语言:javascript
复制
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.4-minimal-armhf-2020-05-10.tar.xz

可以校验一下

代码语言:javascript
复制
sha256sum debian-10.4-minimal-armhf-2020-05-10.tar.xz

得到结果如下即可

接着解压

代码语言:javascript
复制
tar xf debian-10.4-minimal-armhf-2020-05-10.tar.xz

解压后进入目录可以看到下面的文件

其中user_password.list中存放的是用户名和密码。

代码语言:javascript
复制
debian:temppwd

Ubuntu 20.04 LTS

可以下载

代码语言:javascript
复制
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

校验一下

代码语言:javascript
复制
sha256sum ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

校验的结果如下:

代码语言:javascript
复制
de0177ac9259fdbcc626ee239f4258b64070c0921dbc38c45fab6925a5becaa1  ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

解压即可

代码语言:javascript
复制
tar xf ubuntu-20.04-minimal-armhf-2020-05-10.tar.xz

在ubuntu上可以使用输入用户名Ubuntu,密码temppwd即可。

6.将Linux的镜像烧录

接下来烧录Linux的镜像到SD卡中。

6.1 格式化SD卡

首先和烧录uboot的方式一样,如果检测到sd卡的号为sdc。

代码语言:javascript
复制
export DISK=/dev/sdc

如果是mmcblk0则修改成该名称。

输入下面的命令查看sfdisk的版本。

代码语言:javascript
复制
sudo sfdisk --version

看到输出

代码语言:javascript
复制
sfdisk,来自 util-linux 2.34

如果检测到sfdisk >= 2.26.x则输入:

代码语言:javascript
复制
sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__

如果检测到sfdisk <= 2.25.x则输入:

代码语言:javascript
复制
sudo sfdisk --unit M ${DISK} <<-__EOF__
4,,L,*
__EOF__

然后格式化SD卡

代码语言:javascript
复制
for: DISK=/dev/mmcblkX
sudo mkfs.ext4 -L rootfs ${DISK}p1
  
for: DISK=/dev/sdX
sudo mkfs.ext4 -L rootfs ${DISK}1

挂载分区

代码语言:javascript
复制
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卡中

为了可以进行内核版本的区分,我们可以为内核镜像定义一个名字,该名字可以查看编译出来的文件得到4.14.108-ti-r137.zImage

代码语言:javascript
复制
export kernel_version=4.14.108-ti-r137

Linux完全引导起来需要rootfs,所以可以将rootfs解压到指定的路径下:

代码语言:javascript
复制
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync
sudo chown root:root /media/rootfs/
sudo chmod 755 /media/rootfs/

为了方便,此时我们可以重名了内核版本,在/boot/uEnv.txt文件中。

代码语言:javascript
复制
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

接着输入文件系统挂载

代码语言:javascript
复制
sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

6.3 拷贝Linux内核镜像

进入到刚才编译ti-linux-kernel-dev的上层目录,输入

代码语言:javascript
复制
sudo cp -v ./ti-linux-kernel-dev/deploy/*.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

6.4 拷贝设备树文件

代码语言:javascript
复制
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 拷贝内核模块

代码语言:javascript
复制
sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

7.启动与验证

上述过程完成后,可以移除SD卡,并插入beaglebone AI的板子中。

代码语言:javascript
复制
sync
sudo umount /media/rootfs

上电后,首先会从SD卡中启动,最后的效果如下:

由于烧录了ubuntu系统,可以看到启动信息。

8.总结

对于beaglebone的程序的编译与烧录SD卡,主要需要注意的是SD卡的大小不要大于16MB,官方推荐最好是8MB比较合适。编译uboot,Linux kernel比较看起来比较麻烦,实际按照步骤操作下来,也可以熟悉Linux的开发流程。beaglebone官方提供了可以一键烧录的模式,可以直接烧录底层的镜像,这种方式不适合Linux底层开发学习。关于uboot、Linux kernel、rootfs的编译,可以使用buildroot来构建,后面会介绍这种更加方便的模式。但是底层的探索更加能够了解和掌握工程的构建与系统的执行流程。

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-13,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • beaglebone AI环境搭建与运行
    • 1.前言
      • 2.beaglebone AI 开发板特性
        • 3.beaglebone AI开发环境搭建
          • 3.1 硬件连接
          • 3.2 arm 交叉编译工具链
          • 3.3 编译uboot
        • 4.beaglebone AI启动方式
          • 5.beaglebone AI的Linux编译
            • 5.1 编译kernel
            • 5.2 选择根文件系统
          • 6.将Linux的镜像烧录
            • 6.1 格式化SD卡
            • 6.2 拷贝rootfs到SD卡中
            • 6.3 拷贝Linux内核镜像
            • 6.4 拷贝设备树文件
            • 6.5 拷贝内核模块
          • 7.启动与验证
            • 8.总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com