一、开发环境
- 嵌入式 Linux 开发板:100ASK-6ULL-V11(即:由百问网出品的 i.MX6ULL-PRO);
- 系统:Ubuntu 18.04(已配置交叉编译工具链);
- 待移植的 Linux 内核:由 NXP 官方维护的 imx_5.4.47_2.2.0。
二、下载待移植的 Linux 内核源码
可以使用以下命令:
git clone https://github.com/nxp-imx/linux-imx
cd linux-imx
git branch -a
git checkout remotes/origin/imx_5.4.47_2.2.0
NXP 官方的项目集合了多个版本的 Linux 内核,项目较大,如果多次克隆失败的话,也可以通过韦东山老师的仓库来克隆:
git clone https://gitee.com/weidongshan/linux-imx
cd linux-imx
git reset 63736cb7c46268a6e6aab654ad3849d85d5581a0 --hard
三、移植 Linux 内核
1. 建立单板相关配置
建立单板的配置文件:
cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_angus_defconfig
为了方便,我们使用由百问网制作的基于Linux 4.9.88 内核的设备树文件来适配大多数设备,然后再对无法驱动的设备单独处理:
cp ~/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dts arch/arm/boot/dts/imx6ull-14x14-angus.dts
修改设备树文件imx6ull-14x14-angus.dts
的对应项为:
&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
xceiver-supply = <®_can_3v3>;
status = "okay";
};
在编译设备树的文件arch/arm/boot/dts/Makefile
中添加我们的板子:
2. 适配触摸屏、蓝牙和 WiFi 驱动
触摸屏驱动
同样,拷贝之前的触摸屏驱动程序到对应文件夹:
cp -rfd ~/100ask_imx6ull-sdk/Linux-4.9.88/drivers/input/touchscreen/gt9xx/ ./drivers/input/touchscreen/
在文件drivers/input/touchscreen/Makefile
的结尾处添加:
obj-$(CONFIG_TOUCHSCREEN_GT9XX) += gt9xx/
在文件drivers/input/touchscreen/Kconfig
中引入触摸屏的 Kconfig:
在文件arch/arm/configs/imx_v7_angus_defconfig
中添加对应项:
蓝牙和 WiFi 驱动
由于暂时用不到蓝牙和 WiFi,因此我们没有做出适配。
对这部分有兴趣的话可以参考 i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0 和百问网的改动自行尝试。
3. 编译 Linux 内核、设备树,启动开发板
编译并将得到的Linux 内核和设备树文件拷贝至 TFTP 目录:
make distclean
make imx_v7_angus_defconfig
make zImage -j4
make dtbs
cp arch/arm/boot/zImage ~/tftpboot/
cp arch/arm/boot/dts/imx6ull-14x14-angus.dtb ~/tftpboot/
启动开发板并进入 U-Boot,设置相关的环境变量:
setenv fdt_file imx6ull-14x14-angus.dtb // 设置需要下载的设备树文件名称
setenv ip_dyn no // 关闭自动配置 IP
setenv serverip 10.10.10.30 // 设置服务器的 IP 地址
setenv ipaddr 10.10.10.30 // 设置开发板的 IP 地址
saveenv
启动后加载 eMMC 中原有的根文件系统
由于我们还没有制作自己的根文件系统,可以暂时使用 eMMC 中已有的根文件系统来启动 Linux,配置环境变量bootargs
:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
通过 TFTP 下载 Linux 内核和设备树:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-angus.dtb
bootz 80800000 - 83000000
成功启动开发板!
使用命令uname -a
查看内核版本:
确实是5.4.47
!
启动后加载新构建的根文件系统
当我们按照下一篇《i.MX6ULL 开发板系统移植与根文件系统构建(三):根文件系统的构建》制作好新的根文件系统后,可以尝试通过 NFS 挂载新构建的根文件系统。
根据实际情况设置环境变量bootargs
:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=10.10.10.30:/home/book/nfs_rootfs/buildrootfs,v3,tcp rw ip=10.10.10.31:10.10.10.30:10.10.10.10:255.255.0.0::eth0:off'
saveenv
同样通过 TFTP 下载 Linux 内核和设备树:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-angus.dtb
bootz 80800000 - 83000000
可以看出,开发板的根文件系统确实是通过 NFS 挂载的:
完工!
参考资料
[1] https://github.com/nxp-imx/linux-imx/tree/imx_5.4.47_2.2.0
[2] https://gitee.com/weidongshan/linux-imx
[3] 正点原子【第三期】手把手教你学Linux之系统移植和根文件系统构建篇
[4] i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0