详细讲解u |
您所在的位置:网站首页 › ad芯片原理图引脚报错 › 详细讲解u |
目录 一、前章回顾 二、硬件原理图检查 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为:0x0,ENET2对应的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 = ; phy-mode = "rmii"; phy-handle = ; phy-supply = ; status = "okay"; }; &fec2 { pinctrl-names = "default"; pinctrl-0 = ; phy-mode = "rmii"; phy-handle = ; phy-supply = ; status = "okay"; mdio { #address-cells = ; #size-cells = ; ethphy0: ethernet-phy@2 { compatible = "ethernet-phy-id0022.1560"; reg = ; ... }; ethphy1: ethernet-phy@1 { compatible = "ethernet-phy-id0022.1560"; reg = ; ... }; }; };修改FEC1节点对应的phy地址为0,如下; mdio { #address-cells = ; #size-cells = ; ethphy0: ethernet-phy@0 { compatible = "ethernet-phy-id0022.1560"; reg = ; micrel,led-mode = ; clocks = ; clock-names = "rmii-ref"; }; ... }重新编译,烧写验证,还是报错 接下来就只有从网络初始化入口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; }而我们的硬件fec1和fec2都是使用SMSC 公司生产的LAN8720A,因此修改为调用phy_smsc_init初始化phy芯片LAN8720A。 具体修改为在mx6ull_toto_defconfig文件添加宏定义CONFIG_PHY_SMSC=y;然后屏蔽CONFIG_PHY_MICREL=y和CONFIG_PHY_MICREL_KSZ8XXX=y,如下; 继续往下,在fecmxc_probe函数中发现调用了fec_gpio_reset()函数复位fec网卡,但是设备树文件中没有配置复位管脚 fecmxc_of_to_plat函数会对设备中的phy的这三个定义进行解析。因此在设备中添加如下三个定义: 在硬件原理图中找到eth1、eth2phy复位管脚对应imx6ull芯片的管脚 设备树文件imx6ul-14x14-evk.dtsi中,具体配置如下: 下面要做的就是查看在设备树文件中查看一下,刚刚添加的两个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 = ; phy-mode = "rmii"; phy-handle = ; phy-supply = ; phy-reset-gpios = ; // 复位引脚 phy-reset-duration = ; phy-reset-post-delay = ; 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 = ; phy-mode = "rmii"; phy-handle = ; phy-supply = ; phy-reset-gpios = ; phy-reset-duration = ; phy-reset-post-delay = ; status = "okay"; mdio { #address-cells = ; #size-cells = ; ethphy0: ethernet-phy@0 { compatible = "ethernet-phy-id0022.1560"; reg = ; micrel,led-mode = ; clocks = ; clock-names = "rmii-ref"; }; ethphy1: ethernet-phy@1 { compatible = "ethernet-phy-id0022.1560"; reg = ; micrel,led-mode = ; clocks = ; clock-names = "rmii-ref"; }; }; }; */ 2.在fec1 节点下添加 mdio 子节点 &fec1 { pinctrl-names = "default"; pinctrl-0 = ; phy-mode = "rmii"; phy-handle = ; phy-supply = ; phy-reset-gpios = ; phy-reset-duration = ; phy-reset-post-delay = ; status = "okay"; mdio { #address-cells = ; #size-cells = ; ethphy0: ethernet-phy@0 { compatible = "ethernet-phy-id0022.1560"; reg = ; micrel,led-mode = ; clocks = ; 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知识共享】,后续精彩内容及时收看了解。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |