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、配置编译uboot
,
uboot
中自带了
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.img
到
SDRAM
。
子目录
spl
下存在一个
u-boot-spl.bin
文件:
u-boot-spl.bin
:
该文件是一个纯粹的
SPL
程序,
MLO=
头部信息
+u-boot-spl.bin
不同启动方式拷贝的文件不同:
从
SD
卡启动,应该把
MLO
、
u-boot.img
文件放到
boot
分区。
从串口启动,应该传送
u-boot-spl.bin
、
u-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卡格式,有一种说法要求文件系统为FAT格式,将uboot放在FAT格式的分区中,然后ROM 阶段会从FAT活动分区寻找名为 “MLO” 的文件来启动系统。不过我认为那是比较旧的启动方式,现在BBB的SD卡只需要一个分区,磁盘格式使用ext4,启动文件放在boot文件目录下就可以。如果你使用老版本的BeagleBone官网提供的镜像,烧录到SD卡上,对比最新的就会发现,老版本SD卡会加载两个分区,而新的只会加载一个。
1、查看磁盘
lsblk
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 lo
、
auto 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