chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux USB設(shè)備驅(qū)動(dòng)模型查看

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-07-17 17:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. BUS/DEV/DRV 模型

圖片

"USB 接口"是邏輯上的 USB 設(shè)備 ,編寫(xiě)的 usb_driver 驅(qū)動(dòng)程序,支持的是"USB 接口":

圖片

  • USB 控制器或 Hub 識(shí)別出 USB 設(shè)備后,會(huì)創(chuàng)建、注冊(cè) usb_device
  • usb_device 被"driversusbcoregeneric.c" 驅(qū)動(dòng)認(rèn)領(lǐng)后,會(huì)選擇、設(shè)置某個(gè)配置
  • 這個(gè)配置下面的接口,都會(huì)分配、設(shè)置、注冊(cè)一個(gè) usb_interface
  • 左邊的 usb_driver 和右邊的 usb_interface 如果匹配,則調(diào)用 usb_driver.probe

2. 接口函數(shù)

在 USB 設(shè)備驅(qū)動(dòng)程序中,能使用的 USB 函數(shù)都在這個(gè)頭文件里:includelinuxusb.h。

2.1 pipe

使用這些接口函數(shù)的主要目的是傳輸數(shù)據(jù),傳輸數(shù)據(jù)的對(duì)象是 USB 設(shè)備里的某個(gè) endpoint,這被稱為 pipe:

/* Create various pipes... */
#define usb_sndctrlpipe(dev, endpoint) 
 ((PIPE_CONTROL < < 30) | __create_pipe(dev, endpoint))
#define usb_rcvctrlpipe(dev, endpoint) 
 ((PIPE_CONTROL < < 30) | __create_pipe(dev, endpoint) | USB_DIR_IN)
#define usb_sndisocpipe(dev, endpoint) 
 ((PIPE_ISOCHRONOUS < < 30) | __create_pipe(dev, endpoint))
#define usb_rcvisocpipe(dev, endpoint) 
 ((PIPE_ISOCHRONOUS < < 30) | __create_pipe(dev, endpoint) | USB_DIR_IN)
#define usb_sndbulkpipe(dev, endpoint) 
 ((PIPE_BULK < < 30) | __create_pipe(dev, endpoint))
#define usb_rcvbulkpipe(dev, endpoint) 
 ((PIPE_BULK < < 30) | __create_pipe(dev, endpoint) | USB_DIR_IN)
#define usb_sndintpipe(dev, endpoint) 
 ((PIPE_INTERRUPT < < 30) | __create_pipe(dev, endpoint))
#define usb_rcvintpipe(dev, endpoint) 
 ((PIPE_INTERRUPT < < 30) | __create_pipe(dev, endpoint) | USB_DIR_IN)

2.2 同步傳輸函數(shù)

對(duì)于控制傳輸、批量傳輸、中斷傳輸,有 3 個(gè)同步函數(shù)可以用來(lái)直接發(fā)起傳輸。這些函數(shù)內(nèi)部會(huì)創(chuàng)建、填充、提交一個(gè) URB("usb request block"),并等待它完成或超時(shí)。

函數(shù)原型如下:

int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
      __u8 requesttype, __u16 value, __u16 index, void *data,
      __u16 size, int timeout);

int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
   void *data, int len, int *actual_length, int timeout);

int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe,
        void *data, int len, int *actual_length, int timeout);

2.3 異步傳輸函數(shù)

使用 URB 進(jìn)行傳輸時(shí),它是異步方式:需要先分配、構(gòu)造、提交一個(gè) URB("usb request block"),當(dāng)傳輸完成后,它的回調(diào)函數(shù)被調(diào)用。

關(guān)鍵就在于需要填充 URB:

  • dev:跟誰(shuí)傳輸數(shù)據(jù)
  • pipe:跟哪個(gè) pipe 傳輸數(shù)據(jù)
  • buffer:里面存有要發(fā)送的數(shù)據(jù),或者用來(lái)接收要讀取的數(shù)據(jù)
  • 數(shù)據(jù)長(zhǎng)度
  • 回調(diào)函數(shù)

2.3.1 分配和釋放 URB

函數(shù)原型如下:

struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags);

void usb_free_urb(struct urb *urb);

2.3.2 分配/釋放 DMA Buffer

發(fā)起 USB 傳輸時(shí),數(shù)據(jù)保存在 buffer 里。這個(gè) buffer 可以是一般的 buffer,也可以是 DMA Buffer。

對(duì)于一般的 buffer,在提交 URB 時(shí)會(huì)臨時(shí)分配一個(gè) DMA Buffer:

  • 發(fā)送數(shù)據(jù)時(shí):函數(shù)內(nèi)部會(huì)先從一般 buffer 中把數(shù)據(jù)復(fù)制到 DMA Buffer,在提交給 USB 控制器
  • 讀取數(shù)據(jù)時(shí):USB 控制器先把數(shù)據(jù)傳到 DMA Buffer,函數(shù)內(nèi)部在把 DMA Buffer 的數(shù)據(jù)復(fù)制到一般 buffer
  • 中間增加了一次數(shù)據(jù)的拷貝,效率低

我們可以直接使用 DMA Buffer,函數(shù)原型如下:

void *usb_alloc_coherent(struct usb_device *dev, size_t size, gfp_t mem_flags,dma_addr_t *dma);

void usb_free_coherent(struct usb_device *dev, size_t size, void *addr,dma_addr_t dma);

2.3.3 填充 URB

對(duì)于控制傳輸、批量傳輸、中斷傳輸,分別有如下函數(shù):

static inline void usb_fill_control_urb(struct urb *urb,
     struct usb_device *dev,
     unsigned int pipe,
     unsigned char *setup_packet,
     void *transfer_buffer,
     int buffer_length,
     usb_complete_t complete_fn,
     void *context);

static inline void usb_fill_bulk_urb(struct urb *urb,
         struct usb_device *dev,
         unsigned int pipe,
         void *transfer_buffer,
         int buffer_length,
         usb_complete_t complete_fn,
         void *context);

static inline void usb_fill_int_urb(struct urb *urb,
        struct usb_device *dev,
        unsigned int pipe,
        void *transfer_buffer,
        int buffer_length,
        usb_complete_t complete_fn,
        void *context,
        int interval);

如果 URB 使用 DMA Buffer,那么還需要設(shè)置一個(gè) flag 表明這點(diǎn):

urb- >transfer_dma = DMA address of buffer; // usb_alloc_coherent的輸出參數(shù)
urb- >transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

2.3.4 提交 URB

構(gòu)造好 URB 后,需要提交到 USB 系統(tǒng)里,才能啟動(dòng)傳輸。

int usb_submit_urb(struct urb *urb, gfp_t mem_flags);

2.3.5 取消 URB

已經(jīng)提交的 URB,可以取消它,有 2 個(gè)函數(shù):

  • usb_kill_urb:這是一個(gè)同步函數(shù),它會(huì)等待 URB 結(jié)束
  • usb_unlink_urb:這是一個(gè)異步函數(shù),它不會(huì)等待 URB 結(jié)束,USB 控制器驅(qū)動(dòng)會(huì)調(diào)用它的回調(diào)函數(shù)
void usb_kill_urb(struct urb *urb);

int usb_unlink_urb(struct urb *urb);
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8179

    瀏覽量

    272754
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1916

    瀏覽量

    86905
  • 鼠標(biāo)
    +關(guān)注

    關(guān)注

    6

    文章

    593

    瀏覽量

    40755
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式Linux下的USB設(shè)備驅(qū)動(dòng)技術(shù)

    嵌入式Linux下的USB設(shè)備驅(qū)動(dòng)技術(shù) Linux以其穩(wěn)定、高效、易定制、硬件支持廣泛、源代碼開(kāi)放等特點(diǎn),已在嵌入式領(lǐng)域迅速崛起,被國(guó)際上
    發(fā)表于 05-08 08:30 ?1957次閱讀
    嵌入式<b class='flag-5'>Linux</b>下的<b class='flag-5'>USB</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>技術(shù)

    嵌入式Linux下的USB設(shè)備驅(qū)動(dòng)

    USB里的設(shè)備模型Linux里一個(gè)很重要的概念是設(shè)備模型。對(duì)于
    發(fā)表于 12-07 10:29

    詳解linux設(shè)備驅(qū)動(dòng)模型架構(gòu)

    LDD3中說(shuō):“Linux內(nèi)核需要一個(gè)對(duì)系統(tǒng)結(jié)構(gòu)的一般性描述?!边@個(gè)描述就是linux設(shè)備驅(qū)動(dòng)模型(下面簡(jiǎn)稱為L(zhǎng)DDM)。LDDM不是獨(dú)立
    發(fā)表于 07-25 07:25

    基于LinuxUSB設(shè)備驅(qū)動(dòng)方法有什么優(yōu)點(diǎn)?

    設(shè)備、串口設(shè)備、網(wǎng)絡(luò)設(shè)備設(shè)備驅(qū)動(dòng)程序及各種USB device控制器芯片的
    發(fā)表于 11-07 08:31

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

    介紹Linux 的體系結(jié)構(gòu)及其網(wǎng)絡(luò)子系統(tǒng),并結(jié)合USB 設(shè)備Linux 下的訪問(wèn)機(jī)制,給出了一種USB 網(wǎng)絡(luò)
    發(fā)表于 08-11 11:23 ?20次下載

    Linux環(huán)境下USB的原理、驅(qū)動(dòng)和配置

    本文對(duì) Linux 環(huán)境下USB 的原理、驅(qū)動(dòng)和配置進(jìn)行詳細(xì)介紹。隨著生活水平的提高,人們對(duì) USB 設(shè)備的使用也越來(lái)越多,鑒于
    發(fā)表于 01-16 16:57 ?33次下載

    嵌入式LinuxUSB驅(qū)動(dòng)設(shè)計(jì)

    本文主要介紹了 Linux 平臺(tái)的USB設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的一般步驟方法和技巧,通過(guò)詳細(xì)介紹USB的相關(guān)概念和
    發(fā)表于 06-08 17:15 ?49次下載
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)

    Linux設(shè)備驅(qū)動(dòng)模型摘抄

    Linux2.6 內(nèi)核提供了新的設(shè)備模型,目的是為了對(duì)計(jì)算機(jī)上的所有設(shè)備進(jìn)行統(tǒng)一地表示和操作,包括設(shè)備本身和
    發(fā)表于 03-19 15:15 ?39次下載

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第20章、USB主機(jī)與設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第20章、USB主機(jī)與設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:04 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第20章、<b class='flag-5'>USB</b>主機(jī)與<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)模型摘抄

    Linux設(shè)備驅(qū)動(dòng)模型摘抄
    發(fā)表于 10-31 09:00 ?8次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的<b class='flag-5'>模型</b>摘抄

    Linux下的硬件驅(qū)動(dòng)USB設(shè)備(上)

    和使用他們,也越來(lái)越成為困擾我們的一大問(wèn)題。本文分兩部分著力從Linux系統(tǒng)下設(shè)備驅(qū)動(dòng)的架構(gòu),去闡述怎樣去使用和配置以及怎樣編制USB設(shè)備
    發(fā)表于 04-02 14:35 ?756次閱讀

    Linux下的硬件驅(qū)動(dòng)USB設(shè)備(下)

    RESERVED FOR FUTURE USE INCLUDE FILES--> 前言在上篇《 Linux下的硬件驅(qū)動(dòng)--USB設(shè)備(上)(驅(qū)動(dòng)
    發(fā)表于 04-02 14:37 ?538次閱讀

    如何使用Linux內(nèi)核實(shí)現(xiàn)USB驅(qū)動(dòng)程序框架

    Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹(shù)形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。
    發(fā)表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b>內(nèi)核實(shí)現(xiàn)<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b>程序框架

    Linux總線、設(shè)備、驅(qū)動(dòng)模型的探究

    Linux總線、設(shè)備、驅(qū)動(dòng)模型的探究
    發(fā)表于 02-14 12:01 ?7次下載

    基于ARM的USB無(wú)線網(wǎng)卡Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于ARM的USB無(wú)線網(wǎng)卡Linux設(shè)備驅(qū)動(dòng)設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-12 11:25 ?3次下載
    基于ARM的<b class='flag-5'>USB</b>無(wú)線網(wǎng)卡<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)