在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux USB設備驅動模型查看

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:嵌入式Linux系統開 ? 2023-07-17 17:38 ? 次閱讀

1. BUS/DEV/DRV 模型

圖片

"USB 接口"是邏輯上的 USB 設備 ,編寫的 usb_driver 驅動程序,支持的是"USB 接口":

圖片

  • USB 控制器或 Hub 識別出 USB 設備后,會創建、注冊 usb_device
  • usb_device 被"driversusbcoregeneric.c" 驅動認領后,會選擇、設置某個配置
  • 這個配置下面的接口,都會分配、設置、注冊一個 usb_interface
  • 左邊的 usb_driver 和右邊的 usb_interface 如果匹配,則調用 usb_driver.probe

2. 接口函數

在 USB 設備驅動程序中,能使用的 USB 函數都在這個頭文件里:includelinuxusb.h

2.1 pipe

使用這些接口函數的主要目的是傳輸數據,傳輸數據的對象是 USB 設備里的某個 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 同步傳輸函數

對于控制傳輸、批量傳輸、中斷傳輸,有 3 個同步函數可以用來直接發起傳輸。這些函數內部會創建、填充、提交一個 URB("usb request block"),并等待它完成或超時。

函數原型如下:

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 異步傳輸函數

使用 URB 進行傳輸時,它是異步方式:需要先分配、構造、提交一個 URB("usb request block"),當傳輸完成后,它的回調函數被調用。

關鍵就在于需要填充 URB:

  • dev:跟誰傳輸數據
  • pipe:跟哪個 pipe 傳輸數據
  • buffer:里面存有要發送的數據,或者用來接收要讀取的數據
  • 數據長度
  • 回調函數

2.3.1 分配和釋放 URB

函數原型如下:

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

void usb_free_urb(struct urb *urb);

2.3.2 分配/釋放 DMA Buffer

發起 USB 傳輸時,數據保存在 buffer 里。這個 buffer 可以是一般的 buffer,也可以是 DMA Buffer。

對于一般的 buffer,在提交 URB 時會臨時分配一個 DMA Buffer:

  • 發送數據時:函數內部會先從一般 buffer 中把數據復制到 DMA Buffer,在提交給 USB 控制器
  • 讀取數據時:USB 控制器先把數據傳到 DMA Buffer,函數內部在把 DMA Buffer 的數據復制到一般 buffer
  • 中間增加了一次數據的拷貝,效率低

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

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

對于控制傳輸、批量傳輸、中斷傳輸,分別有如下函數:

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,那么還需要設置一個 flag 表明這點:

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

2.3.4 提交 URB

構造好 URB 后,需要提交到 USB 系統里,才能啟動傳輸。

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

2.3.5 取消 URB

已經提交的 URB,可以取消它,有 2 個函數:

  • usb_kill_urb:這是一個同步函數,它會等待 URB 結束
  • usb_unlink_urb:這是一個異步函數,它不會等待 URB 結束,USB 控制器驅動會調用它的回調函數
void usb_kill_urb(struct urb *urb);

int usb_unlink_urb(struct urb *urb);
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    60

    文章

    8147

    瀏覽量

    270985
  • 驅動
    +關注

    關注

    12

    文章

    1901

    瀏覽量

    86547
  • 鼠標
    +關注

    關注

    6

    文章

    592

    瀏覽量

    40505
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式Linux下的USB設備驅動技術

    嵌入式Linux下的USB設備驅動技術 Linux以其穩定、高效、易定制、硬件支持廣泛、源代碼開放等特點,已在嵌入式領域迅速崛起,被國際上
    發表于 05-08 08:30 ?1934次閱讀
    嵌入式<b class='flag-5'>Linux</b>下的<b class='flag-5'>USB</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>技術

    嵌入式Linux下的USB設備驅動

    USB里的設備模型Linux里一個很重要的概念是設備模型。對于
    發表于 12-07 10:29

    詳解linux設備驅動模型架構

    LDD3中說:“Linux內核需要一個對系統結構的一般性描述。”這個描述就是linux設備驅動模型(下面簡稱為LDDM)。LDDM不是獨立
    發表于 07-25 07:25

    基于LinuxUSB設備驅動方法有什么優點?

    設備、串口設備、網絡設備設備驅動程序及各種USB device控制器芯片的
    發表于 11-07 08:31

    基于USB設備Linux網絡驅動程序開發

    介紹Linux 的體系結構及其網絡子系統,并結合USB 設備Linux 下的訪問機制,給出了一種USB 網絡
    發表于 08-11 11:23 ?20次下載

    Linux環境下USB的原理、驅動和配置

    本文對 Linux 環境下USB 的原理、驅動和配置進行詳細介紹。隨著生活水平的提高,人們對 USB 設備的使用也越來越多,鑒于
    發表于 01-16 16:57 ?33次下載

    嵌入式LinuxUSB驅動設計

    本文主要介紹了 Linux 平臺的USB設備驅動開發的一般步驟方法和技巧,通過詳細介紹USB的相關概念和
    發表于 06-08 17:15 ?49次下載
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b>設計

    Linux設備驅動模型摘抄

    Linux2.6 內核提供了新的設備模型,目的是為了對計算機上的所有設備進行統一地表示和操作,包括設備本身和
    發表于 03-19 15:15 ?39次下載

    Linux設備驅動開發詳解》第20章、USB主機與設備驅動

    Linux設備驅動開發詳解》第20章、USB主機與設備驅動
    發表于 10-27 11:04 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發詳解》第20章、<b class='flag-5'>USB</b>主機與<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>

    Linux設備驅動模型摘抄

    Linux設備驅動模型摘抄
    發表于 10-31 09:00 ?8次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>的<b class='flag-5'>模型</b>摘抄

    Linux下的硬件驅動USB設備(上)

    和使用他們,也越來越成為困擾我們的一大問題。本文分兩部分著力從Linux系統下設備驅動的架構,去闡述怎樣去使用和配置以及怎樣編制USB設備
    發表于 04-02 14:35 ?729次閱讀

    Linux下的硬件驅動USB設備(下)

    RESERVED FOR FUTURE USE INCLUDE FILES--> 前言在上篇《 Linux下的硬件驅動--USB設備(上)(驅動
    發表于 04-02 14:37 ?519次閱讀

    如何使用Linux內核實現USB驅動程序框架

    Linux內核提供了完整的USB驅動程序框架。USB總線采用樹形結構,在一條總線上只能有唯一的主機設備
    發表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b>內核實現<b class='flag-5'>USB</b><b class='flag-5'>驅動</b>程序框架

    Linux總線、設備驅動模型的探究

    Linux總線、設備驅動模型的探究
    發表于 02-14 12:01 ?7次下載

    基于ARM的USB無線網卡Linux設備驅動設計

    電子發燒友網站提供《基于ARM的USB無線網卡Linux設備驅動設計.pdf》資料免費下載
    發表于 10-12 11:25 ?3次下載
    基于ARM的<b class='flag-5'>USB</b>無線網卡<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b>設計
    主站蜘蛛池模板: 男女在线免费视频 | 激情五月婷婷丁香 | 两性色午夜视频免费国产 | 亚洲日本在线观看 | 欧美黄色免费网站 | 操美女视频网站 | 五月婷婷在线视频 | 韩国床戏合集三小时hd中字 | 亚洲黄色小说网站 | 午夜男人的天堂 | 日本三级黄色录像 | 亚洲国产毛片aaaaa无费看 | 国模小丫大尺度啪啪人体 | 狠狠操精品视频 | 国产精品看片 | 久操资源在线 | 网站在线观看你懂的 | 激情综合五月天丁香婷婷 | 中文字幕卡二和卡三的视频 | 激情久久久久久久久久 | 在线看av的网址 | 日本视频一区二区三区 | 在线免费观看h视频 | 孩交精品xxxx视频视频 | 午夜精品久久久久久久 | 国产精品夜夜春夜夜爽久久 | 免费观看四虎精品国产永久 | 黑人黄色片 | 色色色色色色色色色色色色 | 婷婷香蕉 | 国内精品99| 国产高清美女一级a毛片 | 黄色一级毛片在线观看 | 欧美日韩国产一区二区三区不卡 | 人人干干人人 | 玖玖玖精品视频免费播放 | 四虎精品成人免费观看 | 9久久99久久久精品齐齐综合色圆 | 午夜在线观看免费视频 | 女人大毛片一级毛片一 | 国产性做久久久久久 |