This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x第二路千兆网口不通



        板子上有2路网口,第一路为DP83848 百兆网(RMII接口),第二路为KSZ9031千兆网(RGMII接口),在3.20上已经调试完成,所以硬件上不存在问题,但现在将其移植到3.14版本上,第二路网口一直不能ping通,已经进行的确认和尝试如下:

1.gmii_sel寄存器配置为0xc9,即第一个port使用rmii模式,第二个port使用rgmii模式,使用chip pin clk,无internal delay

2.dts配置如下:

&mac {

        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&cpsw_default>;
        pinctrl-1 = <&cpsw_sleep>;
        dual_emac;

}

&davinci_mdio {

        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&davinci_mdio _default>;
        pinctrl-1 = <&davinci_mdio _sleep>;

}

&cpsw_emac0 {
        phy_id = <&davinci_mdio>, <1>;
        phy-mode = "rmii";
        dual_emac_res_vlan = <3>;
};

&cpsw_emac1 {
        phy_id = <&davinci_mdio>, <2>;
        phy-mode = "rgmii";
        dual_emac_res_vlan = <4>;
};

相应管脚确认已配置

3.根据链接processors.wiki.ti.com/.../Linux_Core_CPSW_User's_Guide 配置了内核相关选项

4.内核启动有以下网口信息:

......

[    4.124316] davinci_mdio 4a101000.mdio: phy[1] : device 4a101000.mdio:01, driver unknown 

[    4.171734] davinci_mdio 4a101000.mdio: phy[2] : device 4a101000.mdio:02, driver Micrel KSZ9031 Gigabit PHY 

......

[    11.364246] net eth0 : phy found : id is 0x20005c90

 [    11.534238] net eth1 : phy found : id is 0x221622

...

5.插入网线后,千兆网口均能自动识别插入拔出以及自适应100M/1000M,可以ping自身IP和回环网口,但是ping不通外网

6.e2e.ti.com/.../182794.aspx 根据链接中所描述的配置了KSZ9031的skew参数,没有效果

7.此外,硬件连接上有一个gpio脚接到KSZ9031的rst脚,在代码中有进行以下复位操作:

    gpio_direction_output(64, 0);

    gpio_set_value(64, 1);

    mdelay(10);

    gpio_direction_output(64,0);

    mdelay(10);

    gpio_direction_output(64,1);

-内核版本:3.14.26 

问题:第二路千兆网口不通,暂时不能定位原因,请问现在还可以确认哪些方面

  •     在不同版本的内核上进行示波器的测量,发现ping的时候TXD管脚都有信号产生,但是有一个TX_CLK管脚的时钟周期不一致,在可以ping通的3.20版本上时钟周期为40ns,在不能ping通的3.14版本上时钟周期为100ns,在DTS中已经定义了此管脚

    0x5x (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a6.rgmii2_tclk */

        请问在哪里可以修改该时钟的频率?

  • 我在cpsw.c中加入了打印;

    在cpsw_probe中有以下代码:

        priv->clk = devm_clk_get(&pdev, "fck");

        ...

        priv->bus_freq_mhz = clk_get_rate(priv->clk) / 1000000;  ------>此处的bus_freq_mhz 在可以ping通的板子上是125,而在基于dts的3.14版本上面是50

    但是这个fck时钟是dts文件中传进来的,在am33xx.dtsi 中默认配置为&cpsw_125mhz_gclk,为什么获得的实际上只有50M?

  • 现在发现的有以下问题:

    1.cpsw.c中传进来的fck频率不对,应该为125,变成了50,但这个频率是dtsi头文件中定义的,没有做修改

    2.用示波器进行测试,发现连接千兆网卡的rgmii2_rclk时钟周期跟可以ping通的板子一致(20ns),但rgmii2_tclk的时钟周期是可以ping通的板子的2.5倍(50ns)

    烦请帮忙分析下

  • 使用的uboot-2014中没有配置好时钟,在uboot中添加下面代码可以配置Core Pll的时钟

    static void core_pll_config(void)
    {
        u32 clkmode, clksel, div_m4, div_m5, div_m6;
        clkmode = readl(CM_CLKMODE_DPLL_CORE);
        clksel = readl(CM_CLKSEL_DPLL_CORE);
        div_m4 = readl(CM_DIV_M4_DPLL_CORE);
        div_m5 = readl(CM_DIV_M5_DPLL_CORE);
       div_m6 = readl(CM_DIV_M6_DPLL_CORE);
        /* Set the PLL to bypass Mode */
        writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_CORE);
        while(readl(CM_IDLEST_DPLL_CORE) != 0x00000100);
        clksel = clksel & (~0x7ffff);
        clksel = clksel | ((COREPLL_M << 0x8) | COREPLL_N);
        writel(clksel, CM_CLKSEL_DPLL_CORE);
        div_m4 = div_m4 & ~0x1f;
        div_m4 = div_m4 | COREPLL_M4;
        writel(div_m4, CM_DIV_M4_DPLL_CORE);
        div_m5 = div_m5 & ~0x1f;
        div_m5 = div_m5 | COREPLL_M5;
        writel(div_m5, CM_DIV_M5_DPLL_CORE);
        div_m6 = div_m6 & ~0x1f;
        div_m6 = div_m6 | COREPLL_M6;  
        writel(div_m6, CM_DIV_M6_DPLL_CORE);
        clkmode = clkmode | 0x7; 
        writel(clkmode, CM_CLKMODE_DPLL_CORE);
        while(readl(CM_IDLEST_DPLL_CORE) != 0x1);
    }

    问题解决