1.u-boot 源码获取

下载链接:https://ftp.denx.de/pub/u-boot/

基于IMX6ULL 移植u-boot2022.10_开发板

本教程以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 中的内容改成下面的::

基于IMX6ULL 移植u-boot2022.10_初始化_02

3.2、添加开发板对应的头文件

 include/configs 下添加 I.MX6ULL-ALPHA 开 发 板 对 应 的 头 文 件 , 复 制 include/configs/mx6ullevk.h,并重命名为 mx6ull_mikeyyu.h,修改条件编译:

基于IMX6ULL 移植u-boot2022.10_设备树_03

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 文件内容改为如下所示:

基于IMX6ULL 移植u-boot2022.10_初始化_04

3.3.2修改 mx6ull_mikeyyu 目录下的 imximage.cfg 文件

将 imximage.cfg 中的下面一句

基于IMX6ULL 移植u-boot2022.10_开发板_05

3.3.3 修改 mx6ull_mikeyyu 目录下的 Kconfig 文件

修改 Kconfig 文件

基于IMX6ULL 移植u-boot2022.10_初始化_06

3.3.4 修改 mx6ull_mikeyyu 目录下的 MAINTAINERS 文件

修改 MAINTAINERS 文件,修改后的内容如下

基于IMX6ULL 移植u-boot2022.10_开发板_07

3.4 修改 arch/arm/mach-imx/mx6/Kconfig

修改文件arch/arm/mach-imx/mx6/Kconfig

基于IMX6ULL 移植u-boot2022.10_初始化_08

基于IMX6ULL 移植u-boot2022.10_设备树_09

3.5 其他需要修改的地方

 在 uboot 启动信息中会有“Board: MX6ULL 14x14 EVK”这一句,也就是说板子名字为“MX6ULL 14x14 EVK”。那么如果要将其改为我们想要的名字,就需打开文件 mx6ull_mikeyyu.c,找到函数checkboard,将其改为如下所示内容:

基于IMX6ULL 移植u-boot2022.10_初始化_10

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

基于IMX6ULL 移植u-boot2022.10_开发板_11

重新编译,烧写验证,还是报错

基于IMX6ULL 移植u-boot2022.10_初始化_12

4.1.2 网络初始化检查

  接下来就只有从网络初始化入口initr_net函数开始,查看网络初始化哪里有问题。

在board_r.c文件中的init_sequence_r调用

基于IMX6ULL 移植u-boot2022.10_开发板_13

可以看到initr_net函数其实就两个作用,一是调用eth_initialize进行网络初始化,二是调用reset_phy对phy进行复位,具体实现,如下;

基于IMX6ULL 移植u-boot2022.10_开发板_14

继续往下,我们可以看到,phy_init初始化函数中只调用了phy_micrel_ksz8xxx_init对Micrel 公司生产的ksz8系列的phy进行了初始化,如下;

基于IMX6ULL 移植u-boot2022.10_设备树_15

而我们的硬件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,如下;

基于IMX6ULL 移植u-boot2022.10_初始化_16

4.1.3 fec部分管脚确认

 继续往下,在fecmxc_probe函数中发现调用了fec_gpio_reset()函数复位fec网卡,但是设备树文件中没有配置复位管脚

基于IMX6ULL 移植u-boot2022.10_设备树_17

fecmxc_of_to_plat函数会对设备中的phy的这三个定义进行解析。因此在设备中添加如下三个定义:

基于IMX6ULL 移植u-boot2022.10_开发板_18

设备树文件imx6ul-mikeyyu.dtsi中,具体配置如下:

基于IMX6ULL 移植u-boot2022.10_初始化_19

4.1.4.检查是否存在多设备管脚复用

下面要做的就是查看在设备树文件中查看一下,刚刚添加的两个GPIO管脚在其他设备中是否存在该管脚复用情况

基于IMX6ULL 移植u-boot2022.10_初始化_20

编译验证如下:

基于IMX6ULL 移植u-boot2022.10_初始化_21

boot下只会使用一个网口,因此屏蔽一个

4.1.5 使用默认ENET2

使用uboot中imx6ull默认的网卡ENET2 默认网卡,宏定义CONFIG_FEC_ENET_DEV,路径:/include/configs/mx6ull_mikeyyu.h

基于IMX6ULL 移植u-boot2022.10_设备树_22

    在设备树文件中将FEC1节点的status设置为disabled

基于IMX6ULL 移植u-boot2022.10_设备树_23

5.编译烧写验证

基于IMX6ULL 移植u-boot2022.10_初始化_24

6.FEC1网卡1调试

使用 ENET1 网卡的话就稍微复杂一点了,不是简单的将 fec2 节点下的 status 改为“disabled”,需要对在设备树arch/arm/dts/imx6ul-mikeyyu.dtsi文件进行修改和添加。

6.1屏蔽或删除掉 fec2 节点内容

基于IMX6ULL 移植u-boot2022.10_设备树_25

基于IMX6ULL 移植u-boot2022.10_初始化_26

6.2 在fec1 节点下添加 mdio 子节点

基于IMX6ULL 移植u-boot2022.10_设备树_27

6.3 添加MDIO和MDC引脚配置

在 ENET1 网卡对应的 pinctrl 节点中添加 MDIO 和 MDC 引脚配置
将 GPIO1_IO07 复用为 ENET1_MDC 引脚
将 GPIO1_IO06 复用为 ENET1_MDIO 引脚

基于IMX6ULL 移植u-boot2022.10_初始化_28

6.4 屏蔽 FEC2的MDIO和MDC引脚配置

在 ENET2 网卡对应的 pinctrl 节点中 MDIO 和 MDC 引脚屏蔽

基于IMX6ULL 移植u-boot2022.10_初始化_29

6.5 修改ENET设备为enet0

在include/configs/mu6ull_mikeyyu.h中修改宏CONFIG_FEC_ENET_DEV为0,使用enet0

基于IMX6ULL 移植u-boot2022.10_初始化_30

编译下载重启开发板,打印信息如下

基于IMX6ULL 移植u-boot2022.10_设备树_31

常见问题:

基于IMX6ULL 移植u-boot2022.10_开发板_32

可能时MDIO总线不通