TI中文支持网
TI专业的中文技术问题搜集分享网站

AM335x uboot阶段调试AR8035网卡

大家好,

              目前使用米尔科技的BSP,uboot为2016.03,kernel为L4.1.18,基于AM335x做的开发板,网卡芯片为AR8035。

             1. 在uboot阶段调试AR8035,代码如下:

static void cpsw_control(int enabled)
{
    /* VTP can be added here */
    return;
}

static struct cpsw_slave_data cpsw_slaves[] = {
    {
        .slave_reg_ofs    = 0x208,
        .sliver_reg_ofs    = 0xd80,
        .phy_addr    = 6,
    },
};

static struct cpsw_platform_data cpsw_data = {
    .mdio_base        = CPSW_MDIO_BASE,
    .cpsw_base        = CPSW_BASE,
    .mdio_div        = 0xff,
    .channels        = 8,
    .cpdma_reg_ofs        = 0x800,
    .slaves            = 1,
    .slave_data        = cpsw_slaves,
    .ale_reg_ofs        = 0xd00,
    .ale_entries        = 1024,
    .host_port_reg_ofs    = 0x108,
    .hw_stats_reg_ofs    = 0x900,
    .bd_ram_ofs        = 0x2000,
    .mac_control        = (1 << 5),
    .control        = cpsw_control,
    .host_port_num        = 0,
    .version        = CPSW_CTRL_VERSION_2,
};

static void get_efuse_mac0_addr(uchar *enetaddr)
{
    uint32_t mac_hi, mac_lo;
    struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;

    mac_lo = readl(&cdev->macid0l);
    mac_hi = readl(&cdev->macid0h);
    enetaddr[0] = mac_hi & 0xFF;
    enetaddr[1] = (mac_hi & 0xFF00) >> 8;
    enetaddr[2] = (mac_hi & 0xFF0000) >> 16;
    enetaddr[3] = (mac_hi & 0xFF000000) >> 24;
    enetaddr[4] = mac_lo & 0xFF;
    enetaddr[5] = (mac_lo & 0xFF00) >> 8;
}

/*
 * Routine: handle_mac0_address
 * Description: prepare MAC address for on-board Ethernet.
 */
static int handle_mac0_address(void)
{
    uchar enetaddr[6];
    int rv;

    rv = eth_getenv_enetaddr("ethaddr", enetaddr);
    if (rv)
        return 0;
    get_efuse_mac0_addr(enetaddr);

    if (!is_valid_ethaddr(enetaddr))
        return -1;

    return eth_setenv_enetaddr("ethaddr", enetaddr);
}

#define AR8051_PHY_DEBUG_ADDR_REG    0x1d
#define AR8051_PHY_DEBUG_DATA_REG    0x1e
#define AR8051_DEBUG_RGMII_CLK_DLY_REG    0x5
#define AR8051_RGMII_TX_CLK_DLY        0x100

/* PHY reset GPIO */
/* GPIO pin + bank to pin ID mapping */
#define GPIO_PIN(_bank, _pin)        ((_bank << 5) + _pin)
#define GPIO_PHY_RST        GPIO_PIN(3, 8)

static void board_phy_init(void)
{
    gpio_request(GPIO_PHY_RST, "phy_rst");
    gpio_direction_output(GPIO_PHY_RST, 0);
    mdelay(2);
    gpio_set_value(GPIO_PHY_RST, 1);
    mdelay(2);
}

int board_eth_init(bd_t *bis)
{
    int rv, n = 0;
    const char *devname;
    struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;

    rv = handle_mac0_address();
    if (rv)
        printf("No MAC address for mac0 found!\n");

    writel(RGMII_MODE_ENABLE | RGMII_INT_DELAY, &cdev->miisel);
    cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_RGMII;

    //board_phy_init();

    rv = cpsw_register(&cpsw_data);
    if (rv < 0)
        printf("Error %d registering CPSW switch\n", rv);
    else
        n += rv;

    /*
     * CPSW RGMII Internal Delay Mode is not supported in all PVT
     * operating points.  So we must set the TX clock delay feature
     * in the AR8051 PHY.  Since we only support a single ethernet
     * device, we only do this for the first instance.
     */
    devname = miiphy_get_current_dev();

    miiphy_write(devname, 0x6, AR8051_PHY_DEBUG_ADDR_REG,
             AR8051_DEBUG_RGMII_CLK_DLY_REG);
    miiphy_write(devname, 0x6, AR8051_PHY_DEBUG_DATA_REG,
             AR8051_RGMII_TX_CLK_DLY);
    return n;
}

2.目前测量3.3v电压与1.1v电压均在正常范围内,采用外部晶体25MHz,测量Tclk/Rclk均为25MHz

3.电路设置PHY地址为6,设置模式为RGMII,PLLON,INT

4.通过读取mii info命令打印:

PHY 0x06: OUI = 0x1374, Model = 0x07, Rev = 0x02, 1000baseX, HDX

5.插上网线通过mii dump 0x6 0-5命令打印:

0.     (1000)                 — PHY control register —
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:0000) 0. 6,13 =   b00    speed selection = 10 Mbps
  (1000:1000) 0.12    =     1    A/N enable
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0000) 0. 8    =     0    duplex = half
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)

1.     (796d)                 — PHY status register —
  (8000:0000) 1.15    =     0    100BASE-T4 able
  (4000:4000) 1.14    =     1    100BASE-X  full duplex able
  (2000:2000) 1.13    =     1    100BASE-X  half duplex able
  (1000:1000) 1.12    =     1    10 Mbps    full duplex able
  (0800:0800) 1.11    =     1    10 Mbps    half duplex able
  (0400:0000) 1.10    =     0    100BASE-T2 full duplex able
  (0200:0000) 1. 9    =     0    100BASE-T2 half duplex able
  (0100:0100) 1. 8    =     1    extended status
  (0080:0000) 1. 7    =     0    (reserved)
  (0040:0040) 1. 6    =     1    MF preamble suppression
  (0020:0020) 1. 5    =     1    A/N complete
  (0010:0000) 1. 4    =     0    remote fault
  (0008:0008) 1. 3    =     1    A/N able
  (0004:0004) 1. 2    =     1    link status
  (0002:0000) 1. 1    =     0    jabber detect
  (0001:0001) 1. 0    =     1    extended capabilities

2.     (004d)                 — PHY ID 1 register —
  (ffff:004d) 2.15- 0 =    77    OUI portion

3.     (d072)                 — PHY ID 2 register —
  (fc00:d000) 3.15-10 =    52    OUI portion
  (03f0:0070) 3. 9- 4 =     7    manufacturer part number
  (000f:0002) 3. 3- 0 =     2    manufacturer rev. number

4.     (11e1)                 — Autonegotiation advertisement register —
  (8000:0000) 4.15    =     0    next page able
  (4000:0000) 4.14    =     0    (reserved)
  (2000:0000) 4.13    =     0    remote fault
  (1000:1000) 4.12    =     1    (reserved)
  (0800:0000) 4.11    =     0    asymmetric pause
  (0400:0000) 4.10    =     0    pause enable
  (0200:0000) 4. 9    =     0    100BASE-T4 able
  (0100:0100) 4. 8    =     1    100BASE-TX full duplex able
  (0080:0080) 4. 7    =     1    100BASE-TX able
  (0040:0040) 4. 6    =     1    10BASE-T   full duplex able
  (0020:0020) 4. 5    =     1    10BASE-T   able
  (001f:0001) 4. 4- 0 =     1    selector = IEEE 802.3

5.     (45e1)                 — Autonegotiation partner abilities register —
  (8000:0000) 5.15    =     0    next page able
  (4000:4000) 5.14    =     1    acknowledge
  (2000:0000) 5.13    =     0    remote fault
  (1000:0000) 5.12    =     0    (reserved)
  (0800:0000) 5.11    =     0    asymmetric pause able
  (0400:0400) 5.10    =     1    pause able
  (0200:0000) 5. 9    =     0    100BASE-T4 able
  (0100:0100) 5. 8    =     1    100BASE-X full duplex able
  (0080:0080) 5. 7    =     1    100BASE-TX able
  (0040:0040) 5. 6    =     1    10BASE-T full duplex able
  (0020:0020) 5. 5    =     1    10BASE-T able
  (001f:0001) 5. 4- 0 =     1    selector = IEEE 802.3

6.目前从AR8035 dump出来的寄存器值与米尔科技开发板AR8035 dump出来的值一模一样

目前的问题是:

1.设置ip后,开发板可以ping通电脑,但是偶尔会出现无法ping通电脑。设置tftp功能后,下载小文件,偶尔可以下载成功,偶尔下载不成功。只有在开发板上执行tftp功能时,电脑才可以ping通开发板,不知道这是怎么回事?

2.在开发板上ping通电脑后,执行mii info命令或者mii dump 0x6 0-5都会失败,而米尔开发板则不会出现这个问题,也不知道是怎么回事?

3.目前AR8035并没有和AM335x放在同一块开发板上,pcb layout也没有怎么做等长设计,从AR8035到AM335x两块板之间的连接线很长,大概有20inch,不知道这个是否会有影响?

请TI各位大神,鼎力相助,谢谢

Shine:

不稳定的话,感觉还是硬件上的问题大些,先看一下AR8035芯片厂商提供的手册看一下布线的要求。

user5849257:

回复 Shine:

你们demo开发板也是AR8035,请问你们是否有做等长处理呢?谢谢

yongqing wang:

回复 user5849257:

布线要求请直接参考AR8035的数据手册

user5849257:

回复 yongqing wang:

你好,查看AR8035芯片手册没有布线做要求,请问是否还有其他可能性,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » AM335x uboot阶段调试AR8035网卡
分享到: 更多 (0)