zoukankan      html  css  js  c++  java
  • UBoot 的網路卡驅動程式架構

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

    http://www.jollen.org/blog/2006/09/uboot_driver.html

    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

  • 相关阅读:
    面向对象设计原则之二:开放封闭原则
    面向对象设计原则之一:单一职责原则
    设计模式之四:适配器模式(Adapter Pattern)
    面向对象设计原则之六:合成/聚合复用原则
    设计模式之三:迭代器模式(IteratorPattern)
    面向对象设计原则之五:迪米特法则
    设计模式之二:观察者模式(Observer Pattern)
    五分钟搭建 Flash 视频直播站
    Flash Media Server 3 开发版供下载
    不掉线的路由器路由特殊技术分析
  • 原文地址:https://www.cnblogs.com/cute/p/2009824.html
Copyright © 2011-2022 走看看