参考了http://mer.jolladev.net/wiki.php?id=%E5%90%AF%E5%8A%A8cubieboard2%E5%88%B0linux_kernel和tll大神的How to make a cubieboard system文档
第一步:下载kernel代码并编译
git clone git://github.com/linux-sunxi/linux-sunxi
配置并编译:
Gerneral setup ->Cross Compilter too prefix 这里填arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- cubieboard2_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf--j4 INSTALL_MOD_PATH=output modules_install
如果成功,在/arch/arm/boot/目录下会有uImage,在output下会有lib目录
第二步:下载uboot代码并编译
git clone git://github.com/linux-sunxi/u-boot-sunxi.git
make distclean CROSS_COMPILE=arm-linux-gnueabihf-
make Cubieboard2 CROSS_COMPILE=arm-linux-gnueabihf-
如果成功,会在主目录下有u-boot.bin,在spl目录有u-boot-spl.bin
第三步:生成boot.scr
boot.scr是什么?
根据资料描述(https://github.com/linux-sunxi/u-boot-sunxi/wiki#bootscr-support),u-boot在启动的时候会在第一个分区(FAT/extX格式)寻找/boot.scr或者/boot/boot.scr文件,boot.scr中可以包含用于载入script.bin,kernel,initrd(可选)以及设置内核启动参数的uboot命令。
boot.cmd如何生成?
在$WORK_DIR目录新建 boot.cmd 文件,添加以下内容:
setenv bootargs console=ttyS0,115200 noinitrd disp.screen0_output_mode=EDID:1280x1024p60 init=/init root=/dev/mmcblk0p2 rootfstype=ext4 rootwait panic=10 ${extra}
fatload mmc 0 0x43000000 boot/script.bin
fatload mmc 0 0x48000000 boot/uImage
bootm 0x48000000
生成boot.scr:
kimage -C none -A arm -T script -d boot.cmd boot.scr
第四步:生成script.bin
git clone git://github.com/linux-sunxi/sunxi-tools.git,这个下载的是生成上次script所需要的工具
git clone git://github.com/linux-sunxi/sunxi-boards.git这个是板子对应的资源列表
编译工具:
cd $WORK_DIR/sunxi-toolsmake
产生script.bin
cd $WORK_DIR/sunxi-boards/sys_config/a20
$WORK_DIR/sunxi-tools/fex2bin cubieboard2.fex script.bin
这样就把制作需要的东西都准备好了,接下来就是把刚才这些拷贝到tf卡中
A20 芯片上电启动的时候,会读取SD卡最前面的 1M 内容,从而得到 bootloader,所以我们需要把 u-boot 写到SD卡的前1M区间。
其中详细的SD卡布局如下:
起始 | 大小 | 用途 |
---|---|---|
0 | 8KB | 存放分区表等内容 |
8 | 24KB | SPL loader |
32 | 512KB | u-boot |
544 | 128KB | environment |
672 | 352KB | 保留 |
1024 | - | 用于剩余分区 |
可以看到,应该把刚uboot编译产生的u-boot-spl.bin 这个文件拷贝到8k这个位置,把u-boot.bin 放到32k这个位置
话说要先给tf卡分区
具体分区步骤如下:
建立第一个分区
root@kubuntu:~/src/u-boot-sunxi# fdisk ${card} Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x911332e8. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n #键入n然后回车 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): #直接回车 Using default response p Partition number (1-4, default 1): #直接回车 Using default value 1 First sector (2048-15278079, default 2048): #直接回车 Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-15278079, default 15278079): +64M #键入+64M后回车,即分区大小为64M
建立第二个分区
Command (m for help): n #键入n然后回车 Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): #直接回车 Using default response p Partition number (1-4, default 2): #直接回车 Using default value 2 First sector (133120-15278079, default 133120): #直接回车 Using default value 133120 Last sector, +sectors or +size{K,M,G} (133120-15278079, default 15278079): #直接回车,即第二个分区使用全部剩余空间 Using default value 15278079
接下来指定分区类型:
Command (m for help): t #键入t然后回车 Partition number (1-4): 1 #键入1然后回车,即指定第一个分区 Hex code (type L to list codes): c #键入c然后回车,即指定第一个分区为vfat Changed system type of partition 1 to c (W95 FAT32 (LBA)) Command (m for help): w #键入w然后回车,保存分区表 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
格式化分区:
mkfs.vfat ${card}1 mkfs.ext4 ${card}2
然后写入bootloader:
cd $WORK_DIR/u-boot-sunxi dd if=u-boot-sunxi-with-spl.bin of=$card bs=1024 seek=8
最后安装内核 uImage,设置启动参数:
mount ${card}1 /mnt mkdir /mnt/boot cp $WORK_DIR/linux-sunxi/arch/arm/boot/uImage /mnt/boot cp $WORK_DIR/sunxi-boards/sys_config/a20/script.bin /mnt/boot cp $WORK_DIR/boot.scr /mnt/ sync && umount /mnt
制作文件系统
wget http://busybox.net/downloads/busybox-1.21.1.tar.bz2
tar -jxvf busybox-1.21.1.tar.bz2
cd busybox-1.21.1
make menuconfig ARCH=arm
这边设置一下:busybox settings->build option->Cross Compiler prefix arm-linux-gnueabihf-
make
make install
将文件系统拷贝到tf第二分区
mount /dev/sdb2 /mnt
cp -r _instll/* /mnt
cp -r examples/bootfloppy/etc /mnt
cd /mnt
mkdir dev proc sys var home tmp mnt run boot boot2 dev/pts
删除fstab,并重新编辑
rm etc/fstab;
nano etc/fstab;
chmod 777 etc/fstab;
编辑
proc /proc proc nosuid,nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
/dev/mmcblk0p1 /boot2/ vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,notime 0 2