提示:将 NXP官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板,并对CPU 主频和网络驱动修改
文章目录
前言
1、判断内核移植完对不对,只要两个网口都能ping通虚拟机就行,因为开发板直连电脑ping不同百度是正常的
2、uboot移植完屏幕应该显示的是NXP的logo,Linux内核移植完正常是在左上方显示企鹅,如果不显示在59.4运行测试有交如何显示。
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建VSCode工程
1、将NXP官方的linux内核拷贝到Ubuntu,路径是/home/zero/linux/IMX6ULL/linux
2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
使用 FileZilla 将其发送到 Ubuntu中并解压,得到名为 linux-imx-rel_imx_4.1.15_2.1.0_ga 的目录,为了和 NXP 官方的名字区分,
可 以 使 用 “ mv ” 命 令 对 其 重 命 名 , 我 这 里 将 其 重 命 名 为 “ linux-imxrel_imx_4.1.15_2.1.0_ga_alientek”,命令如下:
mv linux-imx-rel_imx_4.1.15_2.1.0_ga linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
创建vscode,打开 linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek文件夹,并将工作区另存为LINUX,将.vscode/settings.json复制到vscode工作区中,.vscode/settings.json目的是屏蔽一些文件。
二、NXP 官方开发板 Linux 内核编译
测试NXP官方的LINUX内核能不能在自己开发板运行,一般都是可以的
和 uboot 一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认配 置 文 件 , 这 些 默 认 配 置 文 件 保 存 在 arch/arm/configs 目 录 中 。 imx_v7_defconfig 和imx_v7_mfg_defconfig 都可作为 I.MX6ULL EVK 开发板所使用的默认配置文件。但是这里建议使用 imx_v7_mfg_defconfig 这个默认配置文件,首先此配置文件默认支持 I.MX6UL 这款芯片,而且重要的一点就是此文件编译出来的 zImage 可以通过 NXP 官方提供的 MfgTool 工具烧写!!
imx_v7_mfg_defconfig 中的“mfg”的意思就是 MfgTool。
1 创建imx6ull-14x14-evk.sh脚本,输入以下代码
编译NXP官方EVK开发板对应的Linux系统,默认配置文件存放路径arch/arm/configs里面的imx_v7_mfg_defconfig
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (空格)imx_v7_mfg_defconfig// imx_v7_mfg_defconfig 是配置文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4
给imx6ull-14x14-evk.sh 权限,执行./imx6ull-14x14-evk.sh 脚本
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。
2 配置并编译 Linux 内核
为了不清理工程,可以修改Makefile,修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两
个的变量值为 arm 和 arm-linux-gnueabihf-,结果如图所示:
进入到 Ubuntu 中的 Linux 源码根目录下,执行如下命令配置 Linux 内核:
make clean //第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig //配置 Linux 内核
配置完成以后如图
配置完成以后就可以编译了,使用如下命令编译 Linux 内核:
make -j16 //编译 Linux 内核
等待编译完成,结果
最终编译出:zImage,和 imx6ull-alientek-emmc.dtb,imx6ull-14x14-evk.dtb。
将zImage,和 imx6ull-alientek-emmc.dtb拷贝到tftpboot目录下,然后在uboot中通过tftp服务启动。
将编译出来的 zImage(在arch/arm/boot/) 和imx6ull-alientek-emmc.dtb(arch/arm/boot/dts/) 复制到 Ubuntu 中的 tftp 目录下,因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中,拷贝命令如下:
cp arch/arm/boot/zImage /home/zero/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/zero/linux/tftpboot/ -f
下载zImage文件
tftp 80800000 zImage
下载.dtb文件
tftp 83000000 imx6ull-alientek-emmc.dtb
启动
bootz 80800000 - 83000000
经过测试,发现NXP官方开发板对应的zImage和.dtb可以在正点原子开发板上启动。
Linux启动遇到上述错误,那是因为没有跟文件系统
三 在 Linux 中添加自己的开发板
通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在正点原子的 EMMC 版本开发板启动,所以我们就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。
需要: 一个是imx6u_alientek_emmc_defconfig默认配置文件
另一个是imxull_alientek_emmc.dts编译出来的.dtb文件
将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为imx_alientek_emmc_defconfig,
进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-alientek-emmc.dts,
1 添加开发板默认配置文件
将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为imx_alientek_emmc_defconfig,命令如下:
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
打开 imx_alientek_emmc_defconfig 文件,找到“CONFIG_ARCH_MULTI_V6=y”这一行,将其屏蔽掉,因为 I.MX6ULL 是 ARMV7 架构的,因此要屏蔽掉 V6 相关选项,否则后面做驱动实验的时候可能会遇到驱动模块无法加载的情况。以后 imx_alientek_emmc_defconfig 就是正点原子的 EMMC 版开发板默认配置文件了。
以后就可以使用如下命令来配置正点原子 EMMC 版开发板对应的 Linux 内核了:
make imx_alientek_emmc_defconfig
2 添加开发板对应的设备树文件
添加适合正点原子 EMMC 版开发板的设备树文件,进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-alientek-emmc.dts,命令如下:
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts
.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-alientek-emmc.dts创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-alientek-emmc.dtb” ,如下所示:
第 422 行为“imx6ull-alientek-emmc.dtb”,这样编译 Linux 的时候就可以从 imx6ull-alientekemmc.dts 编译出 imx6ull-alientek-emmc.dtb 文件了。
3 编译测试
前两个小节, Linux 内核里面已经添加了正点原子 I.MX6UL-ALIPHAEMMC 版 开 发 板 了 , 接 下 接 编 译 测 试 一 下 , 我 们 可 以 创 建 一 个 编 译 脚 本 ,imx6ull_alientek_emmc.sh,脚本内容如下:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4
第 2 行,清理工程。
第 3 行,使用默认配置文件 imx_alientek_emmc_defconfig 来配置 Linux 内核。
第 4 行,打开 Linux 的图形配置界面,如果不需要每次都打开图形配置界面可以删除此行。
第 5 行,编译 Linux。
执行 shell 脚本 imx6ull_alientek_emmc.sh 编译 Linux 内核, 命令如下:
chmod 777 imx6ull_alientek_emmc.sh //给予可执行权限
./imx6ull_alientek_emmc.sh //执行 shell 脚本编译内核
编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-alientek-emmc.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 – 83000000
所示内容就表示 Linux 内核启动成功:
四 CPU 主频和网络驱动修改
1 修改驱动前要先保证板子能正常启动
2 跟文件系统处理好,使用现成跟文件系统。保证EMMC烧写了系统,(正点原子里面有系统,没有的画自己烧进去就行)设置bootcmd、bootargs
1 板子正常启动
设置bootcmd
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;'
saveenv
直接复位 倒计时结束后自动下载zImage和.dtb设备树文件
设置bootargs,跟文件系统存放在EMMC的分区2里面,命令如下
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' //mmcblk1代表EMMC设备,p2代表第二个分区
saveenv
boot //启动
内核有问题
将imx6ull-14x14-evk-emmc.dts中的&usdhc2复制并替换掉imx6ull-alientek-emmc.dts,原因是imx6ull-alientek-emmc.dts节点信息太少
&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
non-removable;
status = "okay";
};
编译设备树
make dtbs//编译所有设备树都修改好的
将新生成的.dtb设备树复制到tftpboot目录下并下载
2 CPU主频修改
有两种修改方法,一种修改 imx_alientek_emmc_defconfig 文件,另一种修改图形化界面
查看信息用 cat + 指令
2.1 修改 imx_alientek_emmc_defconfig 文件
输入如下命令查看 cpu 信息:
cat /proc/cpuinfo
有 BogoMIPS 这一条,此时 BogoMIPS 为 12.00, BogoMIPS 是 Linux 系统中衡量处理器运行速度的一个“尺子”,处理器性能越强,主频越高, BogoMIPS 值就越大。BogoMIPS 只是粗略的计算 CPU 性能,并不十分准确。但是我们可以通过 BogoMIPS 值来大致的判断当前处理器的性能。在图 中并没有看到当前 CPU 的工作频率,那我们就转变另一种方法查看当前 CPU 的工作频率。进入到目录/sys/bus/cpu/devices/cpu0/cpufreq 中,此目录下如图会有很多文件,
cd /sys/bus/cpu/devices/cpu0/cpufreq
ls
cat cpuinfo_cur_freq // 当前 CPU 频率:
使用如下命令查看当前 CPU 频率:
cat cpuinfo_cur_freq
查看 stats 目录下的 time_in_state 文件可以看到 CPU 在各频率下的工作时间,命令如下
cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state
假如我们想让 CPU 一直工作在 792MHz 那该怎么办?很简单,配置 Linux 内核,将调频策略选择为 performance。或者修改 imx_alientek_emmc_defconfig 文件,此文件中有下面几行:
修改完成以后重新编译 Linux 内核,编译之前先清理一下工程!因为我们重新修改过默认配 置文 件了, 编译 完成以 后使 用新 的 zImage 镜 像文 件重新 启动 Linux。再 次查 看/sys/devices/system/cpu/cpu0/cpufreq/ cpuinfo_cur_freq 文件的值,
2.2 修改图形化界面
我们再来看一下如何通过图形化界面配置 Linux 内核的 CPU 调频策略,输入“ makemenuconfig”打开 Linux 内核的图形化配置界面,如图
在linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek下输入 :make menuconfig
//路径
CPU Power Management
-> CPU Frequency scaling
-> Default CPUFreq governor
编译
make -j4
结果
将zImage复制到tftpboot目录下,重新启动开发板
cp arch/arm/boot/zImage /home/zero/linux/tftpboot/ -f
查看 cpu 信息:
cat /proc/cpuinfo
查看当前 CPU 频率:
cd /sys/bus/cpu/devices/cpu0/cpufreq
ls
cat cpuinfo_cur_freq // 当前 CPU 频率:
查看 stats 目录下的 time_in_state 文件可以看到 CPU 在各频率下的工作时间,命令如下:
cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state
五 修改EMMC驱动
找到&usdhc2,并修改如下,在之前已经修改了
&usdhc2 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2_8bit>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};
六 修改网络驱动
按正点原子手册来,最后只有网口2可以ping通虚拟机,baidu也ping不同,网口1是都不行,不知道为什么,过程这里就不写了,也不知道影响后面操作不,有知道原因的可以告诉我,谢谢
修改:接网络1后要等一会才能ping通,但baidu依然不通,屏幕也是黑屏