imx6ull kernel移植
环境准备
kernel获取
NXP官方kernel仓库地址
https://github.com/nxp-imx/linux-imx/tree/imx_4.1.15_2.0.0_ga
1.1.2 kernel 官方获取地址:
注意:强烈建议使用 NXP 官方 kernel,移植起来方便很多。
编译链获取
编译获取链接
uboot 移植时已经将 编译工具链安装好了位于以下目录:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
注意:uboot、kernel 和文件系统构建时均需要使用统一的编译工具链,否则可能出现未知问题。
移植适配
新建单板
新建目标板默认配置(基于 NXP 官方EVK)
arch/arm/config 目录
imx6ull 是 arm-v7 的内核,arch/arm/config 下的 imx_v7_defconfig 和 imx_v7_mfg_defconfig 都是NXP官方板 IMX6ULL EVK 的默认配置文件,带mfg 的版本编译出来的 zImage 可以通过NXP官方提供的 MfgTool 工具进行烧。
cd arch/arm/config
cp -a imx_v7_mfg_defconfig imx_topeet_emmc_mfg_defconfig
之后我们基于 imx_topeet_emmc_mfg_defconfig 作为目标开发板的默认配置文件;
新建目标板设备树(基于 NXP 官方EVK)
arch/arm/boot/dts 目录
imx6ull 是 有14x14 和 9x9 两种封装规格,此处我们关注 arch/arm/boot/dts 目录下14x14 规格EVK的即可,imx6ull-14x14-evk.dst 是基础的设备树文件,其余文件是增加外设支持后的设备树。
cd arch/arm/boot/dts
cp -a imx6ull-14x14-evk.dst imx6ull-topeet-emmc.dts
之后我们基于 imx6ull-topeet-emmc.dts 作为目标开发板的设备树文件,相关驱动的配置再次修改;
目标板驱动修改
以下的修改需要根据目标板的原理图进行相关的修改。
EMMC驱动修改
目标板使用的是8GB 大小的 KLM8G1GET EMMC,硬件电路连接时使用的是 8位数据线,默认驱动使用的是 4位数据线,EMMC 接的是 imx6ull 的 usdhc2 控制器,所以需要对 imx6ull-topeet-emmc.dts 设备树 usdhc2 节点进行如下修改。
修改前:
&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
non-removable;
status = "okay";
};
修改后
&usdhc2 {
pinctrl-names = "default", "state_100m", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";
};
网卡驱动修改
开发板PHY芯片使用 KSZ8081,与NXP官方的 I.MX6ULL EVK 相同,所以驱动代码主体无需修改,但是需要修改 KSZ8081 reset 引脚;
两个网卡芯片分别使用了 GPIO5_IO07 和 GPIO5_IO08 作为复位引脚,需要对 imx6ull-topeet-emmc.dts 设备树 iomuxc 节点进行如下修改:
// 添加复位引脚配置
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
....
/* 新增fec1复位脚配置 */
pinctrl_enet1_reset: enet1_resetgrp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x79
>;
};
/* 新增fec2复位脚配置 */
pinctrl_enet2_reset: enet2_resetgrp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x79
>;
};
....
};
};
// 删除冲突引脚
pinctrl_spi4: spi4grp {
fsl,pins = <
MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
/* 删除 spi4 下冲突的引脚
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000
*/
>;
};
// 修改 fec1和 fec2节点的 pinctrl-0属性
&fec1 {
pinctrl-names = "default";
/* 增加服务引脚节点 pinctrl_enet1_reset */
pinctrl-0 = <&pinctrl_enet1 &pinctrl_enet1_reset>;
phy-mode = "rmii";
phy-handle = <ðphy0>;
/* 增加引脚拉低200ms操作,完成服务 */
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
/* 增加服务引脚节点 pinctrl_enet2_reset */
pinctrl-0 = <&pinctrl_enet2 &pinctrl_enet2_reset>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
/* 增加引脚拉低200ms操作,完成服务 */
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
/* 关注这里的PHY器件地址是否需要修改(根据原理图) */
ethphy0: ethernet-phy@2 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <2>;
};
/* 关注这里的PHY器件地址是否需要修改(根据原理图) */
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <1>;
};
};
};
网卡驱动选择
对于以太网来说网卡就是 PHY 芯片,PHY是 IEEE 802.3规定的一个标准模块,Linux 内核有通用 PHY 驱动,一般情况,不管使用哪个厂家的 PHY芯片,都可以使用 Linux的这个通用 PHY 驱动来完成网络收发的基本功能,同时 Kernel 内核也提供了很多厂家的专用驱动,KSZ8081 是 micrel 的一款芯片,所以在 imx_topeet_emmc_mfg_defconfig 默认配置下增加如下,即可使用 micrel 的厂家驱动。
CONFIG_MICREL_PHY=y
网卡驱动测试
在内核启动后可以使用如下命令进行网卡 ip 地址设置,如果网卡没有启动则会先启动在设置IP地址
- 在uboot 中设置固定的MAC地址,否则会导致每次启动后mac地址随机
setenv ethaddr FA:A2:DD:1E:E0:67
setenv eth1addr FA:A2:DD:1E:E0:67
saveenv
- 网线插入 ethernet2 网口上
- 启动网卡
ifconfig eth0 up/down
- 分配IP地址
udhcpc -i eth0
- 也可以手动设置ip(包括启动)
ifconfig eth0 192.168.1.251
- 测试
ping www.baidu.com
- 设置静态IP
编辑文件 /etc/network/interfaces
sudo vi /etc/network/interfaces
# 并用下面的行来替换有关eth0的行:
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.251
gateway 192.168.1.200
netmask 255.255.254.0
#network 192.168.1.0
#broadcast 192.168.1.255
up route add -net 192.168.0.0 gw 192.168.1.254 netmask 255.255.0.0
up route add -net 10.10.0.0 gw 192.168.1.254 netmask 255.255.0.0
使能设置生效
sudo /etc/init.d/networking restart
编译测试
添加环境变量
修改根目录下 makefile,增加如下宏指定芯片架构和编译链前缀
# 添加环境变量
ARCH = arm
CROSS_COMPILE = arm-linux-guneabihf-
开始编译
make distclean
make imx_topeet_emmc_mfg_defconfig
make -j12
编译产物
编译后的产物分别是 ./arch/arm/boot/zImage 和 /arch/arm/boot/dts/imx6ull-topeet-emmc.dtb 设备树文件,用于后期烧录使用。
问题解决
编译时出现库缺失:
sudo apt-get install lzop