【imx6】Android4.4.3 fec网卡能接收数据,但发生数据失败

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

【imx6】Android4.4.3 fec网卡能接收数据,但发生数据失败

Jump to solution
2,448 Views
qg
Contributor II

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);

Labels (4)
1 Solution
1,618 Views
qg
Contributor II

问题解决了。

总结下:有两个问题:

①新版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";

};

View solution in original post

0 Kudos
6 Replies
1,619 Views
qg
Contributor II

问题解决了。

总结下:有两个问题:

①新版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";

};

0 Kudos
1,618 Views
kingliu
Contributor II

内核的驱动就是这样可以正常工作的,我的问题是uboot中无法使这个AR8035网卡工作,你的可以吗

0 Kudos
1,618 Views
qg
Contributor II

Somebody has suggestion?

0 Kudos
1,618 Views
qg
Contributor II

目前已查出, RGMII_TXC发送的时钟不对,5MHz。数据RGMII_TXD0是有发送出去的。我用以前OK的Android4.2的BSP测试,这个管脚是25MHz。

看样子就是时钟不对了,dts中配置确实跟官方sabresd一致。

MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0

此时钟还需要什么配置?

0 Kudos
1,618 Views
huangkc
Contributor I

你好,我需要在android4.4.2上移植ar8035这个网卡,也就是kernel版本是3.0.35,uboot版本是2009.08,这个官方原版都是不支持ar8035的,需要移植uboot和kernel,工具量好大。

android4.4.3是支持的,既然你在android4.2上移植过,能否提供下kernel.uboot做参考,期待你的回复。

0 Kudos
1,618 Views
qg
Contributor II

3.0.35官方sabresd板子用的就是Ar8031,可以兼容Ar8035,不需要移植。Android4.2的bsp就是kernel版本是3.0.35,uboot版本是2009.08

uboot的网络好像是要移植的,我没搞uboot的网络。

0 Kudos