<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[f133 挖坑3 ，RMII , RGMII 设置]]></title><description><![CDATA[<p dir="auto">天天挖坑，老是有坑在！</p>
<p dir="auto">MQ-R 的 dts 默认没有把 gmac 使能，故要在 dts 开头处把  gmac 加上</p>
<pre><code>        compatible = "allwinner,d1", "arm,sun20iw1p1", "allwinner,sun20iw1p1";

        aliases {
                dsp0 = &amp;dsp0;
                dsp0_gpio_int= &amp;dsp0_gpio_int;
                gmac0 = &amp;gmac0;
        };
</code></pre>
<p dir="auto">另外 DTS 默认驱动能力只有 10 , 若是非自制在同一片板子，使用开发版自行串接的，驱动能力可能不行！ 故可以自上改动一些</p>
<pre><code>// 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 = &lt;10&gt;;
                drive-strength = &lt;40&gt;;
        };

</code></pre>
<p dir="auto">另外很多文章中介绍使用 iperf3 来测试！ 但是运行中有问题</p>
<p dir="auto">当连接在 百兆<br />
iperf3 -s   ok<br />
iperf3-c   ok<br />
当连接在 千兆<br />
iperf3 -s  ok<br />
iperf3 -c  连 10兆 都达不到</p>
<p dir="auto">若使用 make menuconfig 中改用 iperf 版本<br />
以上都正常了！</p>
<p dir="auto">异常<br />
<img src="/assets/uploads/files/1687165224478-scrnli_2023_6_19-%E4%B8%8B%E5%8D%884-58-21.png" alt="scrnli_2023_6_19 下午4-58-21.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">正常<br />
<img src="/assets/uploads/files/1687165224492-scrnli_2023_6_19-%E4%B8%8B%E5%8D%885-00-01.png" alt="scrnli_2023_6_19 下午5-00-01.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">接收可达 400兆<br />
<img src="/assets/uploads/files/1687165370259-scrnli_2023_6_19-%E4%B8%8B%E5%8D%885-02-34.png" alt="scrnli_2023_6_19 下午5-02-34.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">另外 tx_delay , rx_delay  在千兆中调整十分重要！ 不能直接使用 dts 中默认配的那一个！ 有自已编写了一些测试工具！ 若有人有需求可以提供！</p>
]]></description><link>https://bbs.aw-ol.com/topic/3725/f133-挖坑3-rmii-rgmii-设置</link><generator>RSS for Node</generator><lastBuildDate>Thu, 18 Jun 2026 01:42:35 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/3725.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jun 2023 09:05:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to f133 挖坑3 ，RMII , RGMII 设置 on Wed, 28 Jun 2023 02:22:25 GMT]]></title><description><![CDATA[<p dir="auto">在修改 tx_delay , rx_delay 需要在dts 中配置，每次都要重新再烧写过！ 所以在调试时需要耗费很多气力。只要修改一下原本的驱动，就可以无需另外的工具，就可以进行的调试</p>
<p dir="auto">驱动位置   lichee/linux-5.4/drivers/net/ethernet/allwinner/sunxi-gmac.c</p>
<p dir="auto">原代码</p>
<pre><code>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, &amp;addr, &amp;reg, &amp;val);
        if (ret)
                return ret;

        priv-&gt;mii_reg.reg = reg;
        priv-&gt;mii_reg.addr = addr;
        priv-&gt;mii_reg.value = val;

        return count;
}
</code></pre>
<p dir="auto">攸改过后</p>
<pre><code>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, &amp;addr, &amp;reg, &amp;val);
        if (ret)
                return ret;

        if((2 == reg) || (3 == reg))
        {
                u32 clk_value;
                u8 tdelay;
                u8 rdelay;

                clk_value = readl(priv-&gt;base_phy);

                tdelay = (clk_value &gt;&gt; 10) &amp; 0x07;
                rdelay = (clk_value &gt;&gt; 5) &amp; 0x1f;

                printk("gmac delay read  tx--&gt; %x , rx--&gt; %x \n", tdelay, rdelay);

                if(2 == reg)
                {
                        tdelay = (val &amp; 0x07);
                }
                else
                {
                        rdelay = (val &amp; 0x1f);
                }

                printk("gmac delay write tx--&gt; %x , rx--&gt; %x \n", tdelay, rdelay);

                clk_value &amp;= ~((0x07 &lt;&lt; 10)| (0x1F &lt;&lt; 5));
                clk_value |= ((tdelay &lt;&lt; 10) | (rdelay &lt;&lt; 5));

                writel(clk_value, priv-&gt;base_phy);
        }

        priv-&gt;mii_reg.reg = reg;
        priv-&gt;mii_reg.addr = addr;
        priv-&gt;mii_reg.value = val;

        return count;
}
</code></pre>
<p dir="auto">使用方式如下：</p>
<ul>
<li>
<p dir="auto">先使用 ifconfig eth0 192.168.1.100  ，啟动 gmac 驱动</p>
</li>
<li>
<p dir="auto">使用下面命令，进行 tx_delay 修改，3 个参数 , 第一个随便设，第二个需设置 2 , 第三个為 tx_delay 设置值，范围 0x0 ~ 0x7</p>
</li>
</ul>
<pre><code>root@TinaLinux:/# echo 0 2 3 &gt; /sys/devices/platform/soc@3000000/4500000.eth/mii_write
[   66.901376] gmac delay read  tx--&gt; 2 , rx--&gt; d 
[   66.911086] gmac delay write tx--&gt; 3 , rx--&gt; d 

root@TinaLinux:/# echo 0 2 5 &gt; /sys/devices/platform/soc@3000000/4500000.eth/mii_write
[   92.944996] gmac delay read  tx--&gt; 3 , rx--&gt; d 
[   92.954582] gmac delay write tx--&gt; 5 , rx--&gt; d 
</code></pre>
<ul>
<li>使用下面命令，进行 rx_delay 修改，3 个参数 , 第一个随便设，第二个需设置 3 , 第三个為 rx_delay 设置值，范围 0x0 ~ 0x1f  ,  输入需要使用 16 进位</li>
</ul>
<pre><code>root@TinaLinux:/# echo 0 3  a &gt; /sys/devices/platform/soc@3000000/4500000.eth/mi_write 
[  108.317230] gmac delay read  tx--&gt; 5 , rx--&gt; d 
[  108.327034] gmac delay write tx--&gt; 5 , rx--&gt; a 

root@TinaLinux:/# echo 0 3  1c &gt; /sys/devices/platform/soc@3000000/4500000.eth/mii_write
[  120.347615] gmac delay read  tx--&gt; 5 , rx--&gt; a 
[  120.357371] gmac delay write tx--&gt; 5 , rx--&gt; 1c

root@TinaLinux:/# echo 0 3  1c &gt; /sys/devices/platform/soc@3000000/4500000.eth/mii_write
[  126.976849] gmac delay read  tx--&gt; 5 , rx--&gt; 1c 
[  126.986301] gmac delay write tx--&gt; 5 , rx--&gt; 1c 
</code></pre>
<ul>
<li>
<p dir="auto">测试时先使用外机 ping d1s ，调整 rx_delay 值后，使用 ifconfig 查看  rx_byte 及 crc 值，看是否有正常接收，并且无 crc 。 找出某一区间都正常，例如  4 ~ c 都是正常的！ 此时将 rx_delay 设置在 8 。</p>
</li>
<li>
<p dir="auto">rx_delay 设置后，在用 d1s ping 外机，调整 tx_delay 值，看在什么区间可以正常 ping 不丢包， 一样取中间值</p>
</li>
</ul>
]]></description><link>https://bbs.aw-ol.com/post/16741</link><guid isPermaLink="true">https://bbs.aw-ol.com/post/16741</guid><dc:creator><![CDATA[axw_fae]]></dc:creator><pubDate>Wed, 28 Jun 2023 02:22:25 GMT</pubDate></item></channel></rss>