环境准备

kernel获取

NXP官方kernel仓库地址

https://github.com/nxp-imx/linux-imx/tree/imx_4.1.15_2.0.0_ga

1.1.2 kernel 官方获取地址:

https://www.kernel.org/

注意:强烈建议使用 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_defconfigimx_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_IO07GPIO5_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 = <&ethphy0>;
    /* 增加引脚拉低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 = <&ethphy1>;
    /* 增加引脚拉低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地址

  1. 在uboot 中设置固定的MAC地址,否则会导致每次启动后mac地址随机
setenv ethaddr FA:A2:DD:1E:E0:67
setenv eth1addr FA:A2:DD:1E:E0:67
saveenv
  1. 网线插入 ethernet2 网口上
  2. 启动网卡
ifconfig eth0 up/down
  1. 分配IP地址
udhcpc -i eth0
  1. 也可以手动设置ip(包括启动)
ifconfig eth0 192.168.1.251
  1. 测试
ping www.baidu.com
  1. 设置静态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
文章作者: 路西法
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 以梦为马
imx6ull imx6ull Linux
喜欢就支持一下吧