BeagleboneBlack制作最新SD启动卡

https://www.digikey.com/eewiki/display/linuxonarm/BeagleBone+Black#BeagleBoneBlack-capemgr:v4.1.x+

  • 下载交叉编译链:

交叉编译链的版本一定要高于他要编译的源码的版本,应该可以说新一点的好。

~/:

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-

检测配置的环境变量是否成功,测试交叉编译链:

~/:

${CC}gcc --version


arm-linux-gnueabihf-gcc (Linaro GCC 6.5-2018.12) 6.5.0

Copyright (C) 2017 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • Uboot制作

1、下载获取uboot:

~/:

git clone https://github.com/u-boot/u-boot

cd u-boot/

git checkout v2019.04 -b tmp

 2、对uboot打补丁 

~/u-boot:

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

注:patch实现的是动态升级源码,此处两个补丁可能下载不下来,本人是没下载下来,所以在windows中进入github将源码复制下来重新建立.patch文件在传到linux进行操作。

 

3、配置编译ubootuboot中自带了am335x的配置文件:

~/u-boot:

make ARCH=arm CROSS_COMPILE=${CC} distclean

make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig

make ARCH=arm CROSS_COMPILE=${CC}

 

U-Boot编译之后生成的文件描述:

u-boot: ELF格式的可执行文件,由于里面含有调试程序所选的信息,所以该格式的可执行文件体积最大。

u-boot.bin: 可直接写入Flash的二进制可执行文件,直接被运行。

u-boot.srec: u-boot映像的S-Record格式。

u-boot.map: 这个文件包含了u-boot可执行文件的映像符号表。

MLO: 这个文件也是一个引导加载程序,用于加载u-boot.imgSDRAM

 

子目录spl下存在一个u-boot-spl.bin文件:

u-boot-spl.bin 该文件是一个纯粹的SPL程序,

MLO=头部信息+u-boot-spl.bin

不同启动方式拷贝的文件不同:

  1. SD卡启动,应该把MLOu-boot.img文件放到boot分区。
  2. 从串口启动,应该传送u-boot-spl.binu-boot.img文件。

 

  • 内核制作设备树驱动

1、下载最新内核

~/:

git clone https://github.com/RobertCNelson/bb-kernel

cd bb-kernel/

 2、切换到linux4.14实时系统内核 

~/bb-kernel/:

git checkout origin/am33x-rt-v4.14 -b tmp

 

3、脚本编译生成内核

~/bb-kernel/:

./build_kernel.sh

 

  • 根文件系统制作(Ubuntu文件系统):

1、获取文件系统源码

~/:

      wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-18.04.2-minimal-armhf-2019-02-16.tar.xz

 

2、校验下载的包

~/:

sha256sum ubuntu-18.04.2-minimal-armhf-2019-02-16.tar.xz

299f278ff446f0e427cb1a6650d1fa5d42d6744fff627c804f0afc918129b6b6  ubuntu-18.04.2-minimal-armhf-2019-02-16.tar.xz

 

3、解压文件系统

~/:

tar xf ubuntu-18.04.2-minimal-armhf-2019-02-16.tar.xz

 

  • 制作启动SD卡(较新的启动盘制作,不需要给uboot单独分区)

        关于SD卡格式,有一种说法要求文件系统为FAT格式,将uboot放在FAT格式的分区中,然后ROM 阶段会从FAT活动分区寻找名为 “MLO” 的文件来启动系统。不过我认为那是比较旧的启动方式,现在BBB的SD卡只需要一个分区,磁盘格式使用ext4,启动文件放在boot文件目录下就可以。如果你使用老版本的BeagleBone官网提供的镜像,烧录到SD卡上,对比最新的就会发现,老版本SD卡会加载两个分区,而新的只会加载一个。

1、查看磁盘

lsblk

BeagleboneBlack制作最新SD启动卡_第1张图片

2、擦除分区表

export DISK=/dev/sdb

sudo dd if=/dev/zero of=${DISK} bs=1M count=10

 

3、安装bootloader

~/:

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

 

4、创建分区布局:

sudo sfdisk --version


    sfdisk from util-linux 2.27.1

 

如果sfdisk >= 2.26.x,输入:

sudo sfdisk ${DISK} <<-__EOF__

4M,,L,*

__EOF__

 

如果sfdisk <= 2.25.x,输入:

sudo sfdisk --unit M ${DISK} <<-__EOF__

4,,L,*

__EOF__

 

5、格式化SD卡(此处整个SD卡都使用的是ext4的格式):

sudo mkfs.ext4 –V

    mke2fs 1.43-WIP (15-Mar-2016)

    Using EXT2FS Library version 1.43-WIP

 

如果mkfs.ext4 >= 1.43,且DISK=/dev/sdX,输入:

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1

 

如果mkfs.ext4 <= 1.42,且DISK=/dev/sdX,输入:

sudo mkfs.ext4 -L rootfs ${DISK}1

 

6、挂载分区:

sudo mkdir -p /media/rootfs/

 

对于DISK=/dev/sdX,输入:

sudo mount ${DISK}1 /media/rootfs/

 

7、备份MLO/u-boot.img,因为在将系统烧录到eMMC会用到:

~/:

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/

 

  • 安装内核和根文件系统:

1、构建环境变量,即内核版本,其实在编译好的内核中可以看到:

export kernel_version= 4.14.115-bone-rt-r23

 

2、复制根文件系统:

将解压过得文件系统中文件进一步解压,sync命令将内存中数据写入磁盘,sync命令在Linux系统中是为了加快数据的读取速度,所以在默认的情况中, 某些已经加载内存中的数据将不会直接被写回硬盘,而是先缓存在内存当中,如此一来, 如果一个数据被你重复的改写,那么由于他尚未被写入硬盘中,因此可以直接由内存当中读取出来, 在速度上一定是快上相当多的!

~/:

sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/

sync

sudo chown root:root /media/rootfs/

sudo chmod 755 /media/rootfs/

 

3、在/boot/uEnv.txt中设置uname_r:

Uboot在引导启动时,会从uEnv.txt中读取额外的配置参数:

因为设备树以及内核镜像和驱动都在uboot编译时指定,所以只要修改了这个uname_r参数,uboot就能根据相对文件路径找到我们要使用的内核、设备树以及镜像。

~/:

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

 

4、复制内核镜像:

将内核镜像复制到SD卡中的boot目录下,并修改名字与uboot中指定的一致。

~/:

sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

 

5、复制二进制设备树文件:

sd卡的boot目录下建立dtbs/${kernel_version}/文件夹,用于存放设备树文件。拷贝设备树时其实可以只拷贝使用的设备树,该文件夹中还有其他设备树文件:
 

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

 

6、复制内核模块

这部分内核模块在内核编译的脚本中直接安装了内核模块,所以只需拷贝,如果不是使用脚本编译时,单独编译模块的情况下可以选用安装模块,安装目录选择SD卡,系统会自动寻找到要安装的文件夹:

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

 

7、文件系统表设置(/etc/fstab)

该文件用于设置开机启动时自动的文件挂载,将磁盘与目录对应,例如linux系统的分区对应文件夹,都是在此文件中设置默认挂载位置。

/  auto:设置将做好的SD卡自动挂载在根目录下。

errors=remount-ro:并且当挂载出错时,挂载为只读模式。

0:表示忽略dump备份程序备份。

1:表示根目录分区的fsck磁盘检查设置,该值越小越先检查,根目录永远为1

sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

8、网络设置

编辑SD卡中网络配置文件:/etc/network/interfaces

sudo nano /media/rootfs/etc/network/interfaces

添加如下内容到文件:

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet dhcp

其中:

auto loauto eth0:表示开机自动配置

iface lo inet loopback:表示将lo接口设置为本地回环地址,其实就是本机IP地址127.0.0.1,利用该接口实现系统内部发送和接收数据。

iface eth0 inet dhcp:表示将网卡eth0设置为DHCP方式,动态获取IP地址。当然也可以配置为静态IP

扩展:设置DNS域名解析服务在/etc/resolv.conf 文件中配置,可以设置域名解析服务器的IP地址,例如nameserver 192.168.17.2

 

9、设置udev规则,让SD卡的网络配置在任何一个bbb上都能使用,也就是把配置的网卡名都改成一样的eth0,编辑文件/etc/udev/rules.d/70-persistent-net.rules:

sudo nano /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"

 

 10、移除SD卡,启动盘制作完成。 

拔下来SD卡插到BBB上启动,启动minicom可以看到串口打印信息。


sync
sudo umount /media/rootfs

参考博客:致谢

Beaglebone Black——理论篇beaglebone black启动——从串口获得SPL、U-BOOT,TFTP服务器获得内核,NFS服务器挂载根文件系统

https://blog.csdn.net/zy812248258/article/details/39291835

BeagleBone Black 移植U-Boot (2 MLO、U-Boot)

https://blog.csdn.net/p942005405/article/details/83376554

 

你可能感兴趣的:(BeagleBone)