硬件:am3352+lan8710
故障现象: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);
-
...
net_process_received_packet总得不到执行,
eth_get_ops(current)->recv(current, flags, &packet)对应的就是cpsw_recv(),分析cpsw_recv的返回值是如何产生的,最终得到
-
cpsw_recv()
-
return _cpsw_recv()
-
return cpdma_process()
cpdma_process()的返回值,最末一句始终return 0,推测原因就在这里,不知道是不是BUG,将return 0改为下面的if语句手,收
-
-
...
-
if(len){
-
return *len;
-
}else{
-
return 0;
-
}
-
...
-
}
阅读(3131) | 评论(0) | 转发(0) |