板子上有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.根据链接http://processors.wiki.ti.com/index.php/Linux_Core_CPSW_User%27s_Guide#Dual_Standalone_EMAC_mode 配置了内核相关选项
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.http://e2e.ti.com/support/arm/sitara_arm/f/791/t/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
问题:第二路千兆网口不通,暂时不能定位原因,请问现在还可以确认哪些方面
zhipeng xie:
在不同版本的内核上进行示波器的测量,发现ping的时候TXD管脚都有信号产生,但是有一个TX_CLK管脚的时钟周期不一致,在可以ping通的3.20版本上时钟周期为40ns,在不能ping通的3.14版本上时钟周期为100ns,在DTS中已经定义了此管脚
0x5x (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a6.rgmii2_tclk */
请问在哪里可以修改该时钟的频率?
zhipeng xie:
回复 zhipeng xie:
我在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?
zhipeng xie:
回复 zhipeng xie:
现在发现的有以下问题:
1.cpsw.c中传进来的fck频率不对,应该为125,变成了50,但这个频率是dtsi头文件中定义的,没有做修改
2.用示波器进行测试,发现连接千兆网卡的rgmii2_rclk时钟周期跟可以ping通的板子一致(20ns),但rgmii2_tclk的时钟周期是可以ping通的板子的2.5倍(50ns)
烦请帮忙分析下