故障现象:uboot使用ping命令时ping主机时,使用wireshark抓不到数据。
示波器抓lan8710的TXD引脚,ping的时候确实有波形,TXCLK的确有25Mhz的时钟信号。RXD也能抓到波形
思考:硬件是没有问题的,重点考虑软件。
(1)phy配置,在phy初始化时,打印出phy寄存器的全部内容,经查,没有问题,如下第一列是寄存器的索引
0 :00003100 get_phy_id ../drivers/net/phy/phy.c line:724
1 :0000782d get_phy_id ../drivers/net/phy/phy.c line:727
2 :00000007 get_phy_id ../drivers/net/phy/phy.c line:730
3 :0000c0f1 get_phy_id ../drivers/net/phy/phy.c line:733
4 :000001e1 get_phy_id ../drivers/net/phy/phy.c line:736
5 :00004de1 get_phy_id ../drivers/net/phy/phy.c line:739
6 :00000003 get_phy_id ../drivers/net/phy/phy.c line:742
17 :00000002 get_phy_id ../drivers/net/phy/phy.c line:745
18 :000000e0 get_phy_id ../drivers/net/phy/phy.c line:748
26 :00000000 get_phy_id ../drivers/net/phy/phy.c line:751
27 :0000000a get_phy_id ../drivers/net/phy/phy.c line:754
29 :000000c8 get_phy_id ../drivers/net/phy/phy.c line:757
30 :00000000 get_phy_id ../drivers/net/phy/phy.c line:760
31 :00001058 get_phy_id ../drivers/net/phy/phy.c line:763
(2)cpu控制寄存器的配置。经过网上搜索,如果TXD有波形信号,那需要考虑时序的问题,检查cpu相关的寄存器。https://blog.csdn.net/szhebin/article/details/79802735 这篇博文提到
在 board_eth_init(bd_t *bis)函数中,修改 cpsw 的通信模式为 RMII:
int board_eth_init(bd_t *bis)
{
.......
writel((RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE), &cdev->miisel);
........
}
注: RMII_CHIPCKL_ENABLE 为 rmii_refclk 输入使能,即 rmii_refclk 信号由 phy 芯片提供而不是由
CPU 提供,该参数由硬件设计决定。在底板设计指导手册中,使用的是 LAN8720 输出的 rmii_refclk 信号,
因此需要添加改参数,否则会导致 rmii_refclk 信号出现问题;如果硬件设计为由 CPU 提供的话,则无需
添加该参数。
经过查找,uboot-2019.10中,使用了dts,故修改,vi am335x-evm.dts ,在末尾添加一个结点,表明使用外部时钟
&phy_sel {
rmii-clock-ext;
};
(3)这个数据是怎样被使用的呢
U_BOOT_DRIVER(eth_cpsw) = {
.name = "eth_cpsw",
.id = UCLASS_ETH,
#if CONFIG_IS_ENABLED(OF_CONTROL)
.of_match = cpsw_eth_ids,
.ofdata_to_platdata = cpsw_eth_ofdata_to_platdata,
.platdata_auto_alloc_size = sizeof(struct eth_pdata),
#endif
.probe = cpsw_eth_probe,
.ops = &cpsw_eth_ops,
.priv_auto_alloc_size = sizeof(struct cpsw_priv),
.flags = DM_FLAG_ALLOC_PRIV_DMA | DM_FLAG_PRE_RELOC,
};
cpsw_eth_ofdata_to_platdata成员会解析设备树的这个结点
(4)重新编译,ping命令执行后,wireshark已经能抓到数据,不过uboot还不能收到数据,需要继续调试
===================现在调试通过了========================
( 5 )经过跟综代码,发现
net_loop()的
点击(此处)折叠或打开
-
...
-
ret = eth_get_ops(current)->recv(current, flags, &packet);
-
flags = 0;
-
if (ret > 0)
-
net_process_received_packet(packet, ret);
- ...
点击(此处)折叠或打开
-
cpsw_recv()
-
return _cpsw_recv()
- return cpdma_process()
点击(此处)折叠或打开
-
- ...
-
if(len){
-
return *len;
-
}else{
-
return 0;
- }
- ...
- }