把NXP官方Linux内核源码修改为支持韦东山的I.MX6ULL开发板的个人内核

目录

先不修改 编译出设备树和内核镜像 通过 Uboot 使用TFTP 下载到内存看看能不能启动

uboot下通过 NFS 或 tftp 网络下载启动

在内核中添加自己的开发板

使能 8 线 EMMC 驱动

修改内核里面的网络驱动



修改参考的是正点原子的开发板教程,由于正点原子和韦东山的开发板不一样,所以如果你使用的是正点原子的开发板,那么下面的步骤可能不适合你使用,但是可以参考

源码百度网盘下载地址

链接: https://pan.baidu.com/s/1GbvqyrQUm6nC0mGlOu4bWQ  密码: 5jf7
--来自百度网盘超级会员V2的分享

 

先不修改 编译出设备树和内核镜像 通过 Uboot 使用TFTP 下载到内存看看能不能启动

建立VScode工作空间

.vscode 文件夹中新建一个名为“settings.json”的文件,然后在 settings.json

{
    "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/*.o":true,
    "**/*.su":true,
    "**/*.cmd":true,
    "Documentation":true,

     /* 屏蔽不用的架构相关的文件 */
    rch/alpha":true,
     "arch/arc":true,
     "arch/arm64":true,
     "arch/avr32":true,
     "arch/[b-z]*":true,
     "arch/arm/plat*":true,
     "arch/arm/mach-[a-h]*":true,
     "arch/arm/mach-[n-z]*":true,
     "arch/arm/mach-i[n-z]*":true,
     "arch/arm/mach-m[e-v]*":true,
     "arch/arm/mach-k*":true,
     "arch/arm/mach-l*":true,
    
     /* 屏蔽排除不用的配置文件 */
    rch/arm/configs/[a-h]*":true,
     "arch/arm/configs/[j-z]*":true,
     "arch/arm/configs/imo*":true,
     "arch/arm/configs/in*":true,
     "arch/arm/configs/io*":true,
     "arch/arm/configs/ix*":true,
     /* 屏蔽掉不用的 DTB 文件 */
"arch/arm/boot/dts/[a-h]*":true,
 "arch/arm/boot/dts/[k-z]*":true,
 "arch/arm/boot/dts/in*":true,
 "arch/arm/boot/dts/imx1*":true,
 "arch/arm/boot/dts/imx7*":true,
 "arch/arm/boot/dts/imx2*":true,
 "arch/arm/boot/dts/imx3*":true,
 "arch/arm/boot/dts/imx5*":true,
 "arch/arm/boot/dts/imx6d*":true,
 "arch/arm/boot/dts/imx6q*":true,
 "arch/arm/boot/dts/imx6s*":true,
 "arch/arm/boot/dts/imx6ul-*":true,
 "arch/arm/boot/dts/imx6ull-9x9*":true,
 "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
 },

 "files.exclude": {
 "**/.git": true,
 "**/.svn": true,
 "**/.hg": true,
 "**/CVS": true,
 "**/.DS_Store": true,
 "**/*.o":true,
 "**/*.su":true,
 "**/*.cmd":true,
 "Documentation":true,
 /* 屏蔽不用的架构相关的文件*/
rch/alpha":true,
 "arch/arc":true,
 "arch/arm64":true,
 "arch/avr32":true,
 "arch/[b-z]*":true,
 "arch/arm/plat*":true,
 "arch/arm/mach-[a-h]*":true,
 "arch/arm/mach-[n-z]*":true,
 "arch/arm/mach-i[n-z]*":true,
 "arch/arm/mach-m[e-v]*":true,
 "arch/arm/mach-k*":true,
 "arch/arm/mach-l*":true,
/* 屏蔽排除不用的配置文件 */
"arch/arm/configs/[a-h]*":true,
 "arch/arm/configs/[j-z]*":true,
 "arch/arm/configs/imo*":true,
 "arch/arm/configs/in*":true,
 "arch/arm/configs/io*":true,
 "arch/arm/configs/ix*":true,
 /* 屏蔽掉不用的 DTB 文件 */
rch/arm/boot/dts/[a-h]*":true,
 "arch/arm/boot/dts/[k-z]*":true,
 "arch/arm/boot/dts/in*":true,
 "arch/arm/boot/dts/imx1*":true,
 "arch/arm/boot/dts/imx7*":true,
 "arch/arm/boot/dts/imx2*":true,
 "arch/arm/boot/dts/imx3*":true,
 "arch/arm/boot/dts/imx5*":true,
 "arch/arm/boot/dts/imx6d*":true,
 "arch/arm/boot/dts/imx6q*":true,
 "arch/arm/boot/dts/imx6s*":true,
 "arch/arm/boot/dts/imx6ul-*":true,
 "arch/arm/boot/dts/imx6ull-9x9*":true,
 "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,

}
}

修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两
个的变量值为 arm 和 arm-linux-gnueabihf-

Makefile文件251行下面

ARCH        ?= arm
CROSS_COMPILE    ?= arm-linux-gnueabihf-

和 uboot 一样,在编译 Linux 内核之前要先配置 Linux 内核。每个板子都有其对应的默认
配 置 文 件 , 这 些 默 认 配 置 文 件 保 存 在 arch/arm/configs 目 录 中 。 imx_v7_defconfig 和
imx_v7_mfg_defconfig 都可作为 I.MX6ULL EVK 开发板所使用的默认配置文件。但是这里建议
使用 imx_v7_mfg_defconfig 这个默认配置文件,首先此配置文件默认支持 I.MX6UL 这款芯片,
而且重要的一点就是此文件编译出来的 zImage 可以通过 NXP 官方提供的 MfgTool 工具烧写!
!
imx_v7_mfg_defconfig 中的“mfg”的意思就是 MfgTool。

make clean              //第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig     //配置 Linux 内核
make -j16            //编译 Linux 内核

如果提示   /bin/sh: 1: lzop: not found
则下载
sudo apt-get install lzop
然后编译通过

Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树
的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件,比如 imx6ull-14x14-evk.dtb
就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件:
1、Linux 内核镜像文件:zImage。
2、NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件:imx6ull-14x14-evk.dtb。

uboot下通过 NFS 或 tftp 网络下载启动

把这两个文件拷贝到tftp服务目录下 或者NFS服务目录下 然后启动开发板进入uboot 保证网络正常通讯之后

NFS 下载

nfs 80800000 192.168.0.66:/home/hong/nfs_rootfs/zImage

nfs 83000000 192.168.0.66:/home/hong/nfs_rootfs/imx6ull-14x14-evk.dtb

bootz 80800000 - 83000000

如果使用uboot得nfs下载命令会报错,所示错误(Loading: *** ERROR: File lookup fail):
导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件。
解决办法为:让buntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件:

#RPCNFSDCOUNT=8
RPCNFSDCOUNT="-V 2 8"

#RPCMOUNTDOPTS="--manage-gids"
RPCMOUNTDOPTS="-V 2 --manage-gids"

RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"

 

 

通过tftp下载启动测试

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

 

在内核中添加自己的开发板

将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为
imx_hjd_uboot_emmc_defconfig

添加适合开发板的设备树文件,进入目录 arch/arm/boot/dts 中,复制一
份 imx6ull-14x14-evk.dts,然后将其重命名为 imx_hjd_uboot_emmc.dts,命令如下:

.dts 是设备树源码文件,
编译 Linux 的时候会将其编译为.dtb 文件。
imx_hjd_uboot_emmc.dts创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“ imx_hjd_uboot_emmc.dtb”

这样编译 Linux 的时候就可以从 imx_hjd_uboot_emmc.dts 编译出 imx_hjd_uboot_emmc.dtb文件了

编译启动

make clean           
make imx_hjd_uboot_emmc_defconfig    
make -j16      

tftp 80800000 zImage
tftp 83000000 imx_hjd_uboot_emmc.dtb
bootz 80800000 - 83000000

启动成功说明在NXP 内核源码添加自己的开发板成功


使能 8 线 EMMC 驱动

韦东山的开发板上面采用的 8 位数据线
Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所
以本节我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文
件 imx_hjd_uboot_emmc.dts

找到   &usdhc2  函数
把里面的内容删除替换为下面的

pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc2_8bit>;
pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
bus-width = <8>;
non-removable;
status = "okay";

保存一下 ,然后使用命令“make dtbs”重新编译一
下设备树,编译完成以后使用新的设备树重启 Linux 系统


修改内核里面的网络驱动

在 imx_hjd_uboot_emmc.dts 里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在
此节点下添加一个网络复位引脚信息

/*enet2 reset HJD*/
pinctrl_enet2_reset: enet2resetgrp {
                fsl,pins = <
/* used for enet2 reset */
                 MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06  0x10B0
            >;
        };


最后还需要修改一下 ENET2 的网络时钟引脚配置,继续在 imx_hjd_uboot_emmc.dts 中找到
pinctrl_enet1: enet1grp  这个函数

将这ENET2引脚的电
气属性值改为 0x4001b009,原来默认值为 0x4001b031。

MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2    0x4001b009

修改 fec2 节点的 pinctrl-0 属性 找到 &fec2 修改其中的
“pinctrl-0”属性值

把其中
pinctrl-0 = <&pinctrl_enet2>;

替换为
pinctrl-0 = <&pinctrl_enet2
    &pinctrl_enet2_reset>;

修改 LAN8720A 的 PHY 地址

在 uboot移植的时候我们知道 ENET2 的 LAN8720A地址为 0x1
在 &fec2  中 phy-handle = <ðphy1>; 下面添加

phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;

ENET2 网络复位引脚所使用的 IO 为 GPIO5_IO06,同样低电平有效,持
续时间同样为 200ms。

然后接着在里面找到 ethphy0: ethernet-phy  和 ethphy1: ethernet-phy 对照着改为下面一样即可

ethphy0: ethernet-phy@0 {
    compatible = "ethernet-phy-ieee802.3-c22";
    smsc,disable-energy-detect;
    reg = <0>;
};

ethphy1: ethernet-phy@1 {
    compatible = "ethernet-phy-ieee802.3-c22";
    smsc,disable-energy-detect;
    reg = <1>;
};

至此,LAN8720A 的 PHY 地址就改好了,保存一下文件。然后
使用“make dtbs”命令重新编译一下设备树

修改 fec_main.c 文件
要 在 I.MX6ULL 上 使 用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 , 打 开
drivers/net/ethernet/freescale/fec_main.c,找到函数 fec_probe,
在 fec_probe 中的 int num_rx_qs; 这一行下面
加入如下代码

void __iomem *IMX6U_ENET2_TX_CLK;

IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
writel(0X14, IMX6U_ENET2_TX_CLK);

配置 Linux 内核,使能 LAN8720 驱动

输入命令“make menuconfig”
,打开图形化配置界面,选择使能 LAN8720A 的驱动,路径
如下:
-> Device Drivers
-> Network device support
-> PHY Device support and infrastructure
-> Drivers for SMSC PHYs

选中后保存退出
这个时候因为我们使用了图形配置 不要进行 make clean
就 make -j16就好

编译一下 make -j16 

运行测试新的设备树和zImage

通过图形界面保存配置文件 通过键盘的“→”键,移动到“< Save >”选项,然后按下回车键,打开文件名输入对话框
比 如 我 们 要 将 新 的 配 置 文 件 保 存 到 目 录 arch/arm/configs 下 , 文 件 名 为
imx_hjd_uboot_emmc_defconfig,也就是用新的配置文件替换掉老的默认配置文件。那么我们在图
 中输入“arch/arm/configs/imx_hjd_uboot_emmc_defconfig”即可
然后去imx_hjd_uboot_emmc_defconfig可以看到CONFIG_SMSC_PHY=y”这一行, 那么就可以make clean  了
make clean
make imx_hjd_uboot_emmc_defconfig
make -j16
编译一下  运行新的设备树和zImage

 

你可能感兴趣的:(嵌入式,linux)