IMX6ULL Linux内核移植
准备工作
网络设置
关闭主机的Ubuntu的防火墙:
1 |
|
确认VMWare使用桥接模式,主机、虚拟机和开发板三者处于同一网段,如:
- 主机:192.168.1.100
- 虚拟机:192.168.1.105
- 开发板:192.168.1.103 (DHCP获取)
在uboot下,开发板ping虚拟机和主机、虚拟机ping主机应当都能ping通。未加载Linux内核前网卡尚未使能,虚拟机ping开发板应当ping不通。
TFTP搭建
TFTP常见用途:
- U-Boot 加载 Linux 内核、设备树和根文件系统
- NFS 结合 TFTP 进行网络启动
- 固件更新
- 开发调试
安装xinetd:
1 |
|
检查/etc/xinetd.conf
是否存在,不存在则创建,修改内容如下:
1 |
|
新建TFTP目录于/home/aki/linux
,然后chmod 777
该目录。
安装tftp-hpa和tftpd-hpa:
1 |
|
安装完后,sudo nvim /etc/default/tftpd-hpa
,修改tftp目录为TFTP服务器工作目录:
然后sudo nvim /etc/xinetd.d/tftp
,添加:
1 |
|
保存,重启TFTP服务:sudo service tftpd-hpa restart
,重启xinetd服务:sudo service xinetd restart
NFS搭建
NFS主要用于:
- 嵌入式设备的根文件系统(RootFS)挂载:在开发阶段,NFS 服务器可以存放 根文件系统(RootFS),嵌入式设备通过网络直接挂载,而无需烧录到 Flash 或 SD 卡
- 远程文件访问:如开发板访问PC共享目录
安装NFS服务:
1 |
|
新建NFS共享目录并chmod 777
:
1 |
|
安装完后,sudo nvim /etc/exports
,在最后添加:
1 |
|
保存退出,重启NFS服务:sudo /etc/init.d/nfs-kernel-server restart
,确认共享目录已经配置完毕:shouwmount -e
Linux镜像测试
先确认官方linux镜像是否可以。在linux根目录中,修改顶层Makefile,添加ARCH
和CROSS_COMPILE
变量,然后
1 |
|
然后
1 |
|
make完成后makefile会提示得到两个重要的文件:
- zImage:linux内核镜像,位于
/arch/arm/boot/
- imx6ull-14x14-evk.dtb:编译后的设备树文件,位于
/arch/arm/boot/dts/
然后,启动uboot,设置uboot中的envbootargs
为:
1 |
|
表明将从eMMC/SD卡的第2分区启动 Linux。然后,修改bootcmd
:
1 |
|
表明将通过TFTP从虚拟机拉取内核镜像和设备树并启动内核。然后,boot
,启动内核。
配置主频、EMMC和网络驱动
主频设置
WIP
EMMC设置
6.6版本的Kernel已经默认禁用1.8V供电,同时自动启用了8位宽的EMMC总线,所以不用进行其他的设置。
网络驱动
和uboot中进行过的很像。已知NXP原版设备树中的SPI4节点中的两个引脚和SR8201F的冲突,因此打开/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi
这个底层设备树,找到pinctrl_spi4: spi4grp
这个节点,删掉包含GPIO5 7
和GPIO5 8
的两行。然后前往SPI4
的子节点,把status改成disable
,直接禁用掉SPI4。
然后,修改pinctrl复用信息,来到&iomuxc
节点,在节点末尾新增两个pinctrl group
:
1 |
|
按照步骤还需要修改ENET1和ENET2的网络时钟引脚配置,但是6.6版本的kernel设备树已经添加了,就不用手动操作了。
继续,在fec1
和fec2
节点里加入刚刚设置好的复位引脚的pinctrl group
信息:
1 |
|
继续,检查设备树fec1
和fec2
节点下mdio
子节点中的PHY地址是否正确。新版kernel默认都是设置好的。
然后,在defconfig
里告知kernel使用realtek的PHY驱动:
1 |
|
最后,根据SR8201F复位后至少延时150ms才能开始使用的要求,修改drivers/net/ethernet/freescale/fec_main.c
,在static void fec_reset_phy()
函数的末尾加入:
1 |
|
重新编译kernel,然后启动,通过ifconfig
观察网卡是否工作正常(正常情况下ETH1会自动启动):
1 |
|
构建根文件系统
使用busybox构建,在busybox根目录的顶层Makefile中添加ARCH
和CORSS_COMPILE
,然后:
1 |
|
进入图形化配置界面:
- 选中Settings->Build static binary
- 选中Setttings->vi-style line editing commands
- 取消选中Linux Module Utilities->Simpilified modutils
编译busybox时必须使用静态库,动态库会缺库文件导致dns解析没法正常使用。
然后,
1 |
|
注意:1.37.0版本busybox报告有一个bug,即:
1 |
|
和CBQ队列管理有关的大量宏会报错,解决方法是把tc.c
从/busybox/networking
文件夹里删除。
然后,需要将编译器所包含的库文件全部打包到根目录下。
使用NFS挂载时,bootargs要设成:
1 |
|
注意:这里通过vers=3
强制使用NFS v3版本,否则会挂载失败。
如果碰到hotplug:can’t create /proc/sys/kernel/hotplug: nonexistent directory问题:参见
fstab
要加一行:
1 |
|