<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于USB設備的Linux網(wǎng)絡(luò )驅動(dòng)程序開(kāi)發(fā)

基于USB設備的Linux網(wǎng)絡(luò )驅動(dòng)程序開(kāi)發(fā)

作者: 時(shí)間:2012-05-21 來(lái)源:網(wǎng)絡(luò ) 收藏

圖3

圖4

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

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

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

4.2 USB網(wǎng)絡(luò )設備驅動(dòng)程序設計

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

probe函數的主要代碼如下:

ether_setup(netdev); //使用內核通用的以太網(wǎng)回調函數設定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; //設定超時(shí)函數

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

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

netdev->watchdog_timeo = THU_PLC_TX_TIMEOUT; //設定超時(shí)值

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

……

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

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

break;

}

……

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

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

break;

}

……

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

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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>