当前位置: 首页 > 工具软件 > BeagleBone > 使用案例 >

BeagleBone black 镜像制作

东方海
2023-12-01
BeagleBone black 镜像制作

本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

beaglebone black启动方式

BeagleBone 的核心处理器是 AM3358,AM335x 有四个不同的启动阶段:

(1)ROM Code(处理器内部固化代码)
(2)SPL(Secondary Program Loader)
(3)U-BOOT
(4)Linux Kernel

为什么 AM335x 有多个启动阶段呢?直接从启动源加载 U-Boot 启动不是很方便?

一个全功能的U-Boot可能会超过400KB,因此不可能直接将它加载进内部RAM中直接运行,因此要分阶段。首先,第一步的 ROM Code (固化代码)不可能太复杂,ROM大小是一个限制,最重要的还是因为其所能获取的系统信息太少,所以处理器只能使用简单的方法去寻找能完成复杂功能的代码,而后将处理器初始化工作交给它来完成。其次,SPL (MLO)也不能很复杂,因为 ROM Code 只能将它加载到处理器内部 RAM 中运行,一般处理器的内部 RAM 都要小于128KB,其大小注定其不能完成很复杂的功能,所以 SPL 需要初始化 DDR 再加更复杂的代码加载到 DDR 中运行。到了在 DDR RAM 中执行的 Bootloader(U-Boot),其功能就比较完善了,此时就可以启动操作系统了。

BeagleBone 启动

BBB 板子上的 AM3335x 处理器上可以通过配置选择不同的接口启动,如数据手册 第二十六章所写。BBB 通过 S2 这个按键选择不同的启动顺序,默认情况下(S2 没有按下)启动过程如下:

(1)MMC1(板载 eMMC)
(2)MMC0(microSD)
(3)UART0
(4)USB0

如果按下 S2 按钮,启动过程如下:

(1)SPI0
(2)MMC0(microSD)
(3)UART0
(4)USB0

准备Linux镜像

安装交叉编译器

  • 安装交叉编译器
sudo apt-get install gcc-arm-linux-gnueabihf

安装完后可以查看交叉编译器版本

arm-linux-gnueabihf-gcc -v

本文交叉编译器版本为gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)

下载并编译uboot

以下假设所有的文件和操作路径都是在**/mnt/DATA/bb-linux**下

sudo mkdir /mnt/DATA/bb-linux/

下载u-boot,并把文件传进ubuntu

  • 编译
git clone git@git.zhlh6.cn:u-boot/u-boot.git
cd u-boot
git checkout v2017.03-rc2 -b bbb_uboot
  • 下载相应的patch

路径:/mnt/DATA/bb-linux/u-boot

wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2017.03-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2017.03-rc2/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
  • 编译u-boot

路径:/mnt/DATA/bb-linux/u-boot

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_boneblack_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

编译完成后在目录下能看到MLO (是一个引导加载程序,用于加载u-boot.img到SDRAM)和 u-boot.img (可以直接写入Flash的二进制可执行文件,直接被运行)这两个文件。

下载编译linux内核

  • 下载编译内核

下载linux内核源码,本文的源码版本是4.4.49,并把压缩包传进到指定路径下

git clone git@git.zhlh6.cn:beagleboard/linux.git

cd linux
git checkout 4.4.49-ti-rt-r89 -b bbb_linux
cp arch/arm/configs/bb.org_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs

编译完成后在./arch/arm/boot/下有zImage文件以及dts文件夹

  • 编译内核模块

因为在后续的使用过程中发现,spi1和sound card的口冲突了导致spi1不能用,所以在编译之前取消sound card模块的加载

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

选择Device Drivers —> < M > Sound card support —
使用空格键取消,变成< > Sound card support —
然后保存退出,编译ls

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

下载文件系统rootfs

Debian8

UserPassword
debiantemppwd
rootroot

路径:/mnt/DATA/bb-linux

下载debian8系统

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.7-minimal-armhf-2017-01-14.tar.xz

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-8.7-minimal-armhf-2017-01-14.tar.xz.sha256sum
  • 验证sha256sum
zyh@002237:/mnt/DATA/bb-linux$ sha256sum debian-8.7-minimal-armhf-2017-01-14.tar.xz 
5cca3d448432557d275fac694d50f708338d1aa621976ea3fa40fb71d44ba024  debian-8.7-minimal-armhf-2017-01-14.tar.xz
  • 解压
tar xf debian-8.7-bare-armhf-2017-01-14.tar.xz

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

zyh@002237 debian-8.7-minimal-armhf-2017-01-14 $ ls
armhf-rootfs-debian-jessie.tar  image-builder.project  user_password.l

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

zyh@002237 debian-8.7-minimal-armhf-2017-01-14 $ cat user_password.list 
debian:temppwd

ubuntu16.04

可以下载

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-18.04-minimal-armhf-2018-07-14.tar.xz

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-18.04-minimal-armhf-2018-07-14.tar.xz.sha256sum

校验一下

sha256sum ubuntu-18.04-minimal-armhf-2018-07-14.tar.xz

校验的结果如下:

2e401950d75cbf5a6250b8c29a0fbf935f31c49c5373daca77d15903fdbcdb3c  ubuntu-18.04-minimal-armhf-2018-07-14.tar.xz

解压即可

tar xf ubuntu-18.04-minimal-armhf-2018-07-14.tar.xz

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

烧录Linux镜像到SD卡中

准备烧写sd卡

  • 查看microSD卡

插上tf/sd卡之前:

zyh@002237 ~ $ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdb2

插上tf/sd卡之后:

zyh@002237 ~ $ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdc  /dev/sdc1

SD卡有两个分区 /dev/sdc 和 /dev/sdc1

或者使用 lsblk

zyh@002237 rootfs $ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0  65.1M  1 loop /snap/gtk-common-themes/1515
loop1    7:1    0    40K  1 loop /snap/cpufetch/31
loop2    7:2    0  64.8M  1 loop /snap/gtk-common-themes/1514
loop3    7:3    0   548K  1 loop /snap/gnome-logs/103
loop5    7:5    0   2.2M  1 loop /snap/gnome-system-monitor/157
loop6    7:6    0   2.5M  1 loop /snap/gnome-system-monitor/163
loop8    7:8    0  61.7M  1 loop /snap/core20/1026
loop9    7:9    0   2.5M  1 loop /snap/gnome-calculator/884
loop10   7:10   0     4M  1 loop /snap/gnome-calculator/406
loop11   7:11   0   276K  1 loop /snap/gnome-characters/708
loop12   7:12   0  55.5M  1 loop /snap/core18/1997
loop13   7:13   0  99.2M  1 loop /snap/core/10958
loop14   7:14   0   219M  1 loop /snap/gnome-3-34-1804/66
loop16   7:16   0 162.9M  1 loop /snap/gnome-3-28-1804/145
loop17   7:17   0  99.4M  1 loop /snap/core/11316
loop18   7:18   0  55.5M  1 loop /snap/core18/2074
loop19   7:19   0   548K  1 loop /snap/gnome-logs/106
loop20   7:20   0   704K  1 loop /snap/gnome-characters/726
loop21   7:21   0   219M  1 loop /snap/gnome-3-34-1804/72
loop22   7:22   0 243.9M  1 loop /snap/gnome-3-38-2004/39
loop23   7:23   0 164.8M  1 loop /snap/gnome-3-28-1804/161
sda      8:0    0 931.5G  0 disk 
├─sda1   8:1    0   100G  0 part 
└─sda2   8:2    0 831.5G  0 part /mnt/DATA
sdb      8:16   0 111.8G  0 disk 
├─sdb1   8:17   0   512M  0 part /boot/efi
└─sdb2   8:18   0 111.3G  0 part /

打开TF卡查看数据

sudo hexdump -n 1048576 /dev/sdc

擦除microSD卡

sudo dd if=/dev/zero of=/dev/sdc bs=1M count=10

安装固件

安装u-boot

sudo dd if=/mnt/DATA/bb-linux/u-boot/MLO of=/dev/sdb count=1 seek=1 bs=128k
sudo dd if=/mnt/DATA/bb-linux/u-boot/u-boot.img of=/dev/sdb count=2 seek=1 bs=384k 

增加新分区

  • 检查sfdisk的版本
sudo sfdisk --version
#sfdisk from util-linux 2.31.1

​ 如果sfdisk >=2.26.x

sudo sfdisk /dev/sdc <<-__EOF__
4M,,L,*
__EOF__

​ 如果sfdisk <=2.25.x

sudo sfdisk --unit M /dev/sdc <<-__EOF__
4M,,L,*
__EOF__

如果命令过程中出现

Checking that no-one is using this disk right now ... FAILED
This disk is currently in use - repartitioning is probably a bad idea.
Umount all file systems, and swapoff all swap partitions on this disk.
Use the --no-reread flag to suppress this check.
sfdisk: Use the --force flag to overrule all checks.

​ 那么先卸载

sudo umount /dev/sdc1
  • 格式化分区
    因为mkfs.ext4 1.43的原因 ,必须确保关掉metadata_csum和64bit
sudo mkfs.ext4 -V
#mke2fs 1.42.13 (17-May-2015)
    #使用 EXT2FS Library version 1.42.13

​ 如果mkfs.ext4 >=1.43

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit /dev/sdc1

​ 如果mkfs.ext4 <=1.42

sudo mkfs.ext4 -L rootfs  /dev/sdc1

挂载分区

sudo mkdir -p /media/rootfs/
sudo mount /dev/sdc1 /media/rootfs/

备份一下u-boot

sudo mkdir -p /media/rootfs/opt/backup/uboot/
sudo cp -v /mnt/DATA/bb-linux/u-boot/MLO /media/rootfs/opt/backup/uboot
sudo cp -v /mnt/DATA/bb-linux/u-boot/u-boot.img /media/rootfs/opt/backup/uboot

如果想清除在eMMC里旧的u-boot,那么增加u-Env.txt一下内容

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 ./uEnv.txt /media/rootfs/

安装linux 内核和文件系统

为了bbb用户知道用的是什么版本的系统,那么作如下操作,x为具体的版本号,Z为型号

export kernel_version=4.4.x.Z

export kernel_version=4.4.49-ti-rt-r89

拷贝文件系统

sudo tar xfvp /mnt/DATA/bb-linux/*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync
sudo chown root:root /media/rootfs/
sudo chmod 755 /media/rootfs/

在/boot/uEnv.txt里设置uname_r

sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

拷贝内核镜像

sudo cp -v /mnt/DATA/bb-linux/linux/arch/arm/boot/zImage /media/rootfs/boot/vmlinuz-${kernel_version}

拷贝内核 Device Tree Binaries(dts)

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo cp  /mnt/DATA/bb-linux/linux/arch/arm/boot/dts/am335x-boneblack.dtb /media/rootfs/boot/dtbs/${kernel_version}/
  • 拷贝内核模块Kernel Modules
cd /mnt/DATA/bb-linux/linux/
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/media/rootfs
  • File Systems Table(/etc/fstab)
sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

其他配置

  • 网络设置
sudo vim /media/rootfs/etc/network/interfaces

增加以下内容:

/media/rootfs/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

为了使能Ethernet为eth0

sudo vim /media/rootfs/etc/udev/rules.d/70-persistent-net.rules

增加以下内容:

/media/rootfs/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"

更新microSD卡系统的源

sudo vim /media/rootfs/etc/apt/source.list

更改为以下内容

deb http://mirrors.ustc.edu.cn/debian jessie main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie main contrib non-free
deb http://mirrors.ustc.edu.cn/debian jessie-proposed-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie-proposed-updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian jessie-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian jessie-updates main contrib non-free

同步microSD卡,让文件写入microSD卡,并且卸载microSD卡,至此,系统基本能跑通了。

sync 
sudo umount /media/rootfs

参考

beaglebone AI环境搭建与运行
BeagleBone Black的内核移植-从零开始制作镜像
BeagleBoneBlack学习(1)——启动流程与u-boot编译

 类似资料: