Cubieboard arm-linux 移植

Author :  曾亚坚  
E-mail :  shmily@mail.dlut.edu.cn

1、u-boot 移植

获取Cubieboard的u-boot源代码

git clone https://github.com/linux-sunxi/u-boot-sunxi.git --depth=1

编译u-boot,得到 u-boot 、spl/sunxi-spl.bin
在 board/allwinner/ 目录下有该芯片对应的不同配置,我们使用的是cubieboard

make cubieboard CROSS_COMPILE=arm-linux-gnueabihf-

2、script.bin 编译

这个文件对A10芯片进行配置的二进制文件,好像是内核启动后读取的,但是不清楚具体实现是怎么做到的。

下载sunxi-tools源码,编译

git clone https://github.com/linux-sunxi/sunxi-tools.git --depth=1
cd sunxi-tools
make

得到 fex2bin 文件,这个是能把 .fex 文件生成.bin文件。

下载sunxi-boards源码,得到cubieboard对于的fex文件

git clone https://github.com/linux-sunxi/sunxi-boards.git --depth=1
cd sunxi-boards

在 sys_config/a10 目录下,我们能找到 cubieboard_1gb.fex 文件,这就是我们需要的
编译,得到 script.bin

fex2bin cubieboard_1gb.fex script.bin

3、制作可启动的SD卡

参考自:
wiki:http://linux-sunxi.org/Bootable_SD_card
wiki:http://linux-sunxi.org/FirstSteps

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

假设在host上,我们的sd卡是 /dev/sdb

  • 对SD卡进行分区处理

    dd if=/dev/zero of=/dev/sdb bs=1M count=1	# 前1M的区域填充为0,预留给 u-boot 和 spl/sunxi-spl.bin
    
    sfdisk -R /dev/sdb							# 重新读取/dev/sdb,因为我们已经改变了sdb
    
    cat <<EOT | sfdisk -uM /dev/sdb				# 对sd卡进行分区,具体请参照sfdisk命令手册
    1,16,c 										# 从SD卡的1M处开始,划分16M长度为第一个分区
    18,,L 										# 余下的空间为第二个分区 (参考网站上使用的是 17,,L,这是错误的,重叠了)
    EOT
    
    mkfs.vfat /dev/sdb1							# 格式化为fat
    mkfs.ext4 /dev/sdb2 						# 格式化为ext4
  • 写入 bootloader

    dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8
    dd if=u-boot.bin of=/dev/sdb bs=1024 seek=32
  • 安装内核 uImage,设置启动参数

    安装 uImage

    mount /dev/sdb1 /mnt
    mkdir /mnt/boot
    cp linux-sunxi/arch/arm/boot/uImage /mnt/boot
    cp script.bin /mnt/boot

    设置启动参数 新建 boot.cmd 文件,文件内容如下

    setenv bootargs console=ttyS0,115200 noinitrd 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.cmd 生成 u-boot能读取的 boot.scr 文件

    mkimage -C none -A arm -T script -d boot.cmd boot.scr

    把 boot.scr 拷贝到sd卡的第一个分区

    cp boot.scr /mnt/								# 之前我们已经把 /dev/sdb1 挂载在 /mnt 上
  • 关于 uEnv.txt

    老版本的 u-boot 是可以直接读取boot.scr,但是新版本的貌似不支持,但是可以通过 uEnv.txt 间接读取boot.scr,
    当然,也可以直接使用 uEnv.txt 编写启动参数。

    我使用的 uEnv.txt

    bootenv=boot.scr
    loaduimage=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
    mmcboot=echo Running boot.scr script from mmc ...; source ${loadaddr}

4、内核编译

git clone https://github.com/linux-sunxi/linux-sunxi.git

make ARCH=arm sun4i_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=output modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=output modules_install

5、根文件系统

我使用的是 buildroot-2012.08 建立的文件系统,只需要生成 rootfs 就行了,kernel 与 toolschain 使用外置的,
不需要使用 buildroot 生成。



Published

11 November 2012

Tags