f133 挖坑3 ,RMII , RGMII 设置
-
天天挖坑,老是有坑在!
MQ-R 的 dts 默认没有把 gmac 使能,故要在 dts 开头处把 gmac 加上
compatible = "allwinner,d1", "arm,sun20iw1p1", "allwinner,sun20iw1p1"; aliases { dsp0 = &dsp0; dsp0_gpio_int= &dsp0_gpio_int; gmac0 = &gmac0; };
另外 DTS 默认驱动能力只有 10 , 若是非自制在同一片板子,使用开发版自行串接的,驱动能力可能不行! 故可以自上改动一些
// mq-r gmac_pins_a: gmac@0 { pins = "PG0", "PG1", "PG2", "PG3", "PG4", "PG5", "PG6", "PG7", "PG8", "PG9" , "PG10", "PG12", "PG13", "PG14", "PG15"; function = "gmac0"; // drive-strength = <10>; drive-strength = <40>; };
另外很多文章中介绍使用 iperf3 来测试! 但是运行中有问题
当连接在 百兆
iperf3 -s ok
iperf3-c ok
当连接在 千兆
iperf3 -s ok
iperf3 -c 连 10兆 都达不到若使用 make menuconfig 中改用 iperf 版本
以上都正常了!异常
正常
接收可达 400兆
另外 tx_delay , rx_delay 在千兆中调整十分重要! 不能直接使用 dts 中默认配的那一个! 有自已编写了一些测试工具! 若有人有需求可以提供!
-
-
在修改 tx_delay , rx_delay 需要在dts 中配置,每次都要重新再烧写过! 所以在调试时需要耗费很多气力。只要修改一下原本的驱动,就可以无需另外的工具,就可以进行的调试
驱动位置 lichee/linux-5.4/drivers/net/ethernet/allwinner/sunxi-gmac.c
原代码
static ssize_t mii_write_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct net_device *ndev = NULL; struct geth_priv *priv = NULL; int ret = 0; u16 reg, addr, val; char *ptr; ptr = (char *)buf; if (dev == NULL) { pr_err("Argment is invalid\n"); return count; } ndev = dev_get_drvdata(dev); if (ndev == NULL) { pr_err("Net device is null\n"); return count; } priv = netdev_priv(ndev); if (priv == NULL) { pr_err("geth_priv is null\n"); return count; } if (!netif_running(ndev)) { pr_warn("eth is down!\n"); return count; } ret = sunxi_parse_write_str(ptr, &addr, ®, &val); if (ret) return ret; priv->mii_reg.reg = reg; priv->mii_reg.addr = addr; priv->mii_reg.value = val; return count; }
攸改过后
static ssize_t mii_write_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct net_device *ndev = NULL; struct geth_priv *priv = NULL; int ret = 0; u16 reg, addr, val; char *ptr; ptr = (char *)buf; if (dev == NULL) { pr_err("Argment is invalid\n"); return count; } ndev = dev_get_drvdata(dev); if (ndev == NULL) { pr_err("Net device is null\n"); return count; } priv = netdev_priv(ndev); if (priv == NULL) { pr_err("geth_priv is null\n"); return count; } if (!netif_running(ndev)) { pr_warn("eth is down!\n"); return count; } ret = sunxi_parse_write_str(ptr, &addr, ®, &val); if (ret) return ret; if((2 == reg) || (3 == reg)) { u32 clk_value; u8 tdelay; u8 rdelay; clk_value = readl(priv->base_phy); tdelay = (clk_value >> 10) & 0x07; rdelay = (clk_value >> 5) & 0x1f; printk("gmac delay read tx--> %x , rx--> %x \n", tdelay, rdelay); if(2 == reg) { tdelay = (val & 0x07); } else { rdelay = (val & 0x1f); } printk("gmac delay write tx--> %x , rx--> %x \n", tdelay, rdelay); clk_value &= ~((0x07 << 10)| (0x1F << 5)); clk_value |= ((tdelay << 10) | (rdelay << 5)); writel(clk_value, priv->base_phy); } priv->mii_reg.reg = reg; priv->mii_reg.addr = addr; priv->mii_reg.value = val; return count; }
使用方式如下:
-
先使用 ifconfig eth0 192.168.1.100 ,啟动 gmac 驱动
-
使用下面命令,进行 tx_delay 修改,3 个参数 , 第一个随便设,第二个需设置 2 , 第三个為 tx_delay 设置值,范围 0x0 ~ 0x7
root@TinaLinux:/# echo 0 2 3 > /sys/devices/platform/soc@3000000/4500000.eth/mii_write [ 66.901376] gmac delay read tx--> 2 , rx--> d [ 66.911086] gmac delay write tx--> 3 , rx--> d root@TinaLinux:/# echo 0 2 5 > /sys/devices/platform/soc@3000000/4500000.eth/mii_write [ 92.944996] gmac delay read tx--> 3 , rx--> d [ 92.954582] gmac delay write tx--> 5 , rx--> d
- 使用下面命令,进行 rx_delay 修改,3 个参数 , 第一个随便设,第二个需设置 3 , 第三个為 rx_delay 设置值,范围 0x0 ~ 0x1f , 输入需要使用 16 进位
root@TinaLinux:/# echo 0 3 a > /sys/devices/platform/soc@3000000/4500000.eth/mi_write [ 108.317230] gmac delay read tx--> 5 , rx--> d [ 108.327034] gmac delay write tx--> 5 , rx--> a root@TinaLinux:/# echo 0 3 1c > /sys/devices/platform/soc@3000000/4500000.eth/mii_write [ 120.347615] gmac delay read tx--> 5 , rx--> a [ 120.357371] gmac delay write tx--> 5 , rx--> 1c root@TinaLinux:/# echo 0 3 1c > /sys/devices/platform/soc@3000000/4500000.eth/mii_write [ 126.976849] gmac delay read tx--> 5 , rx--> 1c [ 126.986301] gmac delay write tx--> 5 , rx--> 1c
-
测试时先使用外机 ping d1s ,调整 rx_delay 值后,使用 ifconfig 查看 rx_byte 及 crc 值,看是否有正常接收,并且无 crc 。 找出某一区间都正常,例如 4 ~ c 都是正常的! 此时将 rx_delay 设置在 8 。
-
rx_delay 设置后,在用 d1s ping 外机,调整 tx_delay 值,看在什么区间可以正常 ping 不丢包, 一样取中间值
-
-
Copyright © 2023 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号