天天看點

u-boot網卡驅動移植

u-boot網卡驅動移植

網卡移植的驅動是針對國嵌GQ2440開發闆的,u-boot版本為u-boot-2009,比這版本高一些的也沒問題。移植主要有一下幾個步驟,大多數和mini2440相同。

1.設定網卡的位寬

由于s3c2440存儲控制器的bank4連接配接的是DM9000網卡,下面是網上截取的圖,可知網卡位寬為16。

u-boot網卡驅動移植

接着在lowlevel_init.S修改如下代碼

#define B1_BWSCON               (DW16)
    #define B2_BWSCON               (DW16)
    #define B3_BWSCON               (DW16)
    #define B4_BWSCON               (DW16)//沒有使用wait信号
    #define B5_BWSCON               (DW8)
    #define B6_BWSCON               (DW32)
    #define B7_BWSCON               (DW32)
           

2.設定網卡時序

相關位的含義如下圖:

u-boot網卡驅動移植

修改的代碼如下:

#define B4_Tacs                 0x0
#define B4_Tcos                 0x0
#define B4_Tacc                 0x7
#define B4_Tcoh                 0x1//這句修改,其它的和mini2440相似
#define B4_Tah                  0x0
#define B4_Tacp                 0x0
#define B4_PMC                  0x0
           

3、在board/GQ2440/GQ2440.c 檔案中添加網卡驅動入口函數

添加如下代碼:

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
        int rc = ;
#ifdef CONFIG_CS8900
        rc = cs8900_initialize(, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
        rc = dm9000_initialize(bis);
#endif
        return rc;
}
#endif
           

4、在include/configs/GQ2440.h檔案添加網卡驅動相關定義

主要是DM9000的基位址設定

#define CONFIG_NET_MULTI                1
#define CONFIG_NET_RETRY_COUNT          20
#define CONFIG_DRIVER_DM9000            1
#define CONFIG_DM9000_BASE              0x20000000  
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT         1
#define CONFIG_DM9000_NO_SROM           1
#undef CONFIG_DM9000_DEBUG
           

5、修改網卡驅動相關代碼

在drivers/net/dm9000x.c檔案中主要進行如下的修改

防止出現“could not establish link”的錯誤,進行下面修改:

i = ;
while (!(phy_read() & )) { /* autonegation complete bit */
    udelay();
    i++;
    if (i == ) {
//        printf("could not establish link\n");
//        return ;
          break;
     }
}
           

防止出現ping不同的情況,修改如下代碼:

static void dm9000_halt(struct eth_device *netdev)
{
#if 0
        DM9000_DBG("%s\n", __func__);

        /* RESET devie */
        phy_write(, );   /* PHY RESET */
        DM9000_iow(DM9000_GPR, );   /* Power-Down PHY */
        DM9000_iow(DM9000_IMR, );   /* Disable all interrupt */
        DM9000_iow(DM9000_RCR, );   /* Disable RX */
#endif
}
           

到此為止,網卡驅動移植完成了。