本文适用于COM-P6UL模块,内核使用Device Tree的情况下。主要讲解如何安装交叉编译链,如何编译U-BooT,如何编译内核和dtb文件,如何制作根文件系统等!
注:rootfs的size根据Nand大小而定,其值为Nand大小减去0x1480000,即减去前面kernel等分区所占用的空间后剩余空间大小。如表格中所示为256MB的Nand中rootfs分区的size:0x10000000-1480000=0xeb80000,其中0x10000000=256M。512mB的Nand的rootfs分区大小为:0x20000000-0x1480000=0x1eb80000此外Nand存在坏块,实际大小小于或等于理论值。
说明:EVB-P6UL包含2片32MB的QSPI NorFlash,一片做为系统启动媒介,一片用于数据储存。由于容量有限,系统镜像文件要充分考虑存储空间是否足够。
编译准备
为了编译更为简便,在出厂的光盘中整理好编译所需的文件,您只需将编译器解压到指定目录,再执行Makefile中的相关编译指令。此外,您还可以自行搭建编译环境。光盘中的文件如下图所示:
dts:/fsl-release-bsp/imx6ul/arch/arm/boot/dts/
uboot:/ fsl-release-bsp/uboot-imx
kernel:/fsl-release-bsp/imx6ul
filesystem:/fsl-release-bsp/rootfs_qt
注:以上文件编译完成后,都会复制到/fsl-release-bsp/image。
所有的镜像文件都依赖于“/fsl-release-bsp/Makefile”,编译前先检查Makefile的规则,尤其是路径和文件名。列出Makefile的内容,如下图所示:
Makefile中包含了“Rules.make”文件 ,查看Rules.make的内容。
Rules.make指定了相关的路径,特别注意“DIR_TOOLS”,该参数指定编译器的路径。默认的环境变量为/fsl-release-bsp/tools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-,将“gcc-linaro-arm-linux-gnueabihf-4.9.tar.bz2”文件解压至“/fsl-release-bsp/tools”目录,交叉编译链安装完成。若您需要更改编译器的路径,更改Rules.make文件即可。
安装交叉编译工具链到指定路径之后,还需对编译的脚本 Env.sh做简单了解,在编译前先执行该脚本。脚本的内容下图所示:
编译uboot
在EVB-P6UL上,编译u-boot可用两种方法实现,分别为简易编译和单步编译。
简易编译uboot
本小结按照Makefile中的规则,介绍如何编译uboot。
a、解压交叉编译工具链
$ tar -jxvf gcc-linaro-arm-linux-gnueabihf-4.9.tar.bz2
注意:如“编译准备”中所述,交叉编译工具链必须安装到/fsl-release-bsp/tools目录。
b、解压uboot源码
$ tar -jxvf uboot-imx.tar.bz2
c、解压完成后,在fsl-release-bsp目录执行 . Env.sh:
$ . Env.sh
注意:执行 . Env.sh 后,终端提示符发生变化。环境变量在当前console下有效,即dtb、内核亦可在当前终端编译,而不需要再执行 . Env.sh。下文中的操作均在当前console中进行,不需再运行 Env.sh脚本。
d、执行makeu-boot.imx,编译uboot
$ makeu-boot.imx
编译的好的uboot自动复制到fsl-release-bsp/image目录下,文件名为u-boot.imx。
单步编译uboot
安装交叉编译链、Uboot源码与简易编译uboot的步骤一样,请参考上文,不再累述。
a、进入uboot源码目录,生成配置文件。
$ cduboot-imx
$ makemx6ul_14x14_ddr3_arm2_nand_defconfig
注:EVB-P6UL一共有三种配置,区别在于存储媒介不同,分别有eMMC、Nand、QSPI Nor,配置文件如下:
l mx6ul_14x14_ddr3_arm2_emmc_defconfig // eMMC的配置文件
l mx6ul_14x14_ddr3_arm2_nand_defconfig //Nand的配置文件
l mx6ul_14x14_ddr3_arm2_qspi1_defconfig //QSPI Nor Flash的配置文件
需要编译不同的uboot,根据存储媒介生成配置,make 配置文件名即可。执行以上指令后,在当前目录会生成一个 .config 的隐藏文件,如下图所示:
b、编译uboot。
$ make
执行make后,在当前目录生成 u-boot.imx,至此uboot编译完成。
编译内核
在EVB-P6UL上,编译内核可用两种方法实现,分别为简易编译和单步编译。
简易编译内核
本小结按照Makefile中的规则,介绍如何编译内核。
uboot编译完成后,将uboot-imx/tools目录下的mkimage复制到PC的/usr/sbin目录,编译内核生成内核镜像时用到此工具。
$ sudo cp mkimage /usr/sbin/
a、解压内核源码
$ tar -jxvf imx6ul.tar.bz2
b、编译内核镜像
$ make zImage
编译的好的kernel自动复制到fsl-release-bsp/image目录下,文件名为zImage。
单步编译内核
拷贝内核制作工具mkimage、解压源码,请参考简易编译uboot 当中的介绍,以下简单介绍单步编译内核。
a、生成配置文件
在/fsl-release-bsp/imx6ul目录有一个EVB-P6UL的配置文件,文件名为“imx6ul_config”,此配置为出厂默认配置。执行以下命令,将默认配置设为本次编译内核的配置。
$ cpimx6ul_config .config //在内核源码目录(/fsl-release-bsp/imx6ul)下执行
同时,您亦可定制符合自己配置文件,执行以下命令。
$ make xxx_defconfig //在内核源码目录(/fsl-release-bsp/imx6ul)下执行,defconfig 标志值来至/fsl-release-bsp/imx6ul/arch/arm/configs/xxx_defconfig,在此不做介绍。
b、编译内核
$ makezImage -j4 // -j4,表示使用4线程编译zImage
编译dtb
编译dtb的方法亦有两种,简易编译和单步编译。执行简易编译前,先查看Makefile中的dtb文件与 “/fsl-release-bsp/imx6ul/arch/arm/boot/dts”目录下的文件是否同名(文件名相同,后缀不同)。
简易编译dtb
本小结按照Makefile中的规则,介绍如何编译dtb。
a、执行 make dtb
编译的好的dtb自动复制到fsl-release-bsp/image目录下,文件名为*.dtb。
说明:如果您想使用自己开发dtb ,按以下步骤实现。
a、将dts文件复制到/fsl-release-bsp/imx6ul/arch/arm/boot/dts目录下
b、在sdk目录(fsl-release-bsp)打开Makefile文件,在此使用vi打开
$ viMakefile
c、下图红线标注部分改为与dts一致的文件名
注意:Makefile中的文件名后缀为.dtb,而/fsl-release-bsp/imx6ul/arch/arm/boot/dts目录的文件为*.dts,两者要对应。图片中存放在dts目录的文件为evbp6ul-nand-res-4uarts-csi.dts
单步编译dtb
a、将目标dts文件拷贝至 /fsl-release-bsp/imx6ul/arch/arm/boot/dts目录,以evbp6ul-nand-res-4uarts-csi.dts为例。
$ cp evbp6ul-nand-res-4uarts-csi.dts/fsl-release-bsp/imx6ul/arch/arm/boot/dts
b、编译dtb
$ make evbp6ul-nand-res-4uarts-csi.dtb //在内核源码目录(../fsl-release-bsp/imx6ul)下执行
完成后,在../fsl-release-bsp/imx6ul/arch/arm/boot/dts目录下生成与dts名对应的dtb文件。
制作UBFS根文件系统
使用脚本制作UBIFS根文件系统
Makefile依赖于rootfs_qt目录下./build脚本,在制作文件系统之前先进行相关配置。先单步制作烧录镜像,确认没问题之后在使用脚本。ubi工具可自行移植或使用光盘提供的。
a、生成ubifs镜像
(注:此操作需安装mtd-utils工具,在光盘fsl-release-bsp\rootfs_qt下有提供fedora/ubuntu编译好的相关工具,可拷贝到PC机的linux系统下使用.也可自己编译mtd-utils生成mkfs.ubifs,具体编译过程见附录1)
$mkfs.ubifs -F -r rootfs -m 2048 -e 126976 -c 2047 -o ubifs_256.img
参数说明:
-F: 特殊标志位,使第一次挂载文件系统时修整Nandflash剩余空间,以防文件系统认为ECC错误;
-r rootfs: 制定镜像的源文件(rootfs);
-m 2048:页面大小,由Nandflash属性决定(evbp6l使用的nangdflash为MT29F2G08,其page 大小为2048,2KB);
-e 126976:逻辑擦除块大小。MT29F2G08的block size为131072(128KB),但每个block前两个 page分别用来存放ubi的EC Header和VID header,因此逻辑擦除块大小为:
131072-2*2048=126976;
-c 2047: 用于ubi的最大逻辑擦除块数量。
-o ubifs_256.img:生成的镜像文件名(可自定义)。
b、建立ubinize.cfg文件,文件内容如下:
[ubifs]
mode=ubi
image=ubifs_256.img //上一步生成的根文件系统镜像
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
(注ubifs_256.img和ubinize_256.cfg须放到同一文件夹下)
c、生成烧录镜像
$ ubinize -o rootfs_256.ubi -m 2048 -p128KiB -s 512 -O 2048 ubinize_256.cfg
参数说明:
-o root.bin:生成的根文件系统烧录镜像文件(名称可自定义,但用SD卡自动烧录时u-boot默认 文件名为root.bin)
-m 2048: 页面大小,由Nandflash属性决定(evb335x使用的nangdflash为K9F2G08,其页面大小 为2048B,2KB);
-p 128KiB:物理擦除块大小,由Nandflash属性决定(K9F2G08每个block大小为128KB);
-s 512: sub-page大小,由Nandflash属性决定(K9F2G08每个page包含4个sub-page,每个
sub-page为512B);
-O 2048: 存放VID header的起始位置,(每个block第0个page存放EC header,第1个page
存放VIDheader,每个page大小为2048B,因此VID header的起始位置为2048)。
单步制作UBIFS根文件系统
a、进入根文件系统目录
$ cd rootfs_qt
b、生成ubifs镜像
$ mkfs.ubifs -F-r rootfs -m 2048 -e 126976 -c 2047 -o ubifs_256.img
注:若使用脚本(例如,build_256)生成ubifs镜像,脚本必须具有可执行权限,或使用bash执行。
c、建立ubinize.cfg文件,文件内容如下:
[ubifs]
mode=ubi
image=ubifs_256.img //上一步生成的根文件系统镜像
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
(注ubifs_256.img和ubinize_256.cfg须放到同一文件夹下)
c、生成烧录镜像
$ ubinize -o rootfs_256.ubi -m 2048 -p128KiB -s 512 -O 2048 ubinize_256.cfg
制作JFFS2根文件系统 QSPI Nor Flash的容量小,且其特性更适合使用jffs2格式的文件系统,因此采用jffs2。下面jffs2介绍jffs2根文件系统的制作方法。mkfs.jffs2工具可自行移植或使用光盘提供的。
a、解压根文件系统源文件
$ tar -jxvf rootfs_mini_qspi.tar.bz2
b、生成根文件系统镜像
$ mkfs.jffs2 -s 0x1000 -e 0x10000 -p 0x1600000 -d rootfs_mini_qspi/ -n-l -o rootfs.jffs2
执行以上指令后,在当前目录生成 rootfs.jffs2 ,至此jffs2镜像制作完毕。
mkfs.jffs2参数说明:
-s 0x1000 页大小,由Nor Flash属性决定(N25Q256A的每个pagesize为4KB,-s参数的默认值为4KB)
-e 0x10000 擦除块大小,由Nor Flash属性决定(N25Q256A的eraseblock大小为64KB)
-p 0x1600000 指定jffs2文件的大小,若目标文件大小小于指定值,则以0xFF填充。若不指定目标文件大小,则用0xFF填充所有的擦除块。
-d rootfs_mini_qspi/指定制作jffs2根文件系统的目录
-n 清除标识
-l 存储模式(字节顺序),此处为小端模式(little-endian)。若不指定存储模式,则与制作jjffs2的主机相同。
-o rootfs.jffs2 生成镜像的文件名
制作jffs2根文件系统的指令在光盘资料有对应的脚本,执行脚本能更快速地生产目标文件。同时,您可以根据自身需求更改脚本。