本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。
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),其功能就比较完善了,此时就可以启动操作系统了。
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
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)
以下假设所有的文件和操作路径都是在**/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
路径:/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
路径:/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内核源码,本文的源码版本是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
User | Password |
---|---|
debian | temppwd |
root | root |
路径:/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
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
可以下载
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
即可。
插上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
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
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
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/
为了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}/
cd /mnt/DATA/bb-linux/linux/
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/media/rootfs
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编译