Linux内核移植

这里我们使用 NXP 官方提供的 Linux 源码,将其移植到正点原子 I.MX6U-ALPHA 开发板上将nxp提供的Linux文件解压并且改名,我这里改成:my_linux

1.更改默认配置文件

  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 = <&ethphy0>;
	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 = <&ethphy1>;
	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

启动:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DENG YIRU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值