<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ò ) 收藏

open回調函數的主要代碼如下:

……

usb_fill_bulk_urb(dev->rx_urb, //構造讀請求的URB

dev->udev,

usb_rcvbulkpipe(dev->udev, 6), //指定讀端點(diǎn)

dev->rx_skb->data,

512,

read_bulk_callback, //使用read_bulk_callback做為URB的

dev //回調函數。

);

if((result = usb_submit_urb(dev->rx_urb, GFP_KERNEL))){ //將URB發(fā)送給

…… // Core

}

netif_start_queue(netdev); //使能網(wǎng)絡(luò )傳輸隊列

……

當讀請求URB完成時(shí),意味著(zhù)主機收到了一個(gè)數據包或該URB超時(shí),此時(shí)read_bulk_callback將會(huì )被內核調用。無(wú)論是哪種情況,為了將來(lái)可能到來(lái)的數據包能夠及時(shí)得被主機讀取,驅動(dòng)程序都應該再發(fā)送一個(gè)讀請求URB給 Core。而在主機收到數據包的情況下,read_bulk_callback函數構造一個(gè)skb_buff數據結構來(lái)描述數據包,并調用 netif_rx函數,把該數據包交給上層協(xié)議,從而完成一次接受過(guò)程。

與接受過(guò)程相比,發(fā)送數據包的過(guò)程簡(jiǎn)單了很多。當網(wǎng)絡(luò )子系統準備發(fā)送一個(gè)數據包時(shí),上層協(xié)議將會(huì )構造一個(gè)skb_buff數據結構來(lái)描述數據包,并且調用注冊的hard_start_xmit回調函數來(lái)發(fā)送該數據包。由于該函數被調用時(shí)內核持有xmit_lock自旋鎖,因而驅動(dòng)程序可以不必考慮對設備寫(xiě)操作的同步問(wèn)題。hard_start_xmit函數根據數據包的長(cháng)度將其拆分為設備可以傳輸的長(cháng)度,然后構造相應的寫(xiě)請求 URB,發(fā)送至USB Core即可。

hard_start_xmit回調函數的主要代碼如下:

……

usb_fill_bulk_urb(dev->tx_urb, //構造寫(xiě)請求的URB

dev->udev,

usb_sndbulkpipe(dev->udev, 2), //指定寫(xiě)端點(diǎn)

skb->data,

512,//count,

write_bulk_callback, //使用write_bulk_callback做為URB的回調函數。

dev

);

if((result = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))){ //將URB發(fā)送給

…… //USB Core

}

寫(xiě)請求URB完成時(shí),write_bulk_callback回調函數被內核調用。該函數判斷寫(xiě)請求URB是否成功完成。根據URB的完成情況,驅動(dòng)程序需要更新網(wǎng)絡(luò )接口的相應統計數據,例如成功/失敗發(fā)送包的數目等。

5. 小結

本文從工程應用出發(fā),介紹了的體系結構及其網(wǎng)絡(luò )子系統,并結合USB設備在下的訪(fǎng)問(wèn)機制,研究了USB驅動(dòng)程序實(shí)現異步通知的方法,并給出了USB的設計框架和實(shí)例。在實(shí)際測試中,本文分析的驅動(dòng)程序運行穩定,并且達到了預期的網(wǎng)絡(luò )傳輸速度。

參考文獻:

[1] J. Corbet, A. Rubini, and G. Kroah-Hartman. Device Drivers, Third Edition. 2005, O'Reilly Media, Inc.

[2]毛德操 胡希明. Linux內核源代碼情景分析. 2001. 浙江大學(xué)出版社.

[3]Daniel P. Bovet, M. Cesati. Understanding the Linux Kernel, Second Edition. 2002, O'Reilly Media, Inc.

[4]李少甫 何小慶 江文瑞.The Development of Embedded Wireless LAN Application System Based on MontaVista Linux.微計算機信息. 2002年11期49-51

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

上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(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>