目录
先不修改 编译出设备树和内核镜像 通过 Uboot 使用TFTP 下载到内存看看能不能启动
uboot下通过 NFS 或 tftp 网络下载启动
在内核中添加自己的开发板
使能 8 线 EMMC 驱动
修改内核里面的网络驱动
修改参考的是正点原子的开发板教程,由于正点原子和韦东山的开发板不一样,所以如果你使用的是正点原子的开发板,那么下面的步骤可能不适合你使用,但是可以参考
源码百度网盘下载地址
链接: https://pan.baidu.com/s/1GbvqyrQUm6nC0mGlOu4bWQ 密码: 5jf7
--来自百度网盘超级会员V2的分享
建立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。
把这两个文件拷贝到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 位数据线
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