BeagleBone Black的內核移植-從零開始制作鏡像


很多年前做的針對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/

下載u-boot,並把文件傳進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://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

路徑:~/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的啟動流程,可以看BeagleBone Black 從零到一 (1 啟動流程) ,這篇文章寫得很詳細。

3.linux內核下載編譯

下載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://rcn-ee.com/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 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

插入microSD卡后,系統應該正常工作了,登錄賬戶密碼

  • 增加capemgr:v4.4.x+
git clone https://github.com/beagleboard/bb.org-overlays.git
cd ./bb.org-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://raw.github.com/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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM