IMX6ULL官方linux移植
1.开发环境
- gcc: 100ask_imx6ull-sdk\ToolChain\gcc-linaro-6.2.1-2016.11-x86_64_arm-linux- gnueabihf
- linux: linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
- 主机系统: ubuntu18.04
gcc可以在百问网提供的bsp包找到,uboot使用的是nxp官方的uboot, 点击下载Linux。
2.编译下载NXP官方Linux
2.1 编译官方Linux
- nxp官方提供的linux是用于官方的evk开发板,需要参考官方的代码来移值,解压linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。
tar -jxvf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
- 修改顶层Makefile,加入ARCH和CROSS_COMPILE变量,不然每次编译都需指定,很麻烦,将252,253行注释掉。添加后如下:
ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf-
- 配置并编译Linux。进入源码根目录,执行:
make distclean make imx_v7_mfg_defconfig /* 此文件为nxp官方evk板的配置文件,编译完后zImage支持mfg烧写 */ make -j12
编译完后会生成arch/arm/boot/zImage和arch/arm/boot/dts/imx6ull-14x14-evk.dtb,这两个文件是我们需要的。编译时间跟机器配置有关,我用的I7-9750,16G内存编译了大概5分钟。make clean和make distclean的区别:make clean仅仅是清除之前编译的可执行文件及配置文件。而make distclean要清除所有生成的文件。
2.2 通过tftp下载测试官方的Linux
linux在启动后,需要一个根文件系统,可以使用100ASK官方提供的根文件系统,然后使用tftp从ubuntu中下载之前编译好的官方Linux,最后通过bootz来启动Linux。
- 先通过100ask提供的100ask_imx6ull_flashing_tool下载整个系统到EMMC中,然后将之前移值好的uboot下载到开发板中,可以使用烧写裸机的方法来烧写u-boot.imx。烧写完成后,启动开发板,串口输出如下:
可以看到开发板没有启动成功,原因是在mmc里面的文件系统识别不了,所以加载不了linux内核和设备树,然后uboot从网络启动,但是没有设置ip地址。 - 设置ipaddr,serverip等环境变量,在uboot命令行执行:
setenv ipaddr 192.168.101.6 //开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址
setenv gatewayip 192.168.101.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.101.5 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量
- 设置好后,连接网线到开发板(开发板网线接在路由器上),ubuntu中设置好tftp服务器,并将刚才编译好的arch/arm/boot/zImage和arch/arm/boot/dts/imx6ull-14x14-evk.dtb复制到tftp目录下,然后在uboot中执行:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
下载完后还需要设置bootargs环境变量,该环境变量是在内核启动时传给内核的,其指定了使用哪一个控制台,根文件系统在哪里等信息,内核启动后使用该环境变量指定的根文件系统来启动系统。设置bootargs:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
设置根文件系统root=/dev/mmcblk1p2,即mmc1上的分区2,并且可读可写,rootwait表示等待mmc准备好再挂载,这就是之前下载的100ask提供的根文件系统。如果不设置root项,内核会打印根文件系统缺失错误:
设置好bootargs后运行:
bootz 80800000 - 83000000
等一会儿后,串口输出:
就可以进入系统了,看前面的内核输出,网络也可以使用了,试着ping一下百度,也可以ping通,说明官方的内核网络直接就可以在100ask开发板上使用,查看一下内核启动过程的输出信息,找到如下信息:
说明内核使用的是Generic PHY驱动,即通用PHY驱动,移值uboot的时候说过,PHY芯片的前16个寄存器功能都是一样的,所以内核使用通用驱动能够驱动100ask开发板上面的LAN8720A,但是100ask上的LAN8720复位引脚和nxp官方的evk开发板是不一样的,为什么还能驱动呢?我猜可能是再uboot中已经复位过LAN8720A了,所以内核可以直接使用。但是在后面使用nfs网络文件系统的时候,网络就会有问题了,到时候再修改网络驱动吧。其实主要就是修改复位引脚和复位函数。
3.移值NXP官方Linux
测试完官方linux后发现,网络驱动是可以使用的,那就先不修改网络驱动了,接下来就是添加自己的配置文件等信息。
3.1 添加开发板配置文件和设备树文件
- 添加开发板配置文件,进入arch/arm/configs目录,复制一份imx_v7_mfg_defconfig并重命名为imx_100ask_emmc_defconfig
- 添加开发板设备树文件。进入arch/arm/boot/dts目录,复制一份imx6ull-14x14-evk.dts并重命名为imx6ull-100ask-emmc.dts
- 在Makefile中加入imx6ull-100ask-emmc.dts,打开arch/arm/boot/dts/Makefile,在
dtb-$(CONFIG_SOC_IMX6ULL)项加入imx6ull-100ask-emmc.dtb,添加后如下:
dtb-$(CONFIG_SOC_IMX6ULL) += \
imx6ull-14x14-ddr3-arm2.dtb \
imx6ull-14x14-ddr3-arm2-adc.dtb \
imx6ull-14x14-ddr3-arm2-cs42888.dtb \
imx6ull-14x14-ddr3-arm2-ecspi.dtb \
imx6ull-14x14-ddr3-arm2-emmc.dtb \
imx6ull-14x14-ddr3-arm2-epdc.dtb \
imx6ull-14x14-ddr3-arm2-flexcan2.dtb \
imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \
imx6ull-14x14-ddr3-arm2-lcdif.dtb \
imx6ull-14x14-ddr3-arm2-ldo.dtb \
imx6ull-14x14-ddr3-arm2-qspi.dtb \
imx6ull-14x14-ddr3-arm2-qspi-all.dtb \
imx6ull-14x14-ddr3-arm2-tsc.dtb \
imx6ull-14x14-ddr3-arm2-uart2.dtb \
imx6ull-14x14-ddr3-arm2-usb.dtb \
imx6ull-14x14-ddr3-arm2-wm8958.dtb \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-btwifi.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-14x14-evk-usb-certi.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-9x9-evk-btwifi.dtb \
imx6ull-9x9-evk-ldo.dtb \
imx6ull-100ask-emmc.dtb # 新添加的
- 编译运行添加的内核,修改完以后,执行:
make distclean
make imx_100ask_emmc_defconfig
make -j12
然后使用网络启动内核即可看到内核启动成功。
3.1 LCD驱动修改
修改LCD驱动其实很简单,就修改一下设备树文件就可以了,这里参考了韦老师的LCD移值笔记,
由于100ask和官方evk的背光引脚使用的是同一个引脚,而复位引脚没有使用,100ask的lcd硬件复位引脚采用的上电自动复位,所以只需要修改LCD的时序参数就可以了。打开arch/arm/boot/dts/imx6ull-100ask-emmc.dts,找到display0: display,修改后如下:
display0: display { bits-per-pixel = <24>; bus-width = <24>;
display<span class="token operator">-</span>timings <span class="token punctuation">{</span> native<span class="token operator">-</span>mode <span class="token operator">=</span> <span class="token operator"><</span><span class="token operator">&</span>timing0<span class="token operator">></span><span class="token punctuation">;</span> timing0<span class="token punctuation">:</span> timing0 <span class="token punctuation">{</span> clock<span class="token operator">-</span>frequency <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">50000000</span><span class="token operator">></span><span class="token punctuation">;</span> hactive <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">1024</span><span class="token operator">></span><span class="token punctuation">;</span> vactive <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">600</span><span class="token operator">></span><span class="token punctuation">;</span> hfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">160</span><span class="token operator">></span><span class="token punctuation">;</span> hback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">140</span><span class="token operator">></span><span class="token punctuation">;</span> hsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">20</span><span class="token operator">></span><span class="token punctuation">;</span> vback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">20</span><span class="token operator">></span><span class="token punctuation">;</span> vfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">12</span><span class="token operator">></span><span class="token punctuation">;</span> vsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">3</span><span class="token operator">></span><span class="token punctuation">;</span> hsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span><span class="token punctuation">;</span> vsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span><span class="token punctuation">;</span> de<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">1</span><span class="token operator">></span><span class="token punctuation">;</span> pixelclk<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
};
修改完后执行:
make dtbs
- 1
make dtbs只编译设备树文件,
3.2 网络驱动修改
网络驱动在移值根文件系统的时候再修改。暂时可以使用。
3.3 测试修改后的Linux
将上面编译好的zImage和imx6ull-100ask-emmc.dtb放入tftp服务器目录,然后开发板下载并启动后,可以看到,在uboot启动阶段,LCD显示的是NXP的logo,在内核加载并运行后,LCD的左上角显示了的linux系统的logo,一只小????,启动完成后进入了100ask的功能测试界面,因为这里使用的是100ask提供的根文件系统,说明LCD驱动已经正常工作了,但是触摸屏没有用。
上一篇: 移植InfoNES到imx6ull(一)
下一篇: IMX6ULL移植boa web服务器
推荐阅读
-
JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记
-
移植新内核到Linux系统上的操作步骤
-
大神着手为M1 Mac原生移植Linux:内核之父曾放言不可能完成
-
Red Hat Enterprise Linux 官方正式版镜像下载
-
FT5X06 如何应用在10寸电容屏(linux-3.5电容屏驱动简析;移植10寸电容屏驱动到Android4.2)
-
linux PWM蜂鸣器移植以及驱动程序分析
-
嵌入式Linux——网卡驱动(4):移植DM9000C厂家驱动到JZ2440
-
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
-
【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
-
Linux-4.9.2内核在mini2440上的移植(十一)——触摸屏驱动移植