新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于USB設備的Linux網絡驅動程序開發

        基于USB設備的Linux網絡驅動程序開發

        作者: 時間:2012-05-21 來源:網絡 收藏

        圖3

        圖4

        這些資源中,端點對于設備有著最重要的意義,實際的數據傳輸就是通過對端點的讀寫來實現的。驅動程序通過描述符來獲取這些資源。在初始化時,驅動程序從設備端點0讀取描述符,經過解析后保存這些資源的屬性,為傳輸數據做準備。

        由于采用了抽象的硬件資源,下的設備管理也采用了與網絡子系統類似的棧結構,如圖4所示。

        USB Core對USB驅動程序屏蔽了不同USB主機控制器之間的差異,使它們對于USB驅動程序來說具有統一的接口。USB驅動程序通過發送URB(USB Request Block)與USB Core交換數據,USB Core解釋URB,并將URB中包含的數據請求通過USB主機控制器發送給對應的USB設備。另一方面,USB Core負責檢測USB設備的插入和拔出等事件,當這些事件發生時,USB Core通知內核,使內核能夠調用驅動程序的相應回調函數來通知驅動程序對這些事件做出響應。

        4.2 USB網絡設備驅動程序設計

        除了必要的回調函數以外,下的每一種驅動程序都必須有初始化函數和卸載函數。初始化函數需要根據相應的硬件設備,向內核注冊不同的數據結構,來聲明自己對該設備的支持。對于USB設備來說,初始化函數中需要注冊struct usb_driver,該數據結構中的關鍵域分別為:owner,用于內核維護模塊使用計數;name,驅動程序名稱;probe,設備初始化函數指針;disconnect,設備刪除函數指針;id_table,驅動程序支持設備列表。設備列表指明該驅動程序所支持的設備標識,對于USB設備來說,一般是Vendor ID和Product ID。每當一個USB設備插入系統,內核將查找現有的所有USB設備列表,判斷應該調用哪個驅動程序所注冊的probe函數來完成設備初始化。當USB設備拔出時,相應的disconnect函數也會被調用,來處理驅動程序的卸載。因此,USB應在probe函數中初始化設備和注冊網絡接口。在disconnect函數中注銷網絡接口。

        probe函數的主要代碼如下:

        ether_setup(netdev); //使用內核通用的以太網回調函數設定hard_header等函數

        SET_MODULE_OWNER(netdev); //設定模塊擁有者,用于維護使用計數

        netdev->open = thu_plc_open; //設定open函數

        netdev->stop = thu_plc_close; //設定stop函數

        netdev->tx_timeout = thu_plc_tx_timeout; //設定超時函數

        netdev->hard_start_xmit = thu_plc_start_xmit; //設定發送函數

        netdev->get_stats = thu_plc_netdev_stats; //設定狀態統計函數

        netdev->watchdog_timeo = THU_PLC_TX_TIMEOUT; //設定超時值

        netdev->mtu = THU_PLC_MTU; //配置網絡接口的MTU

        ……

        if(!thu_plc_config_dev(dev, intf, id)) { //配置USB網絡設備

        printk("couldn't configure the devicen");

        break;

        }

        ……

        if(register_netdev(netdev) != 0) { //注冊ethernet接口

        printk("couldn't register the devicen");

        break;

        }

        ……

        其中thu_plc_config_dev函數用來檢測和配置USB設備。當probe函數成功返回時,驅動程序已經完成了USB設備的檢測和網絡接口的注冊。而網絡接口的正式啟用還需要用戶或應用程序使能該接口。例如用戶可以使用ifconfig命令來啟用網絡接口。當接口被正式啟用時,驅動程序的open回調函數被調用,由于USB設備沒有類似于硬件中斷的異步通知方式,需要主機主動查詢是否有數據需要讀取,而網絡設備則需要有能力來異步通知操作系統數據包的到達,因此,在open函數中需要向USB Core發送一個讀請求的URB,使得當USB設備需要將數據包輸入主機時,能夠及時響應。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 天峻县| 嘉祥县| 常宁市| 同仁县| 昔阳县| 吴堡县| 晴隆县| 台东县| 桐城市| 晋宁县| 大厂| 神池县| 冷水江市| 盐津县| 西乌| 沭阳县| 海林市| 清丰县| 炎陵县| 全椒县| 梅河口市| 天全县| 沈丘县| 尚义县| 亚东县| 平泉县| 弥渡县| 许昌县| 武宁县| 于田县| 高要市| 怀柔区| 陆河县| 伊吾县| 邵东县| 罗江县| 宣武区| 灌南县| 漳州市| 随州市| 独山县|