1.u-boot 源码获取
下载链接:https://ftp.denx.de/pub/u-boot/
本教程以2022.10版本为例讲解
2.初次编译
安装编译所需必要库文件:
sudo apt-get install libncurses5-dev
编译u-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
3.U-Boot中添加开发板
3.1、添加开发板默认配置文件
先在 configs 目录下创建默认配置文件,复制 mx6ull_14x14_evk_defconfig,然后重命名为 mx6ull_mikeyyu_defconfig,然后将文件 mx6ull_mikeyyu_defconfig 中的内容改成下面的::
3.2、添加开发板对应的头文件
include/configs 下添加 I.MX6ULL-ALPHA 开 发 板 对 应 的 头 文 件 , 复 制 include/configs/mx6ullevk.h,并重命名为 mx6ull_mikeyyu.h,修改条件编译:
mx6ull_mikeyyu.h 里面有很多宏定义,如配置u-boot默认串口打印使用uart的第几个口,网口默认使用哪个网口等,也有一些u-boot环境变量的的默认配置。如果我们想要改变默认的uart和enet口,那就在 mx6ull_mikeyyu.h 里面做修改即可。
3.3、添加开发板对应的板级文件夹
u-boot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等 等。NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下 有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件 夹。复制 mx6ullevk,将其重命名为 mx6ull_mikeyyu,进 入mx6ull_mikeyyu目 录 中 , 将 其 中 的mx6ullevk.c文 件 重 命 名 为mx6ull_mikeyyu.c
3.3.1修改 mx6ull_mikeyyu 目录下的 Makefile 文件
将 mx6ull_mikeyyu目录 下的 Makefile 文件内容改为如下所示:
3.3.2修改 mx6ull_mikeyyu 目录下的 imximage.cfg 文件
将 imximage.cfg 中的下面一句
3.3.3 修改 mx6ull_mikeyyu 目录下的 Kconfig 文件
修改 Kconfig 文件
3.3.4 修改 mx6ull_mikeyyu 目录下的 MAINTAINERS 文件
修改 MAINTAINERS 文件,修改后的内容如下
3.4 修改 arch/arm/mach-imx/mx6/Kconfig
修改文件arch/arm/mach-imx/mx6/Kconfig
3.5 其他需要修改的地方
在 uboot 启动信息中会有“Board: MX6ULL 14x14 EVK”这一句,也就是说板子名字为“MX6ULL 14x14 EVK”。那么如果要将其改为我们想要的名字,就需打开文件 mx6ull_mikeyyu.c,找到函数checkboard,将其改为如下所示内容:
4.设备树移植
复制 imx6ull-14x14-evk.dts,然后重命名为 imx6ull-mikeyyu.dts
复制 imx6ul-14x14-evk.dtsi,然后重命名为 imx6ul-mikeyyu.dtsi
4.1 网卡适配
4.1.1 修改phy地址
imx6ull对应的设备树文件imx6ull-mikeyyu.dtsi,从设备树文件中可以得到,imx6ull FEC1对应位ethphy0,而ethphy0对应的phy地址默认位2,这与我们开发板硬件给的phy地址不符合,因此修改设备树中FEC1对应的phy地址为0
重新编译,烧写验证,还是报错
4.1.2 网络初始化检查
接下来就只有从网络初始化入口initr_net函数开始,查看网络初始化哪里有问题。
在board_r.c文件中的init_sequence_r调用
可以看到initr_net函数其实就两个作用,一是调用eth_initialize进行网络初始化,二是调用reset_phy对phy进行复位,具体实现,如下;
继续往下,我们可以看到,phy_init初始化函数中只调用了phy_micrel_ksz8xxx_init对Micrel 公司生产的ksz8系列的phy进行了初始化,如下;
而我们的硬件fec1和fec2都是使用SMSC 公司生产的LAN8720A,因此修改为调用phy_smsc_init初始化phy芯片LAN8720A。
具体修改为在mx6ull_mikeyyu_defconfig文件添加宏定义CONFIG_PHY_SMSC=y;然后屏蔽CONFIG_PHY_MICREL=y和CONFIG_PHY_MICREL_KSZ8XXX=y,如下;
4.1.3 fec部分管脚确认
继续往下,在fecmxc_probe函数中发现调用了fec_gpio_reset()函数复位fec网卡,但是设备树文件中没有配置复位管脚
fecmxc_of_to_plat函数会对设备中的phy的这三个定义进行解析。因此在设备中添加如下三个定义:
设备树文件imx6ul-mikeyyu.dtsi中,具体配置如下:
4.1.4.检查是否存在多设备管脚复用
下面要做的就是查看在设备树文件中查看一下,刚刚添加的两个GPIO管脚在其他设备中是否存在该管脚复用情况
编译验证如下:
boot下只会使用一个网口,因此屏蔽一个
4.1.5 使用默认ENET2
使用uboot中imx6ull默认的网卡ENET2 默认网卡,宏定义CONFIG_FEC_ENET_DEV,路径:/include/configs/mx6ull_mikeyyu.h
在设备树文件中将FEC1节点的status设置为disabled
5.编译烧写验证
6.FEC1网卡1调试
使用 ENET1 网卡的话就稍微复杂一点了,不是简单的将 fec2 节点下的 status 改为“disabled”,需要对在设备树arch/arm/dts/imx6ul-mikeyyu.dtsi文件进行修改和添加。
6.1屏蔽或删除掉 fec2 节点内容
6.2 在fec1 节点下添加 mdio 子节点
6.3 添加MDIO和MDC引脚配置
在 ENET1 网卡对应的 pinctrl 节点中添加 MDIO 和 MDC 引脚配置
将 GPIO1_IO07 复用为 ENET1_MDC 引脚
将 GPIO1_IO06 复用为 ENET1_MDIO 引脚
6.4 屏蔽 FEC2的MDIO和MDC引脚配置
在 ENET2 网卡对应的 pinctrl 节点中 MDIO 和 MDC 引脚屏蔽
6.5 修改ENET设备为enet0
在include/configs/mu6ull_mikeyyu.h中修改宏CONFIG_FEC_ENET_DEV为0,使用enet0
编译下载重启开发板,打印信息如下
常见问题:
可能时MDIO总线不通