http://www.swiftboard.org/wiki/index.php?title=Linux_ROM#.E6.89.93.E5.8C.85ROM
本文主要介绍如何为swiftboard(以下简称sw)定制一个Linux发行版ROM.
本教程假定读者有Linux基础,了解常用命令工具
目录[隐藏]
|
通常,一个Linux ROM由 bootloader, linux kernel 和 rootfs 构成.在全志平台上,ROM中还包含一个硬件配置文件(script.bin),主要用于描述外设参数以及与SoC之间连接.
sw上有一般两种方式引导系统, 板载的NAND和外接的TF卡.这两种方式的ROM除了bootloader和打包方式不同外,并无太大区别.两种方式的ROM制作本文均会涉及,有区别之处会分别介绍.
需要的开发环境:
下载针对sw修改过的kernel代码 [1]
下载内核配置文件 .config ,改名为".config"后放入代码根目录
cd 代码所在目录 #编译内核及模块 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules #新建模块输出目录 mkdir output #安装模块到输出目录 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules_install
本节以linaro ubuntu为例,其他发行版操作类似.
下载linux发行版的rootfs并解压 linaro ubuntu 13.04
#请确保解压时使用root权限,否则某些文件无法创建 sudo tar -xvf linaro-quantal-alip-20130422-342.tar.gz
进入rootfs的根目录后,复制上一节产生的内核模块
sudo cp -r 内核代码目录/output/lib .
新建显示驱动配置文件 usr/share/X11/xorg.conf.d/99-fbdev.conf
Section "Device" Identifier "Allwinner A10/A13 FBDEV" Driver "fbdev" Option "fbdev" "/dev/fb0" EndSection
修改启动加载模块列表 etc/modules
ump disp mali mali_drm 8188eu
新建无线网卡参数配置文件 etc/modprobe.d/8188eu.conf
# Workaround for dropping connections because power save options 8188eu rtw_power_mgnt=0 rtw_enusbss=0
你还可以对rootfs进一步定制,现在对rootfs的修改都将反映到最终生成的ROM中
sys_config1.fex是全志设计的用于描述设备连接的配置文件,格式简单易懂,可以使用文本编辑器修改.
本教程使用的文件修改自swiftboard官方的共享.
从这里下载后保存为sys_config1.fex
fex文件需要转为二进制格式才能被内核读取,因此需要转换(制作NAND版ROM可以跳过此步骤,打包时会自动转换)
fex2bin sys_config1.fex >script.bin
我们选用u-boot作为ROM的bootloader, 对于TF和NAND版ROM使用不同的u-boot
git clone https://github.com/linux-sunxi/u-boot-sunxi.git cd u-boot-sunxi git checkout v2013.07-sunxi make 'Cubieboard' CROSS_COMPILE=arm-linux-gnueabihf-
编译成功后会得到 spl/sunxi-spl.bin u-boot.bin 两个文件
参考说明
从这里下载lichee版u-boot
进入代码目录,编译
make distclean && make sun4i CROSS_COMPILE=arm-linux-gnueabihf-
编译成功后将得到u-boot.bin文件
为了制作ROM,我们首先要准备一个空白磁盘(不是分区),这个磁盘的所有内容(包括分区表)将被完全复制到最终的TF卡上.
考虑到实际的可操作性,我们用一个虚拟磁盘镜像文件替代物理磁盘.所以我们要先生成一个包含分区表的磁盘镜像文件.
#生成一个空白文件.大小为1750M(由于存储厂商克扣容量,1800M就是2G卡实际容量,设小一点是为了踏实一些),可根据实际情况调整. dd if=/dev/zero of=tf.img bs=1M count=2048 #把镜像文件映射到loop设备上 sudo losetup /dev/loop0 tf.img #分区(共两个分区,一个引导用分区,存放kernel和fex配置;另一个是根分区) sudo sfdisk --in-order -L -uS /dev/loop0 <<-EOT 2048,131072,c ,,L EOT #把分区从磁盘中映射出来,生成loop0p1, loop0p2设备 sudo kpartx -av /dev/loop0 #格式化两个分区(注意,在某些发行版上,上一步映射出的设备文件位置可能不同,需调整) sudo mkfs.vfat -I /dev/mapper/loop0p1 sudo mkfs.ext4 /dev/mapper/loop0p2
至此,虚拟磁盘准备完毕.现在不忙卸载loop设备,因为我们还要往里面复制文件.
首先复制引导分区的文件
sudo mount /dev/mapper/loop0p1 /mnt sudo cp kernel目录/arch/arm/boot/uImage /mnt sudo cp fex所在目录/script.bin /mnt sudo umount /mnt
接着复制根分区文件
sudo mount /dev/mapper/loop0p2 /mnt cd rootfs目录 sudo cp -a * /mnt sudo umount /mnt
解除分区映射
sudo kpartx -d /dev/loop0
然后向虚拟磁盘中写入u-boot (u-boot位于第一个分区前的未分区空间中)
cd u-boot所在目录 sudo dd if=spl/sunxi-spl.bin of=/dev/loop0 bs=1024 seek=8 sudo dd if=u-boot.bin of=/dev/loop0 bs=1024 seek=32
最后卸载loop设备
sudo losetup -d /dev/loop0
大功告成! tf.img就是最终生成的ROM镜像文件了
NAND版ROM打包需要使用全志的打包工具 [2] 进入打包工具所在目录后
cd a10/out cp u-boot目录/u-boot.bin . cp kernel目录/arch/arm/boot/uImage boot.img #创建分区镜像文件 dd if=/dev/zero of=rootfs.ext4 bs=1M count=1907 mkfs.ext4 rootfs.ext4 #复制rootfs文件 sudo mount -o loop rootfs.ext4 /mnt sudo cp -a rootfs目录/* /mnt sudo umount /mnt cd ../tools/pack #复制fex配置文件 cp fex目录/sys_config1.fex chips/sun4i/configs/linux/default/sys_config1.fex #最后运行打包程序 ./pack -c sun4i -p linux -b evb -B nand
如果打包成功,最后会输出一行红字,显示产生的img的位置
直接将img文件写入TF卡即可,windows用户可使用win32DiskImager工具,linux/mac用户可使用dd工具
按LiveSuit烧写固件指引操作即可