Cubieboard2 A20 SD卡启动及根文件系统制作

系统环境Ubuntu-12.04 x86_64
安装arm-linux-gnueabihf-gcc编译环境

$ apt-get install arm-linux-gnueabihf-gcc
$ arm-linux-gnueabihf-gcc –version
arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

源码下载:

$ git clone http://github.com/linux-sunxi/u-boot-sunxi.git
$ git clone http://github.com/cubieboard/linux-sunxi -b cubie/sunxi-3.4.91
$ git clone http://github.com/linux-sunxi/sunxi-tools.git
$ git clone http://github.com/linux-sunxi/sunxi-boards.git

其中linux内核去cubieboard的github下载(注:未使用文档中说的cubieboard2的github地址http://github.com/cubieboard/linux-sunxi),使用较新的cubie/sunxi-3.4.91分支

编译uboot

$ cd u-boot-sunxi
$ make distclean CROSS_COMPILE=arm-linux-gnueabihf-
$ make Cubieboard2 CROSS_COMPILE=arm-linux-gnueabihf-

得到u-boot-sunxi-with-spl.bin

编译kernel

$ cd linux-sunxi
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- cubieboard2_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage modules

得到内核文件 arch/arm/boot/uImage

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=pwd/out
将modules安装到out目录

生成 boot.scr和script.bin


u-boot在启动的时候会在第一个分区(FAT/extX格式)寻找/boot.scr或者/boot/boot.scr文件,boot.scr中可以包含用
于载入script.bin,kernel,initrd(可选)以及设置内核启动参数的uboot命令。
参考 https://github.com/linux-sunxi/u-boot-sunxi/wiki#bootscr-support

$ cat boot.cmd
setenv bootargs console=ttyS0,115200 noinitrd disp.screen0_output_mode=EDID:1280x1024p60 init=/sbin/init root=/dev/mmcblk0p2 rootfstype=ext4 rootwait panic=10
fatload mmc 0 0x43000000 boot/script.bin
fatload mmc 0 0x48000000 boot/uImage
bootm 0x48000000

详细解释:
1.上述第一行设置uboot的bootargs启动参数,格式为 参数=值,不同参数使用空格分开,其中
console=ttyS0,115200 含义为使用特定的串口ttyS0,波特率为 115200
noinitrd 含义为不使用ramdisk(内存磁盘)
init=/init 含义为内核启起来后,进入系统中运行的第一个脚本
root=/dev/mmcblk0p2 含义为指定rootfs的位置为TF卡第二个分区
rootfstype=ext4 含义为根文件系统类型
rootwait 含义为等待设备/dev/mmcblk0p2就绪后才尝试挂载rootfs
panic=10 传递内核参数,当遇到panic(内核严重错误)时等待10秒后重启
screen0_output_mode 设置合适的屏幕显示分辨率
更多的参数可以通过查看Linux内核源码目录下Documentation/kernel-parameters.txt文件了解

2.第二行和第三行为将script.bin和内核uImage加载到指定内存地址。fatload是U-Boot中装载linux kernel 到内存的指令。
基本用法:fatload <interface> <dev[:part]> <addr> <filename> <bytes>
interface:所用到接口,如:MMC、USB
dev [:part]: 文件存放的设备 如:ide 0:1
addr: 装载到内存的开始地址。
filename: 装载的文件名称。
bytes: copy的字节数.

3.第四行bootm 从指定的地址加载内核映像

$ mkimage -C none -A arm -T script -d boot.cmd boot.scr
得到boot.scr
$ cd sunxi-tools
$ make
生成fex2bin、bin2fex工具

$ cd sunxi-boards/sys_config/a20
找到[nand_para],将nand_used设为0,(根据网友经验,sd卡启动后系统会写nand数据,导致nand上的android无法启动)
$ fex2bin cubieboard2.fex script.bin
得到script.bin

 

烧写uboot和kernel到TF卡


A20 芯片上电启动的时候,会读取SD卡最前面的 1M 内容,从而得到 bootloader,所以我们需要把 u-boot 写到SD卡的前1M区间。

SD卡布局:

起始

大小

用途

0

8KB

存放分区表等内容

8KB

24KB

SPL Loader

32KB

512KB

u-boot

544KB

128KB

environment

672KB

352KB

保留

1024KB

-

剩余分区空间


$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1   # 把SD卡前1M的区域填充为0,预留给 u-boot
$ sudo fdisk /dev/sdb

使用fdisk将sd卡分成两个primary分区,分区1分配64M空间,分区2使用全部剩余空间,并将分区1标记为可引导分区

$ sudo mkfs.vfat /dev/sdb1
$ sudo mkfs.ext4 /dev/sdb2
$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 #跳过分区表

$ sudo mount /dev/sdb1 mnt1
$ sudo mkdir mnt1/boot
$ sudo cp linux-sunxi/arch/arm/boot/uImage mnt1/boot/
$ sudo cp sunxi-boards/sys_config/a20/script.bin mnt1/boot/
$ sudo cp boot.scr mnt1/
$ sudo umount mnt1
在Mac下可以用diskutil(下面方法不成功):

$ diskutil unmountDisk /dev/disk3
$ sudo dd if=/dev/zero of=/dev/disk3 bs=1m count=1
$ diskutil partitionDisk /dev/disk3 MBR FAT32 CUBIE1 64m FAT32 CUBIE2 0b
$ diskutil unmountDisk /dev/disk3
$ sudo fdisk -e /dev/disk3
fdisk: 1> flag 1
Partition 2 marked active.
fdisk:1> setpid 2
Partition id (‘0’ to disable) [0 - FF]: [B] (? for help) 83
fdisk:
1> quit

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/disk3 bs=1024 seek=8
$ sudo dd if=image_20140731/mmcblk0p1.img of=/dev/disk3s1 bs=2m
$ sudo dd if=image_20140731/mmcblk0p2.img of=/dev/disk3s2 bs=2m

制作根文件系统

# feel free to change distro to raring/saucy/.. as appropriate for later Ubuntu version or wheezy for Debian
$ export distro=precise
mount /dev/sdb2 mnt2

you can add –variant=buildd to install a compiler in your chroot at debootstrap time but using apt is probably faster

$ sudo debootstrap –arch=armhf –foreign $distro pwd/mnt2/
$ sudo cp /usr/bin/qemu-arm-static mnt2/usr/bin/
$ sudo chroot mnt2

I have no name!# /debootstrap/debootstrap –second-stage

chroot . passwd

配置apt sources.list

# cat /etc/apt/sources.list
deb http://ports.ubuntu.com/ precise main universe
deb-src http://ports.ubuntu.com/ precise main universe
deb http://ports.ubuntu.com/ precise-security main universe
deb-src http://ports.ubuntu.com/ precise-security main universe
deb http://ports.ubuntu.com/ precise-updates main universe
deb-src http://ports.ubuntu.com/ precise-updates main universe

更新并安装程序

# apt-get update

apt-get install vim …

配置网络

# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

#iface eth0 inet static

#address 192.168.1.203

#netmask 255.255.255.0

#gateway 192.168.1.1

更改配置文件

ubuntu系统须更改tty1.conf

# vi /etc/init/tty1.conf
exec /sbin/getty -8 38400 tty1 修改为: exec /sbin/getty -8 115200 ttyS0

debain系统须更改这两个文件:inittab和fstab

# cd /etc/

cat <<EOT >> inittab

> T0:2345:respawn:/sbin/getty -L ttyS0 115200 linux
> EOT

cat <<EOT >> fstab

> proc /proc proc defaults 0 0
> /dev/mmcblk0p1 /boot vfat defaults 0 2
> /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
> EOT

清理

# rm /usr/bin/qemu-arm-static /etc/resolv.conf /etc/hostname

touch /etc/resolv.conf

cat <<EOF >> /etc/hostname

> cubieboard
> EOF

拷贝linux modules


先运行exit退出前面的chroot

$ sudo cp linux-sunxi/out/lib/* mnt2/lib/
$ sudo umount mnt2

至此根文件系统制作完毕

将sd卡插入cubieboard上电启动,cubieboard2_boot_log
自己build的android image的启动log对比:cubieboard2_android_boot_log

参考文档


A10/A20 Bootloader加载过程分析
Bootable SD card
制作Banana Pi最小系统
Manual build howto
从头制作硬盘上的ubuntu 12/13
CT Lubuntu Desktop/Server SD Card Installation

PDF格式下载

Cubieboard A20 制作SD卡启动
Using debootstrap to make Ubuntu based distributions
从头制作硬盘上的ubuntu 12_13(参考ubuntu根文件系统制作)
CT Lubuntu Desktop_Server SD Card Installation

Cubieboard2靓照


cubieboard A20 正面 cubieboard A20 反面