一、准备前工作
屏蔽部分代码创建.vscode/settings.json文件
{
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.o":true,
"**/*.su":true,
"**/*.cmd":true,
"Documentation":true,
/* 屏蔽不用的架构相关的文件 */
"arch/alpha":true,
"arch/arc":true,
"arch/arm64":true,
"arch/avr32":true,
"arch/[b-z]*":true,
"arch/arm/plat*":true,
"arch/arm/mach-[a-h]*":true,
"arch/arm/mach-[n-z]*":true,
"arch/arm/mach-i[n-z]*":true,
"arch/arm/mach-m[e-v]*":true,
"arch/arm/mach-k*":true,
"arch/arm/mach-l*":true,
/* 屏蔽排除不用的配置文件 */
"arch/arm/configs/[a-h]*":true,
"arch/arm/configs/[j-z]*":true,
"arch/arm/configs/imo*":true,
"arch/arm/configs/in*":true,
"arch/arm/configs/io*":true,
"arch/arm/configs/ix*":true,
/* 屏蔽掉不用的 DTB 文件 */
"arch/arm/boot/dts/[a-h]*":true,
"arch/arm/boot/dts/[k-z]*":true,
"arch/arm/boot/dts/in*":true,
"arch/arm/boot/dts/imx1*":true,
"arch/arm/boot/dts/imx7*":true,
"arch/arm/boot/dts/imx2*":true,
"arch/arm/boot/dts/imx3*":true,
"arch/arm/boot/dts/imx5*":true,
"arch/arm/boot/dts/imx6d*":true,
"arch/arm/boot/dts/imx6q*":true,
"arch/arm/boot/dts/imx6s*":true,
"arch/arm/boot/dts/imx6ul-*":true,
"arch/arm/boot/dts/imx6ull-9x9*":true,
"arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
},
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/*.o":true,
"**/*.su":true,
"**/*.cmd":true,
"Documentation":true,
/* 屏蔽不用的架构相关的文件 */
"arch/alpha":true,
"arch/arc":true,
"arch/arm64":true,
"arch/avr32":true,
"arch/[b-z]*":true,
"arch/arm/plat*":true,
"arch/arm/mach-[a-h]*":true,
"arch/arm/mach-[n-z]*":true,
"arch/arm/mach-i[n-z]*":true,
"arch/arm/mach-m[e-v]*":true,
"arch/arm/mach-k*":true,
"arch/arm/mach-l*":true,
/* 屏蔽排除不用的配置文件 */
"arch/arm/configs/[a-h]*":true,
"arch/arm/configs/[j-z]*":true,
"arch/arm/configs/imo*":true,
"arch/arm/configs/in*":true,
"arch/arm/configs/io*":true,
"arch/arm/configs/ix*":true,
/* 屏蔽掉不用的 DTB 文件 */
"arch/arm/boot/dts/[a-h]*":true,
"arch/arm/boot/dts/[k-z]*":true,
"arch/arm/boot/dts/in*":true,
"arch/arm/boot/dts/imx1*":true,
"arch/arm/boot/dts/imx7*":true,
"arch/arm/boot/dts/imx2*":true,
"arch/arm/boot/dts/imx3*":true,
"arch/arm/boot/dts/imx5*":true,
"arch/arm/boot/dts/imx6d*":true,
"arch/arm/boot/dts/imx6q*":true,
"arch/arm/boot/dts/imx6s*":true,
"arch/arm/boot/dts/imx6ul-*":true,
"arch/arm/boot/dts/imx6ull-9x9*":true,
"arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
}
}
二、内核移植
使用 NXP 官方提供的 Linux 源码—linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。将其移植到开发板上。
使 用 “ mv ” 命 令 对 其 重 命 名 , 我 这 里 将 其 重 命 名 为 “my_linux”,命令如下:
mv linux-imx-rel_imx_4.1.15_2.1.0_ga my_linux
一、修改顶层 Makefile
修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两
个的变量值为 arm 和 arm-linux-gnueabihf-,结果如图所示:
二、配置并编译 Linux
进入到 Ubuntu 中的 Linux 源码根目录下,执行如下命令配置 Linux 内核:
make clean //第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig //配置 Linux 内核
make -j16 //编译 Linux 内核
Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树
的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件,比如 imx6ull-14x14-evk.dtb就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件:
①、Linux 内核镜像文件:zImage。
②、NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件:imx6ull-14x14-evk.dtb。
三、Linux 内核启动测试
将得到了 NXP 官方 开发板对应的 zImage 和 imx6ull-14x14-evk.dtb 这两个文件。这两个文件能不能在开发板上启动呢?测试一下不就知道了,在测试之前确保 uboot 中的环境变量 bootargs 内容如下:
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
将编译出来的 zImage 和 imx6ull-14x14-evk.dtb 复制到 Ubuntu 中的 tftp 目录下,
因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中,拷贝命令如下:
cp arch/arm/boot/zImage /home/zjs/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/zjs/linux/tftpboot/ -f
拷贝完成以后就可以测试了,启动开发板,进入 uboot 命令行模式,然后输入如下命令将
zImage 和 imx6ull-14x14-evk.dtb 下载到开发板中并启动:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
结果如下:
从图 中 可以看出,此时 Linux 内核已经启动了,如果 EMMC 中的根文件系统存在,
我们就可以进入到 Linux 系统里面使用命令进行操作;根文件系统丢失!!!
四、在Linux中添加自己的开发板
1. 添加开发板默认配置文件
将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为
imx_my_emmc_defconfig,命令如下:
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
2. 添加开发板对应的设备树文件
进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-my-emmc.dts,命令如下:
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-my-emmc.dts
.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-my-emmc.dts
创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-
$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-my-emmc.dtb” ,如下
所示:
第 422 行为“imx6ull-my-emmc.dtb”,这样编译 Linux 的时候就可以从 imx6ull-my-
emmc.dts 编译出 imx6ull-my-emmc.dtb 文件了。
3. 编译测试
经过 上面的步骤,Linux 内核里面已经添加了我们的 开 发 板 了 , 接 下 接 编 译 测 试 一 下 , 我 们 可 以 创 建 一 个 编 译 脚 本 ,imx6ull_my_emmc.sh,脚本内容如下:
执行 shell 脚本 imx6ull_my_emmc.sh 编译 Linux 内核,命令如下:
chmod 777 imx6ull_my_emmc.sh //给予可执行权限
./imx6ull_my_emmc.sh //执行 shell 脚本编译内核
编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录
下生成 imx6ull-my-emmc.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在
uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:
tftp 80800000 zImage
tftp 83000000 imx6ull-my-emmc.dtb
bootz 80800000 – 83000000
只要出现如图 所示内容就表示 Linux 内核启动成功:
Linux 内核启动成功,说明我们已经在 NXP 提供的 Linux 内核源码中添加了我们的开发板。