新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于USB設備的Linux網(wǎng)絡驅(qū)動程序開發(fā)

基于USB設備的Linux網(wǎng)絡驅(qū)動程序開發(fā)

作者: 時間:2012-05-21 來源:網(wǎng)絡 收藏

圖3

圖4

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

由于采用了抽象的硬件資源,下的設備管理也采用了與網(wǎng)絡子系統(tǒng)類似的棧結(jié)構(gòu),如圖4所示。

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

4.2 USB網(wǎng)絡設備驅(qū)動程序設計

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

probe函數(shù)的主要代碼如下:

ether_setup(netdev); //使用內(nèi)核通用的以太網(wǎng)回調(diào)函數(shù)設定hard_header等函數(shù)

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

netdev->open = thu_plc_open; //設定open函數(shù)

netdev->stop = thu_plc_close; //設定stop函數(shù)

netdev->tx_timeout = thu_plc_tx_timeout; //設定超時函數(shù)

netdev->hard_start_xmit = thu_plc_start_xmit; //設定發(fā)送函數(shù)

netdev->get_stats = thu_plc_netdev_stats; //設定狀態(tài)統(tǒng)計函數(shù)

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

netdev->mtu = THU_PLC_MTU; //配置網(wǎng)絡接口的MTU

……

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

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

break;

}

……

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

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

break;

}

……

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

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


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉