定制一个Linux发行版ROM

http://www.swiftboard.org/wiki/index.php?title=Linux_ROM#.E6.89.93.E5.8C.85ROM


本文主要介绍如何为swiftboard(以下简称sw)定制一个Linux发行版ROM.

本教程假定读者有Linux基础,了解常用命令工具

目录

 [隐藏] 
  • 1 ROM介绍
  • 2 开发环境准备
  • 3 编译kernel
  • 4 准备rootfs
  • 5 fex配置文件
  • 6 编译bootloader
    • 6.1 TF版ROM
    • 6.2 NAND版ROM
  • 7 打包ROM
    • 7.1 TF版ROM
    • 7.2 NAND版ROM
  • 8 ROM的使用
    • 8.1 TF版ROM
    • 8.2 NAND版ROM

ROM介绍

通常,一个Linux ROM由 bootloader, linux kernel 和 rootfs 构成.在全志平台上,ROM中还包含一个硬件配置文件(script.bin),主要用于描述外设参数以及与SoC之间连接.

sw上有一般两种方式引导系统, 板载的NAND和外接的TF卡.这两种方式的ROM除了bootloader和打包方式不同外,并无太大区别.两种方式的ROM制作本文均会涉及,有区别之处会分别介绍.

开发环境准备

需要的开发环境:

  • 版本较新的Linux发行版(如ubuntu 12.04),制作NAND版ROM必须用64位系统(全志打包工具要求)
  • 64位系统安装 ia32-libs
  • 必须的build工具集(make,gcc等) build-essential
  • 交叉编译器 gcc-arm-linux-gnueabihf
  • uImage制作工具 uboot-mkimage
  • 全志fex编译工具 fex2bin (链接)

编译kernel

下载针对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

准备rootfs

本节以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中

fex配置文件

sys_config1.fex是全志设计的用于描述设备连接的配置文件,格式简单易懂,可以使用文本编辑器修改.

本教程使用的文件修改自swiftboard官方的共享.

从这里下载后保存为sys_config1.fex

fex文件需要转为二进制格式才能被内核读取,因此需要转换(制作NAND版ROM可以跳过此步骤,打包时会自动转换)

fex2bin sys_config1.fex >script.bin

编译bootloader

我们选用u-boot作为ROM的bootloader, 对于TF和NAND版ROM使用不同的u-boot

TF版ROM

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 两个文件

参考说明

NAND版ROM

从这里下载lichee版u-boot

进入代码目录,编译

make distclean && make sun4i CROSS_COMPILE=arm-linux-gnueabihf-

编译成功后将得到u-boot.bin文件

打包ROM

TF版ROM

为了制作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

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的位置

ROM的使用

TF版ROM

直接将img文件写入TF卡即可,windows用户可使用win32DiskImager工具,linux/mac用户可使用dd工具

NAND版ROM

按LiveSuit烧写固件指引操作即可


你可能感兴趣的:(Linux)