imx6ull开发板u-boot下网络部分的移植和调试

嗨喽,大家好,我是程序猿老王,程序猿老王就是我。
今天给大家讲一讲如何将u-boot网络部分的移植和调试。
一、前章回顾上一章,已经讲过如何讲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 26creset cause: pormodel: freescale i.mx6 ultralitelite 14x14 evk boardboard: mx6ull totodram: 512 mibcore: 65 devices, 17 uclasses, devicetree: separatemmc: fsl_sdhc: 0, fsl_sdhc: 1loading environment from mmc... okin: serialout: serialerr: serialnet: could not get phy for fec1: addr 1could not get phy for fec1: addr 1get shared mii bus on ethernet@2188000could not get phy for fec1: addr 2get shared mii bus on ethernet@2188000could not get phy for fec1: addr 2no 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地址为0x0,如下;
mdio { #address-cells = ; #size-cells = ; ethphy0: ethernet-phy@0 { compatible = ethernet-phy-id0022.1560; reg = ; micrel,led-mode = ; clocks = ; 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 phyn); 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,如下;
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_enent_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 34creset cause: pormodel: freescale i.mx6 ultralitelite 14x14 evk boardboard: mx6ull totodram: 512 mibcore: 61 devices, 17 uclasses, devicetree: separatemmc: fsl_sdhc: 0, fsl_sdhc: 1loading environment from mmc... okin: serialout: serialerr: serialnet: 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.设置网络环境变量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 // 将改变覆盖到mmc2.使用软件配置,默认生成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 45creset cause: wdogmodel: freescale i.mx6 ultralitelite 14x14 evk boardboard: mx6ull totodram: 512 mibcore: 61 devices, 17 uclasses, devicetree: separatemmc: fsl_sdhc: 0, fsl_sdhc: 1loading environment from mmc... okin: serialout: serialerr: serialnet: eth1: ethernet@20b4000 [prime]hit any key to stop autoboot: 0 = > = >3.验证网络是否连通使用ping命令,验证网络是否可以正常工作
= > ping 192.168.0.106using ethernet@20b4000 devicearp retry count exceeded; starting againping failed; host 192.168.0.106 is not alive= >ping测试失败
原因1:可能是windows的防火墙没有关,原因2:lan8720初始化需要复位,修改smsc驱动。
我这边的原因就是ubootlan8720初始化没有进行复位,在 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.106using ethernet@20b4000 devicehost 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 = ;};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 40creset cause: wdogmodel: freescale i.mx6 ultralitelite 14x14 evk boardboard: mx6ull totodram: 512 mibcore: 60 devices, 17 uclasses, devicetree: separatemmc: fsl_sdhc: 0, fsl_sdhc: 1loading environment from mmc... okin: serialout: serialerr: serialnet: eth0: ethernet@2188000hit any key to stop autoboot: 0= >= > ping 192.168.0.106using ethernet@2188000 devicehost 192.168.0.106 is alive= >至此,imx6ull在uboot下fec1和fec2均可单独使用,感兴趣的朋友可以试一试uboot如何让fec1和fec2两个网卡同时工作。
imx6ll开发板u-boot下网络部分就讲到此处,后续有时间将对u-boot的启动流程进行详细梳理与讲解,关注我,后期文章及时观看!
本期的内容到这就结束了,如果觉得文章不错,可以点赞、收藏和关注哦,谢谢大家收看,下期再见!

台湾晶圆代工与封装测试部分将在5G芯片需求上取得优势
宁德时代拓展电动超跑配套
物联网如何解锁未来的家居自动化
柔性传感器有哪些作用阻碍其发展的难题又有哪些
基于PLC控制的去石机如何数据采集到云平台进行监控管理
imx6ull开发板u-boot下网络部分的移植和调试
一款基准测量工具的雏形——MLPerf
传统汽车巨头品牌的自动驾驶战略大盘点
测试对象的输出阻抗和电压计的输入阻抗对测试值的影响
i.MX8MP 应用笔记 | 常见问题解决思路
卫生安全的电子自来水龙头
三控开关怎么接_三控开关接线图
油烟在线监控系统的功能特点
天马鼎力支持荣耀100系列首发荣耀绿洲护眼屏
这个小器件决定了电流能否跑的稳
微软持续改进Win32 API语言易用性和兼容性 包括C#和Rust
新日本无线低压差稳压器NJM2837,现已开始供货
PLC在轮胎硫化机上的应用
ChatGPT正式上线对搜索引擎有什么影响
华为Mate10什么时候上市?华为Mate10:真徕卡,德味!十足 狙击iPhone8!