制作更新BeagleBone-Black的Bootloader内核和文件系统

来源:互联网 发布:java开发实战经典 编辑:程序博客网 时间:2024/05/29 10:56

本博客翻译自:https://www.eewiki.net/display/linuxonarm/BeagleBone%20Black


本博客翻译中会将原文的错误加以纠正。

基本要求:

  • ARM 交叉编译器
    • Linaro: http://www.linaro.org/downloads/
  • Bootloader
    • Das U-Boot – the Universal Boot Loader http://www.denx.de/wiki/U-Boot
    • 源码地址 – http://git.denx.de/?p=u-boot.git;a=summary
  • Linux Kernel
    • 主线内核: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git
  • 基于ARM的 rootfs
    • Debian: https://www.debian.org/
    • Ubuntu: http://www.ubuntu.com

ARM 交叉编译器: GCC

这是一个32位预编译的工具链,如果你的发行版为64位系统,请确保安装了32位库,安装方法如下表所示:

基于Debian (deb)

extra

pkgs: (sudo apt-get update ; sudo apt-get install xyz)

Ubuntu 14.04 -> 14.10

 

libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386

Debian 7 -> 8 (Jessie)

sudo dpkg --add-architecture i386

libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386

基于RedHat (rpm)

extra

pkgs: (yum install xyz)

Red Hat/Centos/Fedora

 

libstdc++.i686 ncurses-devel.i686 zlib.i686

下载/解压:

~/
wget -c https://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
tar xf gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
export CC=`pwd`/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-

测试: 如果未通过测试, 确认你的系统是否正确安装32位库.

~/
${CC}gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.094.9.2 20140904 (prerelease)
Copyright (C) 2014 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.

Bootloader: U-Boot

Das U-Boot -- 通用的Bootloader http://www.denx.de/wiki/U-Boot

下载:

~/
git clone git://git.denx.de/u-boot.git
cd u-boot/
git checkout v2014.10 -b tmp

补丁:

~/u-boot
wget -c https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2014.10/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch

配置和编译:

~/u-boot
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}

升级发行版中的Device Tree 编译工具包

~/
wget -c https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh
chmod +x dtc.sh
./dtc.sh

Linux 内核

这个脚本将会编译内核和模块,并将它们拷贝至 deploy 目录.

主线内核

下载:

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

切出 v3.8.x 分支 (支持所有Cape):

~/bb-kernel
git checkout origin/am33x-v3.8 -b tmp

或切出 v3.18.x 分支 (支持SGX 并且对 usb & ethernet有更好的支持):

~/bb-kernel
git checkout origin/am33x-v3.18 -b tmp

TI BSP

警告: 如果你没有经常rebase你分支的习惯, 由于该源码是基于 http://git.ti.com/gitweb/?p=ti-linux-kernel/ti-linux-kernel.git;a=shortlog;h=refs/heads/ti-linux-3.14.y,是稳定内核的一个替代. 因此你必须经常做如下操作: (git checkout master -f ; git branch -D tmp ; git pull ; git checkout origin/ti-linux-3.14.y -b tmp) .

下载:

~/
git clone https://github.com/RobertCNelson/ti-linux-kernel-dev/
cd ti-linux-kernel-dev/
~/ti-linux-kernel-dev
git checkout origin/ti-linux-3.14.y -b tmp

编译:

~/ti-linux-kernel-dev
./build_kernel.sh

根文件系统

Debian 7

User

Password

debian

temppwd

root

root

这个镜像包含Systemd: https://wiki.debian.org/systemd, 打开systemd,添加下列参数到uEnv.txt:

optargs=quiet init=/lib/systemd/systemd

下载:

~/
wget -c https://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armhf-2014-11-10.tar.xz

验证:

~/
md5sum debian-7.7-minimal-armhf-2014-11-10.tar.xz
edee8eef5fa47ed2427a01ddf2f726c8  debian-7.7-minimal-armhf-2014-11-10.tar.xz

解压:

~/
tar xf debian-7.7-minimal-armhf-2014-11-10.tar.xz

Debian 8 (pre-release)

User

Password

debian

temppwd

root

root

下载:

~/
wget -c https://rcn-ee.net/deb/minfs/jessie/debian-jessie-minimal-armhf-2014-11-10.tar.xz

验证:

~/
md5sum debian-jessie-minimal-armhf-2014-11-10.tar.xz
09e703c97167a4d072b44c54dc00b784  debian-jessie-minimal-armhf-2014-11-10.tar.xz

解压:

~/
tar xf debian-jessie-minimal-armhf-2014-11-10.tar.xz

Ubuntu 14.04.1

User

Password

ubuntu

temppwd

下载:

~/
wget -c https://rcn-ee.net/deb/minfs/trusty/ubuntu-14.04.1-minimal-armhf-2014-11-10.tar.xz

验证:

~/
md5sum ubuntu-14.04.1-minimal-armhf-2014-11-10.tar.xz
7e5fa3cb4814f195d75cbaad6d922090  ubuntu-14.04.1-minimal-armhf-2014-11-10.tar.xz

解压:

~/
tar xf ubuntu-14.04.1-minimal-armhf-2014-11-10.tar.xz

根文件系统 (精简版)

64M大小的根文件系统, 适用于烧写应用.

Debian 7 (small flash)

User

Password

debian

temppwd

root

root

下载:

~/
wget -c https://rcn-ee.net/deb/barefs/wheezy/debian-7.7-bare-armhf-2014-11-10.tar.xz

验证:

~/
md5sum debian-7.7-bare-armhf-2014-11-10.tar.xz
f8f221d7336e4cea5325d9e151a46c72  debian-7.7-bare-armhf-2014-11-10.tar.xz

解压: 

~/
tar xf debian-7.7-bare-armhf-2014-11-10.tar.xz

设置 microSD/SD 卡

对于下面的指令, 我们假设: DISK=/dev/mmcblk0, 对于决定设备ID, "lsblk" 是非常有用的.

export DISK=/dev/mmcblk0

擦除 microSD/SD 卡:

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

安装 Bootloader:

~/
sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 conv=notrunc bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 conv=notrunc bs=384k

创建分区:

sudo sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__
1,,0x83,*
__EOF__

格式化分区:

for: DISK=/dev/mmcblk0
sudo mkfs.ext4 ${DISK}p1 -L rootfs
 
for: DISK=/dev/sdX
sudo mkfs.ext4 ${DISK}1 -L rootfs

挂载分区:

在一些系统上, 这些分区可能会自动被挂载...

sudo mkdir -p /media/rootfs/
 
for: DISK=/dev/mmcblk0
sudo mount ${DISK}p1 /media/rootfs/
 
for: DISK=/dev/sdX
sudo mount ${DISK}1 /media/rootfs/

备份 Bootloader

复制 MLO/u-boot.img 到boot目录

~/
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/

处理eMMC中老的bootloader

如果你不想清除eMMC中的老的bootloader,添加下面uEnv.txt到 /media/rootfs/ 中

~/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
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 -v ./uEnv.txt /media/rootfs/

安装内核和根文件系统

由于内核版本每天都可能有变化,为了帮助新的用户,本页列出的内核编译脚本将会给出你所编译内核的版本。

-----------------------------
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=3.X.Y-Z]
-----------------------------

复制并粘贴你自己编译环境中显示的"export kernel_version=3.X.Y-Z"确切信息,然后按回车键创建一个环境变量,这个变量随后会用到。

export kernel_version=3.X.Y-Z

复制根文件系统

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

创建 /boot/uEnv.txt

提示:使用开发板对应的Device Tree文件,下面以操作以BeagleBone-Black为例,所以fdtfile=am335x-boneblack.dtb。

~/
sudo mkdir -p /media/rootfs/boot/
sudo sh -c "echo 'uname_r=${kernel_version}' > /media/rootfs/boot/uEnv.txt"
sudo sh -c "echo 'fdtfile=am335x-boneblack.dtb' > /media/rootfs/boot/uEnv.txt"

Debian /boot/uEnv.txt (启用 systemd)

~/
sudo sh -c "echo 'cmdline=quiet init=/lib/systemd/systemd' >> /media/rootfs/boot/uEnv.txt"

复制内核文件

Kernel Image:

~/
mainline:
sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}
 
bsp:
sudo cp -v ./ti-linux-kernel-dev/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

内核 Device Tree 二进制文件:

~/
sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
 
mainline:
sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/
 
bsp:
sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

内核模块:

~/
mainline:
sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/
 
bsp:
sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

文件系统表 (/etc/fstab)

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

网络

编辑: /etc/network/interfaces

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

添加如下内容:

/etc/network/interfaces
auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet dhcp

网络: 多个BeagleBone共享同一张SD卡

 总是启用Ethernet接口作为 eth0.

编辑文件: /etc/udev/rules.d/70-persistent-net.rules

sudo nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules

添加:

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

串口登录

Debian

/etc/inittab
sudo sh -c "echo 'T0:23:respawn:/sbin/getty -L ttyO0 115200 vt102' >> /media/rootfs/etc/inittab"

Ubuntu

创建新文件: /etc/init/serial.conf

sudo nano /media/rootfs/etc/init/serial.conf

添加如下内容:

/etc/init/serial.conf
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
 
respawn
exec /sbin/getty 115200 ttyO0

 从主机上移除 microSD/SD 卡:

sync
sudo umount /media/rootfs

usb gadget

支持通过usb使用http访问BeagleBone-Black.

安装 udhcpd

sudo apt-get install udhcpd

编辑: /etc/network/interfaces 并添加如下内容:

/etc/network/interfaces
# Ethernet/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.0
    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

HDMI

本段内容假设你已经安装你最喜欢的基于xorg的窗口管理器,例如lxde,xfce,kde,gnome等等。有一些安装包需要在你选择窗口管理器之前被安装,并且需要一个xorg.conf配置文件来正确的设置视频接口。

提示: 如果光标没有立即显示出来,首先按下 ctlr-alt-f1 ,然后: ctrl-alt-f7 ,此后光标应该已经显示...

确定已经安装, modesetting 驱动 和 xrandr 工具:

sudo apt-get update
sudo apt-get install read-edid xserver-xorg-video-fbdev xserver-xorg-video-modesetting x11-xserver-utils
/etc/X11/xorg.conf
Section "Monitor"
        Identifier      "Builtin Default Monitor"
EndSection
Section "Device"
        Identifier      "Builtin Default fbdev Device 0"
        Driver          "fbdev"
#        Driver          "modesetting"
EndSection
Section "Screen"
        Identifier      "Builtin Default fbdev Screen 0"
        Device          "Builtin Default fbdev Device 0"
        Monitor         "Builtin Default Monitor"
        DefaultDepth    16
#Chipsee lcd7 bbb-exp-c:
#        DefaultDepth    24
EndSection
Section "ServerLayout"
        Identifier      "Builtin Default Layout"
        Screen          "Builtin Default fbdev Screen 0"
EndSection

xrandr:

xrandr
xrandr --output HDMI-0 --mode 1024x768 --rate 60

xrandr (通过 serial/ssh)

xrandr -display :0.0 -q
xrandr -display :0.0 --output HDMI-0 --mode 1024x768 --rate 60

eMMC

这个脚本用来复制你的microSD卡的系统到板子上的eMMC中: (这个脚本需要安装以下包: initramfs-tools dosfstools rsync )

 

wget https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-ext4.sh
chmod +x bbb-eMMC-flasher-eewiki-ext4.sh
sudo /bin/bash ./bbb-eMMC-flasher-eewiki-ext4.sh

 

SGX

编译 SGX 模块/用户空间程序 (必须在x86系统上做这些操作,这是因为 TI 5.01.01.01 blob extractor)

~/bb-kernel
./sgx_build_modules.sh

复制 ./deploy/GFX_5.01.01.01.tar.gz 到 BeagleBone/BeagleBone Black 并安装

sudo tar xfv GFX_5.01.01.01.tar.gz -C /
cd /opt/gfxinstall/
sudo ./sgx-install.sh
sudo reboot

验证 omaplfb & pvrsrvkm模块是否加载

debian@arm:~$ lsmod | grep omaplfb
omaplfb                12065  0
pvrsrvkm              178782  1 omaplfb

SGX Demos

cd /opt/gfxsdkdemos/ogles2/
./OGLES2ChameleonMan

常见问题(FAQ)

BeagleBone Black Angstrom usb 网络加载失败

dmesg 将出现类似如下错误:

[    5.179269] g_multi: `' invalid for parameter `C7'

原因:

hexdump有个功能,就是将重复字符替换为*, 因此读出来的MAC地址不正确:

hexdump -e '1/1 "%02X" ":"' /proc/device-tree/ocp/ethernet@4a100000/slave@4a100300/mac-address
90:59:AF:5C:*
C7:root@beaglebone:~#
hexdump -v -e '1/1 "%02X" ":"' /proc/device-tree/ocp/ethernet@4a100000/slave@4a100300/mac-address
90:59:AF:5C:5C:C7:root@beaglebone:~#
/usr/bin/g-ether-load.sh
mac_address="/proc/device-tree/ocp/ethernet@4a100000/slave@4a100300/mac-address"
if [ -f ${mac_address} ] ; then
    DEV_ADDR=$(hexdump -e '1/1 "%02X" ":"' ${mac_address} | sed 's/.$//')
else

添加一个 "-v" 到hexdump调用中.

/usr/bin/g-ether-load.sh
mac_address="/proc/device-tree/ocp/ethernet@4a100000/slave@4a100300/mac-address"
if [ -f ${mac_address} ] ; then
    DEV_ADDR=$(hexdump -v -e '1/1 "%02X" ":"' ${mac_address} | sed 's/.$//')
else

补丁通告:

https://github.com/beagleboard/meta-beagleboard/pull/12


1 0