BeagleBoneBlack的内核移植-从零开始制作镜像
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BeagleBoneBlack的内核移植-从零开始制作镜像
很多年前做的针对BeagleBone Black开发板的镜像制作,因为当时涉及到⾮标准化的,所以把基本的kernel、uboot和跟⽂件系统rootfs都做了⼀遍,⽂中只做移植,不作定制化的修改。
如果觉得哪⾥有问题,或者操作有误,欢迎留⾔斧正。
码⽂不易,转载请申明出处和链接。
使⽤bbb⼯业版移植内核,主要做的是⼏个⽅⾯:
在linux下安装交叉编译器
下载并编译uboot
下载并编译linux
下载rootfs
制作uEnv.txt给予启动
制作sd卡,把相关的镜像复制卡内,即完⼯
以下为具体的操作步骤,本⽂⽤的linux操作系统为ubuntu16.04
1.安装交叉编译器
安装交叉编译器
sudo apt-get install gcc-arm-linux-gnueabihf
安装完后可以查看交叉编译器版本
arm-linux-gnueabihf-gcc -v
本⽂交叉编译器版本为gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)
2.下载并编译uboot
以下假设所有的⽂件和操作路径都是在~/bb-linux下
sudo mkdir ~/bb-linux/
下载,并把⽂件传进ubuntu
解压
unzip -d ~/bb-linux/ u-boot-master.zip
cd ~/bb-linux/u-boot-master/
git checkout v2017.03-rc2 -b tmp
下载相应的patch
路径:~/bb-linux/u-boot-master
wget -c https:///repos/git/u-boot-patches/v2017.03-rc2/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https:///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
路径:~/bb-linux/u-boot-master
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这两个⽂件。
关于MLO、u-boot,以及am335x的启动流程,可以看,这篇⽂章写得很详细。
3.linux内核下载编译
下载,本⽂的源码版本是4.4.49,并把压缩包传进~/bb-linux/下
路径:~/bb-linux/
sudo unzip linux-4.4.zip
cd linuc-4.4/
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 ---
然后保存退出,编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
4 ⽂件系统rootfs下载
Debian 8
User Password
debian temppwd
root root
路径:~/bb-linux
下载debian8系统
wget -c https:///rootfs/eewiki/minfs/debian-8.7-minimal-armhf-2017-01-14.tar.xz
验证sha256sum
sha256sum debian-8.7-bare-armhf-2017-02-14.tar.xz
159e1a6addc35bbfff03b5eafd5cb741086a8a016d5ab9572ab122ce64d63e5e debian-8.7-bare-armhf-2017-01-14.tar.xz
解压
tar xf debian-8.7-bare-armhf-2017-01-14.tar.xz
5 准备烧写sd卡
假设microSD卡插进ubuntu后显⽰为/dev/sdb1,可以⽤sudo fdisk -l来查看
擦除microSD卡
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10
安装u-boot
sudo dd if=~/bb-linux/u-boot-master/MLO of=/dev/sdb count=1 seek=1 bs=128k
sudo dd if=~/bb-linux/u-boot-master/u-boot.img of=/dev/sdb count=2 seek=1 bs=384k
检查sfdisk的版本
sudo sfdisk --version
#sfdisk,来⾃ util-linux 2.27.1
如果sfdisk >=2.26.x
sudo sfdisk /dev/sdb <<-__EOF__
4M,,L,*
__EOF__
如果sfdisk <=2.25.x
sudo sfdisk --unit M /dev/sdb <<-__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/sdb1
格式化分区
因为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/sdb1
如果mkfs.ext4 <=1.42
sudo mkfs.ext4 -L rootfs /dev/sdb1
挂载分区
sudo mkdir -p /media/rootfs/
sudo mount /dev/sdb1 /media/rootfs/
备份⼀下u-boot
sudo mkdir -p /media/rootfs/opt/backup/uboot/
sudo cp -v ~/bb-linux/u-boot-master/MLO /media/rootfs/opt/backup/uboot
sudo cp -v ~/bb-linux/u-boot-master/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}然后拷贝进
sudo cp ./uEnv.txt /media/rootfs/
安装linux 内核和⽂件系统
为了bbb⽤户知道⽤的是什么版本的系统,那么作如下操作,x为具体的版本号,Z为型号
export kernel_version=4.4.x.Z
拷贝⽂件系统
~/bb-linux/
sudo tar xfvp ~/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 ~/bb-linux/linux-4.4/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 ~/bb-linux/linux-4.4/arch/arm/boot/dts/am335x-boneblack.dtb /media/rootfs/boot/dtbs/${kernel_version}/拷贝内核模块Kernel Modules
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 /debian jessie main contrib non-free
deb-src /debian jessie main contrib non-free
deb /debian jessie-proposed-updates main contrib non-free
deb-src /debian jessie-proposed-updates main contrib non-free
deb /debian jessie-updates main contrib non-free
deb-src /debian jessie-updates main contrib non-free
同步microSD卡,让⽂件写⼊microSD卡,并且卸载microSD卡,⾄此,系统基本能跑通了。
sync
sudo umount /media/rootfs
插⼊microSD卡后,系统应该正常⼯作了,登录账户密码
增加capemgr:v4.4.x+
git clone https:///beagleboard/-overlays.git
cd ./-overlays
更新dtc:
./dtc-overlay.sh
./install.sh
在/boot/uEnv.txt下增加以下内容,如有需要开机⾃启动的cape,那么就增加在cape_enable下即可
dtb=am335x-boneblack-overlay.dtb
#cape_disable=bone_capemgr.disable_partno=
#cape_enable=bone_capemgr.enable_partno=
增加usb连⽹
sudo apt-get install udhcpd
sudo vim /etc/network/interfaces
增加以下内容
/etc/network/interfaces
#Ehternet/RNDIS gadget (g_ether)
#... or on host side, usbnet and random hwaddr
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.252
network 192.168.7.0
gateway 192.168.7.1
下载并且编译脚本
wget -c https:///RobertCNelson/tools/master/scripts/beaglebone-black-g-ether-load.sh chmod +x beaglebone-black-g-ether-load.sh
sudo ./beaglebone-black-g-ether-load.sh。