一、官方开发板内核测试
1.修改顶层Makefile
2.配置并编译官方内核
3、启动测试
将编译出来的zImage和imx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot 的tftp命令将其下载到开发板中。
在测试之前确保uboot中的环境变量bootargs内容如下(在UBOOT命令模式下使用print指令查看):
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
如果不是的话,可以使用如下指令设置一下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
然后可以测试了,启动开发板,串口中进入uboot命令行模式,然后输入如下命令将zImage和imx6ull-14x14-evk.dtb下载到开发板中并启动:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
可以看到内核启动了
4、根文件系统缺失的错误
Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。
因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?
我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下:
setenv bootargs 'console=ttymxc0,115200'
saveenv
修改完成以后重新从网络启动,可以看到也是先启动了内核:
但启动以后会有类似如下的错误:
最后会有下面这一行:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,目录不存在。即使目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。
二、在Linux中添加自己的开发板
在上一节中我们通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在正点原子的 EMMC 版本开发板启动,所以我们就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。
1 参照官方配置文件添加开发板默认配置文件
将arch/arm/configs
目录下的imx_v7_mfg_defconfig
重新复制一份 , 命名为自己开发板,如imx_myboard_defconfig
。
之后配置此开发板的内核命令就可以是:
make imx_myboard_defconfig
2 添加开发板对应的设备树文件
进入arch/arm/boot/dts
目录中,复制一份imx6ull-14x14-evk.dts
,然后将其重命名为imx6ull-myboard.dts
。
然后还需要修改文件arch/arm/boot/dts/Makefile
,找到 dtb-$(CONFIG_SOC_IMX6ULL)
配置项,在此配置项中加入“imx6ull-myboard.dtb” :
这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。
总结一下以上的修改主要包括:
主要就是对文件复制一份并重命名,(配置文件中可能还需修改,比如说屏蔽掉“CONFIG_ARCH_MULTI_V6=y”这一行,这一行是V6架构的相关选项),还要修改Makefile文件,添加设备树配置。
三、编译测试
新建一个build_myboard.sh,写入如下内容:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
chmod 777 build_myboard.sh //给予可执行权限
./build_myboard.sh //执行 shell 脚本编译内核
四、CPU主频和网络驱动修改
修改驱动之前,要先保证板子能正常启动,所以表明根文件系统也要处理好,此时自己的根文件系统还没移植,所以在这先使用emmc中现成的根文件系统。
开始设置bootcmd、bootargs环境变量,bootcmd设置默认从网络启动
Setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-myboard.dtb ;bootz 80800000 – 83000000;'
setenv bootargs 'console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw'
在这里可能自己的emmc的驱动会有问题,需要先照着原板设备树节点修改自己的设备树。
一)EMMC驱动修改
正点原子 EMMC 版本核心板上的 EMMC 采用的 8 位数据线,Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文件 imx6ull-myboard.dtb,把emmc设备节点更换成原厂的8bit的。
二)CPU主频修改
三)网络驱动修改
资料来源:i.MX6ULL嵌入式Linux开发3-Kernel移植 - 知乎