U-Boot 的網路卡驅動程式架構
http://www.jollen.org/blog/2006/09/uboot_driver.html
jollen 發表於 September 18, 2006 5:35 PMPowerPC 再衝吧!整理一下這次 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