<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          open回調(diào)函數(shù)的主要代碼如下:

          ……

          usb_fill_bulk_urb(dev->rx_urb, //構(gòu)造讀請(qǐng)求的URB

          dev->udev,

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

          dev->rx_skb->data,

          512,

          read_bulk_callback, //使用read_bulk_callback做為URB的

          dev //回調(diào)函數(shù)。

          );

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

          …… // Core

          }

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

          ……

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

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

          hard_start_xmit回調(diào)函數(shù)的主要代碼如下:

          ……

          usb_fill_bulk_urb(dev->tx_urb, //構(gòu)造寫(xiě)請(qǐng)求的URB

          dev->udev,

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

          skb->data,

          512,//count,

          write_bulk_callback, //使用write_bulk_callback做為URB的回調(diào)函數(shù)。

          dev

          );

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

          …… //USB Core

          }

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

          5. 小結(jié)

          本文從工程應(yīng)用出發(fā),介紹了的體系結(jié)構(gòu)及其網(wǎng)絡(luò)子系統(tǒng),并結(jié)合USB設(shè)備在下的訪問(wèn)機(jī)制,研究了USB驅(qū)動(dòng)程序?qū)崿F(xiàn)異步通知的方法,并給出了USB的設(shè)計(jì)框架和實(shí)例。在實(shí)際測(cè)試中,本文分析的驅(qū)動(dòng)程序運(yùn)行穩(wěn)定,并且達(dá)到了預(yù)期的網(wǎng)絡(luò)傳輸速度。

          參考文獻(xiàn):

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

          [2]毛德操 胡希明. Linux內(nèi)核源代碼情景分析. 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.微計(jì)算機(jī)信息. 2002年11期49-51

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

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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();