前言:

这一篇是对自己调试的一个过程记录,代码看的算是比较熟悉了,过程中一直没调过,没后询问原厂FAE,修改了一下dts一个地址参数,就可以了,最终没有太多成就感,修改了PHY芯片的一个状态寄存器。。。

关键点:
知道引脚定义、使用
能正确读到phy id
如何测试,常规可以ping测试。

网卡配置

1、arch/arm64/configs/meson64_smarthome_defconfigCONFIG_DWMAC_MESON=m2、/kernel/aml-4.9/drivers/amlogic/ethernet/phy/amlogic.cEXPORT_SYMBOL_GPL(support_internal_phy_wol);3、kernel/aml-4.9/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.cEXPORT_SYMBOL_GPL(support_internal_phy_wol);
EXPORT_SYMBOL_GPL(support_external_phy_wol);

driver:

config DWMAC_MESONtristate "Amlogic Meson dwmac support"default ndepends on OF && COMMON_CLKhelpSupport for Ethernet controller on Amlogic Meson SoCs.This selects the Amlogic Meson SoC glue layer support forthe stmmac device driver. This driver is used for Meson6,Meson8, Meson8b and GXBB SoCs.config AMLOGIC_ETH_PRIVEtristate "Amlogic private ethernet code"default ndepends on OFhelpSupport for Ethernet controller on Amlogic Meson SoCs.This selects the Amlogic Meson SoC glue layer support forthe stmmac device driver. This driver is used for amlogicprivate driver.

dts

ethmac: ethernet@0xff3f0000 {compatible = "amlogic, gxbb-eth-dwmac";reg = <0x0 0xff3f0000 0x0 0x100000x0 0xff634540 0x0 0x8>;interrupts = <0 8 1>;pinctrl-names = "external_eth_pins";pinctrl-0 = <&external_eth_pins>;mc_val_internal_phy = <0x1800>;mc_val_external_phy = <0x1621>;interrupt-names = "macirq";clocks = <&clkc CLKID_ETH_CORE>;clock-names = "ethclk81";internal_phy=<0>;
};

设备消息

[    1.208116@2] meson6-dwmac ff3f0000.ethernet: no reset control found
[    1.213077@2] stmmac - user ID: 0x11, Synopsys ID: 0x37
[    1.218297@2]  Ring mode enabled
[    1.221530@2]  DMA HW capability register supported[    1.226251@2]  Normal descriptors
[    1.229579@2]  RX Checksum Offload Engine supported
[    1.234475@2]        COE Type 2
[    1.237091@2]  TX Checksum insertion supported
[    1.241565@2]  Wake-Up On Lan supported
[    1.245470@2]  Enable RX Mitigation via HW Watchdog Timer
[    1.258095@2]
[    1.274019@2] libphy: stmmac: probed
[    1.274049@2] eth%d: PHY ID 001cc816 at 0 IRQ POLL (stmmac-0:00) active
[    1.278619@2] eth%d: PHY ID 001cc816 at 1 IRQ POLL (stmmac-0:01)

设备信息

# ls /sys/bus/mdio_bus/devices/
stmmac-0:00  stmmac-0:01

调试

读状态寄存器

// test 读phy寄存器
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_BMSR));
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_PHYSID1));
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_PHYSID2));[    1.292481@0] read phy value = 7869
[    1.295975@0] read phy value = 001c
[    1.299466@0] read phy value = c816

跟phy手册上规定的数据是一样的,通信没有问题

但是获取不到ip,不能ping通,不能上网,继续找原因

ping包测试

用wireshark抓包,发现根本没有数据包发出来。也可以通过量波形查看数据?

包过滤方法:

icmp // 直接过滤ping包

ip.src == 192.168.10.120

数据发送测试

下一步:

示波器抓数据,看有没有数据出去<TXD 0 1 2 3>,clock是否正常

硬件检查说有收到数据包,没检测到发送

下一步看代码发送部分

网卡驱动的发送函数在stmmac_netdev_ops

static const struct net_device_ops stmmac_netdev_ops = {.ndo_open = stmmac_open,.ndo_start_xmit = stmmac_xmit,.ndo_stop = stmmac_release,.ndo_change_mtu = stmmac_change_mtu,.ndo_fix_features = stmmac_fix_features,.ndo_set_features = stmmac_set_features,.ndo_set_rx_mode = stmmac_set_rx_mode,.ndo_tx_timeout = stmmac_tx_timeout,.ndo_do_ioctl = stmmac_ioctl,
#ifdef CONFIG_NET_POLL_CONTROLLER.ndo_poll_controller = stmmac_poll_controller,
#endif.ndo_set_mac_address = eth_mac_addr,
};// stmmac_xmit 发送函数中添加注释
static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
{struct stmmac_priv *priv = netdev_priv(dev);unsigned int nopaged_len = skb_headlen(skb);int i, csum_insertion = 0, is_jumbo = 0;int nfrags = skb_shinfo(skb)->nr_frags;unsigned int entry, first_entry;struct dma_desc *desc, *first;unsigned int enh_desc;unsigned int des;printk("stmmac xmit --------------------1--------------\n");/* Manage oversized TCP frames for GMAC4 device */if (skb_is_gso(skb) && priv->tso) {if (ip_hdr(skb)->protocol == IPPROTO_TCP)return stmmac_tso_xmit(skb, dev);}

设置了ip,进行ping操作

# ping 192.168.10.12
PING 192.168.10.12 (192.168.10.12): 56 data bytes
[  100.146708@1] stmmac xmit --------------------1--------------
[  101.159213@1] stmmac xmit --------------------1--------------
[  102.183251@1] stmmac xmit --------------------1--------------
[  104.151487@1] stmmac xmit --------------------1--------------
[  105.159232@1] stmmac xmit --------------------1--------------
[  105.607249@2] stmmac xmit --------------------1--------------
[  106.183253@1] stmmac xmit --------------------1--------------
[  108.152230@1] stmmac xmit --------------------1--------------
[  109.159212@1] stmmac xmit --------------------1--------------
[  110.183299@1] stmmac xmit --------------------1--------------
[  112.153056@1] stmmac xmit --------------------1--------------
[  113.159210@1] stmmac xmit --------------------1--------------
[  114.183212@1] stmmac xmit --------------------1--------------

可以看到数据发送函数调用了,具体深入这个函数看下,最终发送函数出口是否执行成功

思考:回想一下PHY芯片其实有俩天通路,一路是MII 接口的配置信息,一路是数据收发。

PHY 芯片 通过MII配置寄存器,这部分上面已经验证没有问题。数据收发有点独立,还需要验证,由MII接口成功直接认为数据收发没问题,有点突然!待下一步验证

数据到底从哪里发送

上面的只是回调注册,真正的数据发送调用其实是在 /kernel/net/目录下

xingzhibo@ws13:~/openlinux-A113/kernel/aml-4.9/net$ grep -R "ndo_start_xmit"
bridge/br_if.c: if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
bridge/br_device.c:     .ndo_start_xmit          = br_dev_xmit,
core/netpoll.c:                 dev->name, dev->netdev_ops->ndo_start_xmit);
hsr/hsr_device.c:       return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit);
batman-adv/soft-interface.c:    if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)

关于桥接使用

http://www.linuxfoundation.org/collaborate/workgroups/networking/bridgeA bridge is a way to connect two Ethernet segments together in a protocol independent way. Packets are forwarded based on Ethernet address, rather than IP address (like a router). Since forwarding is done at Layer 2, all protocols can go transparently through a bridge.简单可以理解为:桥接通过以太网地址传送,而不是ip,数据传送在2层。iproute2 - 桥接命令工具Before you start make sure both network cards are set up and working properly. Don't set the IP address, and don't let the startup scripts run DHCP on the ethernet interfaces either. The IP address needs to be set after the bridge has been configured
可以理解为:在网卡正常工作前,不要设置ip,不要使用DHCP命令。必须在桥接设置好后才可以使用# brctl addbr br0# brctl setfd br0 0# brctl addif br0 eth0# dhclient eth0

调通

diff --git a/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts b/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
index 3f48a3e..394e28b 100755
--- a/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
+++ b/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
@@ -176,7 +176,8 @@pinctrl-names = "external_eth_pins";pinctrl-0 = <&external_eth_pins>;mc_val_internal_phy = <0x1800>;
-                       mc_val_external_phy = <0x1621>;
+                       mc_val_external_phy = <0x1804>;
+                       phy-mode = "rmii";interrupt-names = "macirq";clocks = <&clkc CLKID_ETH_CORE>;clock-names = "ethclk81";

最后询问Amlogic,做了这么一点修改就好了,datasheet 也没找到出处…

测试

udhcp -i eth0
# udhcpc -i eth0
udhcpc: started, v1.26.2
udhcpc: sending discover
[ 6102.227981@2] ready send dma data.
udhcpc: sending select for 192.168.8.102
[ 6102.271974@2] ready send dma data.
udhcpc: lease of 192.168.8.102 obtained, lease time 86400
deleting routers
adding dns 192.168.8.1# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:A3:0B:53:D4:B6  inet addr:192.168.8.102  Bcast:192.168.8.255  Mask:255.255.255.0inet6 addr: fd54:bad6:1a5f:ad00:a3:bff:fe53:d4b6/64 Scope:Globalinet6 addr: fe80::a3:bff:fe53:d4b6/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:100 errors:0 dropped:0 overruns:0 frame:0TX packets:88 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:9878 (9.6 KiB)  TX bytes:7447 (7.2 KiB)Interrupt:28 lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)usb0      Link encap:Ethernet  HWaddr 22:6A:93:B5:4C:66  inet addr:192.168.5.1  Bcast:192.168.5.255  Mask:255.255.255.0inet6 addr: fe80::206a:93ff:feb5:4c66/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)# ping 192.168.8.1
PING 192.168.8.1 (192.168.8.1): 56 data bytes
[ 6127.131419@3] ready send dma data.
64 bytes from 192.168.8.1: seq=0 ttl=64 time=1.897 ms
[ 6128.133230@3] ready send dma data.
64 bytes from 192.168.8.1: seq=1 ttl=64 time=1.070 ms
^C
--- 192.168.8.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.070/1.483/1.897 ms
# ping www.baidu.com[ 6132.383958@3] ready send dma data.[ 6132.604788@2] ready send dma data.
PING www.baidu.com (103.235.46.39): 56 data bytes
[ 6132.623724@0] ready send dma data.
64 bytes from 103.235.46.39: seq=0 ttl=54 time=7.868 ms
[ 6133.625856@0] ready send dma data.
64 bytes from 103.235.46.39: seq=1 ttl=54 time=7.261 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 7.261/7.564/7.868 ms
#

ping网关ping百度都没问题了

参考资料

PHY状态机
ethertool
strace

// PHY单独控制
https://blog.csdn.net/wuheshi/article/details/79085546

PHY 调试 https://blog.csdn.net/lee790608/article/details/88642186

【A113】网卡芯片Realtek RTL8201驱动调试相关推荐

  1. ubuntu18.04下双机驱动调试

    环境搭建: https://blog.51cto.com/haidragon/2337256 这里要先说下如果要下内核断点要先在编译前去掉写保护,但是下自己写的驱动可以不要. 第二个最好编译完后压缩v ...

  2. VMware调试.【转】VMware+Windgb+Win7 内核驱动调试

    ZC:我遇到的问题:com_1 怎么都不成功,记起来 貌似原来也遇到过这个问题,看了一下 VMware里面创建的是 "串行端口 2",于是 将 "com_1"改 ...

  3. 驱动调试(二)-环形缓冲区到文件

    目录 驱动调试(二)-环形缓冲区到文件 目标 框架分析 虚拟文件系统proc dmesg proc_misc_init kmsg_read do_syslog 程序1创建文件 程序2提供读函数 程序3 ...

  4. 使用驱动调试助手应该注意的问题

    最近,使用wince驱动牛人写的驱动调试助手调试扩展串口驱动,发现要注意一些问题. 以前使用驱动调试助手,我都是调试BSP上没有的驱动,现在调试已经存在的串口驱动该怎么做呢?难道要我把串口驱动从NK中 ...

  5. 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置

    原文发表于百度空间,2009-01-08 ========================================================================== Wind ...

  6. android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5PV310(sams ...

  7. Linux驱动调试中的Debugfs的使用简介

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  8. Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  9. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

最新文章

  1. 聊聊flink的OperatorStateBackend
  2. 申请阿里云服务器并远程登录
  3. Django之用户上传文件的参数配置
  4. CentOS环境下tomcat启动超级慢的解决方案
  5. 通讯录数据表设计v0.5
  6. 《Adobe Photoshop大师班:经典作品与完美技巧赏析》即将上市
  7. 获取手机网络状态之ConnectivityManager
  8. Tensorflow:estimator训练
  9. Broadleaf概念
  10. 【ubuntu操作系统入门】Ubuntu常用命令大全一
  11. CAngle类 角度转换类 C++
  12. 计算机常用端口号以及对应服务总结
  13. Latex希腊字母对照表
  14. 腾讯云TRTC —— 实时音视频完整案例 音视频+共享屏幕直播
  15. nginx压缩静态文件
  16. excel表格末尾添加一行_七夕表白,用Excel试试!抖音爆红,一晚点赞破百万
  17. Python学习笔记(纯代码)
  18. Skype for Business Server-呼叫质量仪表板(一)安装与配置
  19. 2021年中国海上风电行业发展现状分析,双碳循环下行业飞速发展「图」
  20. 如何做好网站优化推广

热门文章

  1. 从服务器上下载文件的方法
  2. 2011年11月CET4
  3. 原生JS的HTTP请求相关知识
  4. 一个用户下多个表空间
  5. Jetpack系列之开胃菜
  6. python缩写词_扩展Python中的英语缩略词
  7. java实现国庆星期日
  8. FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection
  9. 0118-深度学习基础及一些代码实例
  10. 129_Bribe the Prisoners_DP