详细讲解u-boot之网络移植与调试

news2024/11/24 19:39:30

目录

一、前章回顾

二、硬件原理图检查

1.确认硬件原理图的fec对应的phy地址

2.修改网卡fec1的phy地址

3.网络初始化检查

 4.fec部分管脚确认

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

6.使用默认ENET2

三、编译烧写,下载验证

1.设置网络环境变量

2.使用软件配置,默认生成

3.验证网络是否连通

四、FEC1网卡1调试

1.屏蔽或删除掉 fec2 节点内容

2.在fec1 节点下添加 mdio 子节点

3.添加MDIO和MDC引脚配置

4.修改ENET设备为enet0


一、前章回顾

        上一章,已经讲过如何讲uboot.2022.10版本移植到我们自己的imx6ull开发板上,但是最后编译下载后网络部分为能正确识别,今天我们就来讲一讲网络部分的调试。

        上一篇uboot编译后,上电启动,串口打印如下:

U-Boot 2022.10-gaef9f25a-dirty (Apr 05 2023 - 17:49:18 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 26C
Reset cause: POR
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM:  512 MiB
Core:  65 devices, 17 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   Could not get PHY for FEC1: addr 1
Could not get PHY for FEC1: addr 1
Get shared mii bus on ethernet@2188000
Could not get PHY for FEC1: addr 2
Get shared mii bus on ethernet@2188000
Could not get PHY for FEC1: addr 2
No ethernet found.

Hit any key to stop autoboot: 
=> 

        通过打印信息,我们可以发现连phy都没有正确识别到。首先来回顾一下,上一篇我们采用的是NXP官方默认imx6ull开发板的配置参数,任何参数都未做修改,现在使用默认配置网络未能正确识别,说明我们的硬件设计与官方的设计有偏差。因此,首先需要查看原理图,确认默认NXP imx6ull的网络管脚与我们自己硬件原理图上是否一致。

二、硬件原理图检查

1.确认硬件原理图的fec对应的phy地址

        从imx6ull开发板硬件原理图上可以得到,ENET1对应的phy addr为:0x0ENET2对应的phy addr为:0x1

 

 

2.修改网卡fec1的phy地址

        imx6ull对应的设备树文件imx6ull-14x14-evk.dtsi,从设备树文件中可以得到,imx6ull FEC1对应位ethphy0,而ethphy0对应的phy地址默认位2,这与我们开发板硬件给的phy地址不符合,因此修改设备树中FEC1对应的phy地址为0

&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rmii";
    phy-handle = <&ethphy0>;
    phy-supply = <&reg_peri_3v3>;
    status = "okay";
};

&fec2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet2>;
    phy-mode = "rmii";
    phy-handle = <&ethphy1>;
    phy-supply = <&reg_peri_3v3>;
    status = "okay";    

    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@2 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <2>;
            ...
        };

        ethphy1: ethernet-phy@1 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <1>;
            ...
        };
    };
};

修改FEC1节点对应的phy地址为0,如下;

mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@0 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <0>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";

        };
        ...
    }

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

3.网络初始化检查

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

        在board_r文件中的init_sequence_r调用

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

static int initr_net(void)
{
    puts("Net:   ");
    eth_initialize();
#if defined(CONFIG_RESET_PHY_R)
    debug("Reset Ethernet PHY\n");
    reset_phy();
#endif
    return 0;
}

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

int phy_init(void)
{
...
#ifdef CONFIG_PHY_MICREL_KSZ8XXX
    phy_micrel_ksz8xxx_init();
#endif 
#ifdef CONFIG_PHY_MICREL_KSZ90X1
    phy_micrel_ksz90x1_init();
#endif
...
#ifdef CONFIG_PHY_SMSC
    phy_smsc_init();
#endif
...
    genphy_init();

    return 0;
}

        而我们的硬件fec1fec2都是使用SMSC 公司生产的LAN8720A,因此修改为调用phy_smsc_init初始化phy芯片LAN8720A

        具体修改为在mx6ull_toto_defconfig文件添加宏定义CONFIG_PHY_SMSC=y;然后屏蔽CONFIG_PHY_MICREL=yCONFIG_PHY_MICREL_KSZ8XXX=y,如下;

 4.fec部分管脚确认

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

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

在硬件原理图中找到eth1、eth2phy复位管脚对应imx6ull芯片的管脚

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

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

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

        查找结果如上,spi4接口中使用了GPIO5的7和8两个管脚,并且该设备status状态为“okay”激活,解决方法如下,disable掉spi4接口

        还有一种方法就是删除使用gpio5两个管脚的两行定义,这里就不演示了。
编译验证如下;

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

6.使用默认ENET2

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

#ifdef CONFIG_CMD_NET
#define CONFIG_FEC_ENET_DEV     1
#endif

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

&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rmii";
    phy-handle = <&ethphy0>;
    phy-supply = <&reg_peri_3v3>;
    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>; // 复位引脚
    phy-reset-duration = <100>;
    phy-reset-post-delay = <100>;
    status = "disabled";    //禁用
};

三、编译烧写,下载验证

SecureCRT 输出结果如下:

U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 11:49:18 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 34C
Reset cause: POR
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM:  512 MiB
Core:  61 devices, 17 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   
Error: ethernet@20b4000 address not set.

Error: ethernet@20b4000 address not set.
No ethernet found.

Hit any key to stop autoboot:  0 
=> 
=>

提示:

  • Error: ethernet@20b4000 address not set.
  • Error: ethernet@20b4000 address not set.
  • No ethernet found.

这是因为没有设置网络环境变量,1.手动设置 2.系统配置,默认生成

1.设置网络环境变量

setenv ethaddr 32:34:46:78:9A:DC    //设置开发板网卡1 MAC地址 
setenv eth1addr 32:34:46:78:9A:DD   //设置开发板网卡2 MAC地址 
setenv serverip 192.168.0.106       //设置服务器地址,一般是windows或Ubuntu地址
setenv ipaddr 192.168.0.123         //设置开发板IP地址 
setenv gatewayip 192.168.0.1        //设置开发板默认网关 
setenv netmask 255.255.255.0        //设置开发板子网掩码
setenv bootdelay 5                  //设置启动延时实际
saveenv                             //将改变覆盖到MMC

        注意:u-boot的环境变量是设置在MMC中的,不会随着UBoot重新编译而清除,如果修改乱了可以使用如下命令恢复默认:

env default -a // 恢复默认设置
saveenv        // 将改变覆盖到MMC

2.使用软件配置,默认生成

        configs/mx6ull_toto_defconfig 文件,使能随机生成MAC地址

CONFIG_NET_RANDOM_ETHADDR=y

重启开发板,打印信息如下;

U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 11:49:18 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 45C
Reset cause: WDOG
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM:  512 MiB
Core:  61 devices, 17 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   eth1: ethernet@20b4000 [PRIME]
Hit any key to stop autoboot:  0 
=> 
=> 

3.验证网络是否连通

使用ping命令,验证网络是否可以正常工作

=> ping 192.168.0.106
Using ethernet@20b4000 device

ARP Retry count exceeded; starting again
ping failed; host 192.168.0.106 is not alive
=> 

ping测试失败

  • 原因1:可能是windows的防火墙没有关,
  • 原因2:LAN8720初始化需要复位,修改SMSC驱动。

我这边的原因就是uboot LAN8720初始化没有进行复位
drivers/net/phy/phy.c 文件中修改:

int genphy_config_aneg(struct phy_device *phydev)
{
    int result;

    /* SOFT RESET */
    phy_reset(phydev);

    if (phydev->autoneg != AUTONEG_ENABLE)
        return genphy_setup_forced(phydev);

    result = genphy_config_advert(phydev);
    ...
    ...
}

再次编译重启开发板,Ping成功。

=> ping 192.168.0.106
Using ethernet@20b4000 device
host 192.168.0.106 is alive
=> 

四、FEC1网卡1调试

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

1.屏蔽或删除掉 fec2 节点内容

/*
&fec2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet2>;
    phy-mode = "rmii";
    phy-handle = <&ethphy1>;
    phy-supply = <&reg_peri_3v3>;
    phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
    phy-reset-post-delay = <100>;
    status = "okay";    

    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@0 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <0>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";

        };

        ethphy1: ethernet-phy@1 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <1>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET2_REF>;
            clock-names = "rmii-ref";
        };
    };
};
*/

2.在fec1 节点下添加 mdio 子节点

&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rmii";
    phy-handle = <&ethphy0>;
    phy-supply = <&reg_peri_3v3>;
    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <100>;
    phy-reset-post-delay = <100>;
    status = "okay";

    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@0 {
            compatible = "ethernet-phy-id0022.1560";
            reg = <0>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";
        };
    };
};

3.添加MDIO和MDC引脚配置

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

pinctrl_enet1: enet1grp {
    fsl,pins = <
        MX6UL_PAD_GPIO1_IO07__ENET1_MDC     0x1b0b0
        MX6UL_PAD_GPIO1_IO06__ENET1_MDIO    0x1b0b0
        ...
        MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1  0x4001b031
    >;
};

4.修改ENET设备为enet0

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

#ifdef CONFIG_CMD_NET
#define CONFIG_FEC_ENET_DEV     0
#endif

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

U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 14:19:23 +0800)
CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 40C
Reset cause: WDOG
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM:  512 MiB
Core:  60 devices, 17 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@2188000
Hit any key to stop autoboot:  0
=>
=> ping 192.168.0.106
Using ethernet@2188000 device
host 192.168.0.106 is alive
=>

        至此,imx6ull在uboot下FEC1和FEC2均可单独使用,感兴趣的朋友可以试一试uboot如何让fec1和fec2两个网卡同时工作。

        imx6ll开发板u-boot下网络部分就讲到此处,后续有时间将对u-boot的启动流程进行详细梳理与讲解,关注我,后期文章及时观看!

        本期的内容到这就结束了,如果觉得文章不错,可以点赞、收藏和关注哦,谢谢大家收看,下期再见!


        关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Http协议网络读卡器Request获取刷卡数据Response回应驱动显示

三种提交方式可自由设置 RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) HttpReader.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebCont…

Leetcode763. 划分字母区间

Every day a Leetcode 题目来源&#xff1a;763. 划分字母区间 解法1&#xff1a;贪心 题解&#xff1a;划分字母区间 由于同一个字母只能出现在同一个片段&#xff0c;显然同一个字母的第一次出现的下标位置和最后一次出现的下标位置必须出现在同一个片段。因此需要遍历字…

Python-对象的三大特性

Python-对象的三大特性 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 面向对象编程&#xff0c;是许多编程语言都支持的一种编程思想。简单理解是&#xff1a;基于模板&#xff08;类)去创建实体&#xff08;对象&#xff09;&#xff0c;使用…

好程序员:web前端学习要多久?自学前端能找到工作吗?

不少小伙伴看到前端这个岗位发展前景好&#xff0c;薪资待遇高&#xff0c;工作相对稳定&#xff0c;很多人都想转行学前端&#xff0c;但好程序员想说的是&#xff0c;这些都不了解&#xff0c;你怎么能把前端学会呢。所以想要转行学前端的小伙伴们还是赶紧收藏这篇文章吧~ 一…

[Nacos] Nacos Server主要类和接口 (五)

InstanceController: 处理器, 处理服务实例的心跳和注册等请求。 core/Service: 在Nacos客户端的一个微服务名称定义的微服务, 在Nacos服务端是以Service实例的形式出现的。类似于ServiceInfo, ServiceInfo为客户端服务, Service为服务端服务。 RecordListener: Service类实现…

2022年华数杯数学建模A题环形振荡器的优化设计解题全过程文档及程序

2022年华数杯全国大学生数学建模 A题 环形振荡器的优化设计 原题再现&#xff1a; 芯片是指内含集成电路的硅片&#xff0c;在我们日常生活中的手机、电脑、电视、家用电器等领域都会使用到&#xff0c;是高端制造业的核心基石。芯片的制造工艺非常复杂&#xff0c;要经历上千…

ChatGPT的原理与前端领域实践 | 京东云技术团队

一、ChatGPT 简介 ChatGPT的火爆 ChatGPT作为一个web应用&#xff0c;自22年12月发布&#xff0c;仅仅不到3个月的时间&#xff0c;月活用户就累积到1亿。在此之前&#xff0c;最快记录的保持者也需要9个月才达到月活1亿。 ChatGPT的反爬 https://chat.openai.com 因为各种政…

堆排序详解(Heap Sort)

本文已收录于专栏 《算法合集》 目录 一、简单释义1、算法概念2、算法目的3、算法思想4、算法性质 二、核心思想构建排序 三、图形展示宏观展示微观展示 四、算法实现实现思路代码实现客户端调用构造堆的方法元素交换的方法元素比较的方法 运行结果 五、算法描述1、问题描述2、…

如何在 Windows 10 上查找电脑型号

在Windows 10上,计算机型号在许多情况下都可以派上用场。例如,型号可以更容易地找到正确的硬件升级(如内存、存储驱动器、显示器和电源)。或者,如果你必须解决问题或联系技术支持。它还可以方便地将设备编目到库存中。 尽管制造商通常在笔记本电脑或台式机的机箱上使用贴…

Android SDK研发解决方案宝典

Android SDK研发很难整&#xff0c;非常烧脑&#xff0c;与app研发有很多不同。 遇到的问题有很多&#xff0c;各种崩溃&#xff0c;各种空指针&#xff0c;各种冲突需要解决。 所以开发前一定要提前规划好&#xff0c;做好规范。我把我这边一些问题做了记录和分享。 问题1&…

获取订单API接口系列,可接入erp系统场景

抖音和拼多多是目前国内最为火爆的社交和电商平台&#xff0c;为了让更多的开发者能够轻松利用其庞大的用户基础和活跃度&#xff0c;我们提供了相关的订单接口&#xff0c;可帮助开发者快速便捷地完成订单的创建、查询、调整等操作&#xff0c;从而更好地促进业务的发展。以下…

React项目搭建

一、项目搭建&#xff08;不采用vite方式&#xff09; 使用create-react-app生成项目 npx create-react-app pc 进入根目录 cd pc 启动项目 npm start 调整项目目录结构 /src/assets 项目资源文件&#xff0c;比如&#xff0c;图片 等/components 通用组件/pag…

分布式事务解决方案探讨

分布式事务解决方案 一、什么是事务&#xff1f;二、什么是分布式事务&#xff1f;三、分布式事务的理论模型3.1 X/Open 分布式事务模型3.1.1 X/Open事务执行流程3.1.2 XA 协议 3.2 两阶段提交协议3.3 三阶段提交协议 四、分布式事务场景解决方案4.1 TCC补偿方案4.2 基于可靠性…

密码学基本原理和发展——近代密码学

目录 1 密码机通信模型 2 Enigma密码机构造 3 Enigma密码机加解密过程 3.1 加密过程 3.2 解密过程 4 Enigma密码机的安全性 5 Enigma密码机破解 5.1 波兰雷耶夫斯基破解 5.2 图灵破解 近代密码一般指20世纪初&#xff5e;20世纪70年代期间的密码技术。20世纪初电报的出…

快速上手项目1:基于FaceNet的人脸识别项目

快速上手项目1&#xff1a;基于FaceNet的人脸识别项目 说明 ​ 本来想自己复现一下facenet的&#xff0c;但是发现facenet已经被做成了python的第三方库&#xff0c;于是自己用了用&#xff0c;发现挺简单的&#xff0c;然后又看了看源码&#xff0c;感觉模型架构实现部分很简单…

说说 HWND_TOP 和 HWND_TOPMOST 的区别

初看上去&#xff0c;HWND_TOP 和 HWND_TOPMOST 有点类似&#xff0c;但是实际上在调用 DeferWindowPos 或者 SetWindowPos时&#xff0c;它们之间的差别还挺大。 在同级窗口的维护机制中&#xff0c;有一个概念叫做 Z 序 (Z-order) 。出于此讨论的目的&#xff0c;顶级窗口也…

音容笑貌,两臻佳妙,人工智能AI换脸(deepfake)技术复刻《卡萨布兰卡》名场面(Python3.10)

影史经典《卡萨布兰卡》是大家耳熟能详的传世名作&#xff0c;那一首壮怀激烈&#xff0c;激奋昂扬的马赛曲&#xff0c;应当是通片最为激动人心的经典桥段了&#xff0c;本次我们基于faceswap和so-vits库让AI川普复刻美国演员保罗亨雷德高唱《马赛曲》的名场面。 配置人脸替换…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 8 Advertising on the Web

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 8 Advertising on the Web There are several factors that must be considered in evaluating ads: The position of the ad in a list has great influence on whether or not it is clicked.…

Linkage Mapper 之 Barrier Mapper 功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 大草原松鸡"(Greater Sage Grouse)的Lek Kernals(即HCAs),以及连接、连接障碍和恢复机会效果图: 图片

python+Django音乐播放器网站系统0tr3w

音乐网站系统的后台开发目标是以信息管理系统的管理和开发方法&#xff0c;用目前现有的新技术进行系统开发&#xff0c;提供后台管理员高度友好的界面操作以及迅捷的信息处理。而前台的开发目标是以用户的需求作为主导&#xff0c;提供对用户而言非常友好的界面操作环境以及完…