Hi,又来麻烦了,原谅我没有用英文。
我的网卡现在能接收数据,不能发送数据。测试方法,板子上ping pc,pc上抓包无数据。pc ping板子,板子上tcpdump抓包可以看到收到数据了。
板子ping 自己,收发都OK,但是ping 局域网其他,发送失败 ,路由有设置。
板子参考sabresd设计的。网卡我们使用的Ar8035,sabresd使用的Ar8031,接口上与sabresd完全一致(除了电源上)。
所以dts的配置也跟sabresd一致。
原来我们这块板子在Android4.2系统时,使用你们BSP,网卡这块都没有动的。4.2的bsp中.gpio_irq = MX6_ENET_IRQ,我们是屏蔽掉的。现在4.4.3的BSP我们也没用这个中断。
有什么建议不???
补充一下:
我看原4.2的BSP中有对Ar8031相关寄存器设置的,但是4.4.3中没有了,不需要?
下面是4.2的。
static int mx6q_sabresd_fec_phy_init(struct phy_device *phydev)
{
unsigned short val;
/* Ar8031 phy SmartEEE feature cause link status generates glitch,
* which cause ethernet link down/up issue, so disable SmartEEE
*/
phy_write(phydev, 0xd, 0x3);
phy_write(phydev, 0xe, 0x805d);
phy_write(phydev, 0xd, 0x4003);
val = phy_read(phydev, 0xe);
val &= ~(0x1 << 8);
phy_write(phydev, 0xe, val);
解決済! 解決策の投稿を見る。
问题解决了。
总结下:有两个问题:
①新版kernel中BSP中管脚配置,资源分配相关是放在kernel_imx/arch/arm/boot/dts/imx6*相关的dtsi及dts中
而寄存器初始化,gpio导出之类的,依然是放在.c文件中编译进内核的。如下文件:
kernel_imx/arch/arm/mach-imx/mach-imx6q.c
所以Ar8035相关的寄存器初始化在该文件中,我们需要添加:
#define PHY_ID_AR8031 0x004dd074
#define PHY_ID_AR8035 0x004dd072
static void __init imx6q_enet_phy_init(void)
{
if (IS_BUILTIN(CONFIG_PHYLIB)) {
phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,
ksz9021rn_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,
ksz9031rn_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,
ar8031_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_AR8035, 0xffffffff,
ar8031_phy_fixup);
}
}
让probe之前初始化相应的网卡寄存器。
②之所以出现RGMII_TXC是5M,CLK_25M(Ar8035上)输出时钟是25M而不是配置的125M是由于,我在DeviceTree中启用的phy-reset-gpios ,对应Ar8035的RSTn脚,datasheet说明System reset, active low. Requires an external pull-up resistor。一定不能写phy-reset-gpios这一句,但是具体为什么不能写这句,我还不明白,因为该管脚在probe后是高电平。即使我在DTS中把phy-reset-gpios = <&gpio1 25 1>。网卡也是不能正常工作的。
有对DeviceTree熟悉的同学看到同样的问题还请不吝赐教。
&fec {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet_4>;
phy-reset-gpios = <&gpio1 25 0>; /*要屏蔽这一句*/
phy-mode = "rgmii";
status = "okay";
};
问题解决了。
总结下:有两个问题:
①新版kernel中BSP中管脚配置,资源分配相关是放在kernel_imx/arch/arm/boot/dts/imx6*相关的dtsi及dts中
而寄存器初始化,gpio导出之类的,依然是放在.c文件中编译进内核的。如下文件:
kernel_imx/arch/arm/mach-imx/mach-imx6q.c
所以Ar8035相关的寄存器初始化在该文件中,我们需要添加:
#define PHY_ID_AR8031 0x004dd074
#define PHY_ID_AR8035 0x004dd072
static void __init imx6q_enet_phy_init(void)
{
if (IS_BUILTIN(CONFIG_PHYLIB)) {
phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,
ksz9021rn_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,
ksz9031rn_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,
ar8031_phy_fixup);
phy_register_fixup_for_uid(PHY_ID_AR8035, 0xffffffff,
ar8031_phy_fixup);
}
}
让probe之前初始化相应的网卡寄存器。
②之所以出现RGMII_TXC是5M,CLK_25M(Ar8035上)输出时钟是25M而不是配置的125M是由于,我在DeviceTree中启用的phy-reset-gpios ,对应Ar8035的RSTn脚,datasheet说明System reset, active low. Requires an external pull-up resistor。一定不能写phy-reset-gpios这一句,但是具体为什么不能写这句,我还不明白,因为该管脚在probe后是高电平。即使我在DTS中把phy-reset-gpios = <&gpio1 25 1>。网卡也是不能正常工作的。
有对DeviceTree熟悉的同学看到同样的问题还请不吝赐教。
&fec {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet_4>;
phy-reset-gpios = <&gpio1 25 0>; /*要屏蔽这一句*/
phy-mode = "rgmii";
status = "okay";
};
内核的驱动就是这样可以正常工作的,我的问题是uboot中无法使这个AR8035网卡工作,你的可以吗
Somebody has suggestion?
目前已查出, RGMII_TXC发送的时钟不对,5MHz。数据RGMII_TXD0是有发送出去的。我用以前OK的Android4.2的BSP测试,这个管脚是25MHz。
看样子就是时钟不对了,dts中配置确实跟官方sabresd一致。
MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
此时钟还需要什么配置?
你好,我需要在android4.4.2上移植ar8035这个网卡,也就是kernel版本是3.0.35,uboot版本是2009.08,这个官方原版都是不支持ar8035的,需要移植uboot和kernel,工具量好大。
android4.4.3是支持的,既然你在android4.2上移植过,能否提供下kernel.uboot做参考,期待你的回复。
3.0.35官方sabresd板子用的就是Ar8031,可以兼容Ar8035,不需要移植。Android4.2的bsp就是kernel版本是3.0.35,uboot版本是2009.08
uboot的网络好像是要移植的,我没搞uboot的网络。