Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1502919
  • 博文数量: 108
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 997
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-29 09:58
个人简介

兴趣是坚持一件事永不衰竭的动力

文章分类

全部博文(108)

文章存档

2021年(1)

2020年(10)

2019年(19)

2018年(9)

2016年(23)

2015年(43)

2013年(3)

我的朋友

分类: LINUX

2019-12-16 16:59:57

硬件: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()的

点击(此处)折叠或打开

  1. ...
  2. ret = eth_get_ops(current)->recv(current, flags, &packet);
  3. flags = 0;
  4.  if (ret > 0)
  5.  net_process_received_packet(packet, ret);
  6. ...
net_process_received_packet总得不到执行,eth_get_ops(current)->recv(current, flags, &packet)对应的就是cpsw_recv(),分析cpsw_recv的返回值是如何产生的,最终得到

点击(此处)折叠或打开

  1. cpsw_recv()
  2.    return _cpsw_recv()
  3.        return cpdma_process()
cpdma_process()的返回值,最末一句始终return 0,推测原因就在这里,不知道是不是BUG,将return 0改为下面的if语句手,收

点击(此处)折叠或打开


  1. ...
  2. if(len){
  3.         return *len;
  4.     }else{
  5.         return 0;
  6. }
  7. ...
  8. }


阅读(3131) | 评论(0) | 转发(0) |
0

上一篇:网卡发送数据过程

下一篇: 中断

给主人留下些什么吧!~~