U-Boot 的網路卡驅動程式架構

jollen 發表於 September 18, 2006 5:35 PM

PowerPC 再衝吧!整理一下這次 porting PowerPC 網路卡 driver 的重點。今天先就架構面的重點做整理。

要了解以下內容,您至少要對以下主題有基本的認知:

(1) U-Boot 如何使用 CONFIG_* 定義 driver,要把 networking 相關的 driver 打開。
(2) U-Boot 的開機與 Board-Level 初始化流程
(3) U-Boot 的 BSP 架構實作方法 (extern)

(Jollen 的 U-Boot 學員可參考講義 Lecture 3 & Lecture 4)

Jollen 的任務是將 vendor 提供的 DST 整合至 U-Boot,以支援我們 PowerPC 板子上的 PHY (Broadcom 的 Gigalan)。

net/eth.c:eth_initialize()

這是重要的 Networking 初始化的核心層,在這裡加入

int eth_initialize(bd_t *bis)
{
    char enetvar[32], env_enetaddr[6];
    int i, eth_number = 0;
    char *tmp, *end;
    eth_devices = NULL;
    eth_current = NULL;

#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
    miiphy_init();
#endif
    ...
#ifdef CONFIG_DB64360
    mv6436x_eth_initialize(bis);
#endif
    ...
#if defined(CONFIG_PPC750GIGE)
    ppc750_eth_initialize(bis);
#endif

    ...
}

在這裡可以看到很多 driver 的定義 (CONFIG_*),我們在最後加上自己板子的 driver 定義。ppc750_eth_initialize() 是 BSP code,所以必須實作到 board 的目錄裡面。然後在 board/xxx/實作 PHY 的 driver,因為是 BSP code,依架 U-Boot 的習慣,我們必須把 PHY 的 driver 放在 board 目錄下。

實作 ppc750_eth_initialize()

接下來的重要工作,當然就是實作 ppc750_eth_initialize(),U-Boot 在開機時,會呼叫我們 PHY driver 的進入點,而這個進入點函數就叫 ppc750_eth_initialize(),U-Boot 底下的網路卡 driver 基本架構大致雷同。以下的程式碼就是我們板子的 PHY driver 進入點:

int ppc750_eth_initialize(bd_t *bis) // called from eth.c:eth_initialize()
{
    struct eth_device *dev[MAX_NUM_ETH_PORTS]; // ethernet device 的結構
    int i;

    printf("Initializing ethernet ports!\n");

    for (i = 0; i < MAX_NUM_ETH_PORTS; i++)
    {
        if (dev[i] == NULL) {
        dev[i] = (struct eth_device *)malloc(sizeof(struct eth_device));
    }

         /* 這裡是最重要的啦,要填寫 init, halt, send, recv 四個動作 (operation) 的實作函數,大家可以看一下 struct eth_device 的原型
        */
        dev[i]->init = ppc750_ether_init; // 下達網路命令時,會先呼叫 init。
        dev[i]->halt = ppc750_stop_ethernet; // 把網路關閉時回呼的。
        dev[i]->send = ppc750_send_packet; //網路命令要送出封包時回呼的。
        dev[i]->recv = ppc750_poll; // 要接收封包時回呼的。

        eth_register(dev[i]); // 註冊 ethernet device 到 U-Boot 核心層
    }

    return i;
}

到這裡是 U-Boot 提供給網路卡 driver 的架構,接著當然就是要實作 init, halt, send, recv 這四個 operation 了!底層 Driver 的 operation 是跟硬體相關的,也就是看 datasheet 寫 driver 的工作!

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw