这里我们使用 NXP 官方提供的 Linux 源码,将其移植到正点原子 I.MX6U-ALPHA 开发板上将nxp提供的Linux文件解压并且改名,我这里改成:my_linux
1.更改默认配置文件
- 首先就是配置文件,我们复制一份配置文件,更改成为自己的配置文件,默认配置文件路径为:arch/arm/configs/
cd arch/arm/configs/
cp imx_v7_mfg_defconfig imx_my_emmc_defconfig
2.复制设备树文件
设备树文件的路径在:arch/arm/boot/dts/,复制一 份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-my-emmc.dts,命令如下:
cd arch/arm/boot/dtb
cp imx6ull-14x14-evk.dts imx6ull-my-emmc.dts
.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件
复制完成后我们需要在arch/arm/boot/dtb路径下打开Makefile,添加我们复制的设备树文件加入imx6ull-my-emmc.dtb,在422行添加:
下面我们就可以编译了:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_my_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
编译成功会在arch/arm/boot目录下生成zImage文件,在arch/arm/boot/dts/目录下生成imx_my_emmc.dtb文件
接下来我们将这两个文件拷贝到tftp文件夹下通过网路下载:
cp arch/arm/boot/zImage /home/deng/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-my-emmc.dtb /home/deng/linux/tftpboot/ -f
开发板通电进入uboot命令行模式,通过tftp命令下载将zImage和imx_my_emmc.dtb,这两个文件下载并启动
tftp 80800000 zImage
tftp 83000000 imx_my_emmc.dtb
boot 80800000 - 83000000
启动成功
接下来就是修改网络驱动
3.网络驱动修改
首先打开imx6ull-my-emmc.dts文件到里面找到pinctrl_spi4: spi4grp开头的,把MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07,MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08这两个引脚屏蔽掉,因为这里设置为SPI4的引脚。如图所示:
删掉以后,在imx6ull-my-emmc.dts找到一下代码,并且把这两行屏蔽掉:
在 imx6ull-my-emmc.dts 里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在
此节点下添加网络复位引脚信息,添加完成以后的“iomuxc_snvs”的节点内容如下:
/*enet1 reset*/
pinctrl_enet1_reset: enet1resetgrp {
fsl,pins = <
/* used for enet1 reset */
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
>;
};
/*enet2 reset*/
pinctrl_enet2_reset: enet2resetgrp {
fsl,pins = <
/* used for enet2 reset */
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
>;
};
添加如下代码所示:
&iomuxc_snvs {
pinctrl-names = "default_snvs";
pinctrl-0 = <&pinctrl_hog_2>;
imx6ul-evk {
pinctrl_hog_2: hoggrp-2 {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER0__GPIO5_IO00 0x80000000
>;
};
pinctrl_dvfs: dvfsgrp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER3__GPIO5_IO03 0x79
>;
};
pinctrl_lcdif_reset: lcdifresetgrp {
fsl,pins = <
/* used for lcd reset */
MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x79
>;
};
pinctrl_spi4: spi4grp {
fsl,pins = <
MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
/*
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000
*/
>;
};
pinctrl_sai2_hp_det_b: sai2_hp_det_grp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER4__GPIO5_IO04 0x17059
>;
};
};
/*enet1 reset*/
pinctrl_enet1_reset: enet1resetgrp {
fsl,pins = <
/* used for enet1 reset */
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
>;
};
/*enet2 reset*/
pinctrl_enet2_reset: enet2resetgrp {
fsl,pins = <
/* used for enet2 reset */
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
>;
};
};
最后还需要修改一下 ENET1 和 ENET2 的网络时钟引脚配置,继续在 imx6ull-my-
emmc.dts 中找到如下所示代码:
最后更改一下电气属性:
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
把这两个引脚原来的电器属性更改为0x4001b031,即可如图所示:
修改fec1和fec2节点的pinctrl-0属性
在 imx6ull-my-emmc.dts 文件中找到名为“fec1”和“fec2”的这两个节点,修改其中的
“pinctrl-0”属性值,修改以后如下所示:
&fec1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet1
&pinctrl_enet1_reset>;
phy-mode = "rmii";
phy-handle = <ðphy0>;
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2
&pinctrl_enet2_reset>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy0: ethernet-phy@2 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <2>;
};
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
smsc,disable-energy-detect;
reg = <1>;
};
};
};
最后修改fec_main.c文件
要 在 I.MX6ULL 上使用 SR8201F , 需 要 修 改 一 下 Linux 内核源码,打开
drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_reset_phy,在 fec_reset_phy 函数
在3556行添加:
msleep(200);
如图所示:
完工,保存,编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_my_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
复制zImage 和设备树文件到tftpboot
cp arch/arm/boot/zImage /home/deng/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-my-emmc.dtb /home/deng/linux/tftpboot/ -f
启动u-boot时设置一下参数,更换根文件系统nfs地址和tftp下载的地址
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.0.9:/home/dwh/linux/nfs/rootfs ip=192.168.0.20:192.168.0.9:192.168.0.1:255.255.255.0::eth0:off'
启动网卡:
ifconfig eth0 up
ifconfig eth0 192.168.1.3
启动: