Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    f133 挖坑3 ,RMII , RGMII 设置

    编译和烧写问题专区
    1
    2
    1882
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      axw_fae LV 4 last edited by

      天天挖坑,老是有坑在!

      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 版本
      以上都正常了!

      异常
      scrnli_2023_6_19 下午4-58-21.png

      正常
      scrnli_2023_6_19 下午5-00-01.png

      接收可达 400兆
      scrnli_2023_6_19 下午5-02-34.png

      另外 tx_delay , rx_delay 在千兆中调整十分重要! 不能直接使用 dts 中默认配的那一个! 有自已编写了一些测试工具! 若有人有需求可以提供!

      1 Reply Last reply Reply Quote Share 2
      • Referenced by  A axw_fae 
      • A
        axw_fae LV 4 last edited by

        在修改 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, &reg, &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, &reg, &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 不丢包, 一样取中间值

        1 Reply Last reply Reply Quote Share 2
        • Referenced by  A axw_fae 
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策