嵌入式Linux USB驅動開發之教你一步步編寫USB驅動程序

2021-02-13 嵌入式ARM

2、初始化 urb

[cpp] view plain copy

1. static inline void usb_fill_int_urb(struct urb *urb,                                                                                                         

2.                  struct usb_device *dev,  

3.                  unsigned int pipe,  

4.                  void *transfer_buffer,  

5.                  int buffer_length,  

6.                  usb_complete_t complete_fn,  

7.                  void *context,  

8.                  int interval);  

9.   

10. static inline void usb_fill_bulk_urb(struct urb *urb,  

11.                  struct usb_device *dev,  

12.                  unsigned int pipe,  

13.                  void *transfer_buffer,  

14.                  int buffer_length,  

15.                  usb_complete_t complete_fn,  

16.                  void *context);  

17.   

18. static inline void usb_fill_control_urb(struct urb *urb,  

19.                     struct usb_device *dev,  

20.                     unsigned int pipe,  

21.                     unsigned char *setup_packet,  

22.                     void *transfer_buffer,  

23.                     int buffer_length,  

24.                     usb_complete_t complete_fn,  

25.                     void *context);  

26.   

27.   

28. //struct urb *urb :指向要被初始化的 urb 的指針  

29. //struct usb_device *dev :指向 urb 要發送到的 USB 設備.  

30. //unsigned int pipe : urb 要被發送到的 USB 設備的特定端點. 必須使用前面提過的 usb_******pipe 函數創建  

31. //void *transfer_buffer :指向外發數據或接收數據的緩衝區的指針.注意:不能是靜態緩衝,必須使用 kmalloc 來創建.  

32. //int buffer_length :transfer_buffer 指針指向的緩衝區的大小  

33. //usb_complete_t complete :指向 urb 結束處理例程函數指針  

34. //void *context :指向一個小數據塊的指針, 被添加到 urb 結構中,以便被結束處理例程函數獲取使用.  

35. //int interval :中斷 urb 被調度的間隔.  

36. //函數不設置 urb 中的 transfer_flags 變量, 因此對這個成員的修改必須由驅動手動完成  

37.   

38. /*等時 urb 沒有初始化函數,必須手動初始化,以下為一個例子*/  

39. urb->dev = dev;  

40. urb->context = uvd;  

41. urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);  

42. urb->interval = 1;  

43. urb->transfer_flags = URB_ISO_ASAP;  

44. urb->transfer_buffer = cam->sts_buf[i];  

45. urb->complete = konicawc_isoc_irq;  

46. urb->number_of_packets = FRAMES_PER_DESC;  

47. urb->transfer_buffer_length = FRAMES_PER_DESC;  

48. for (j=0; j < FRAMES_PER_DESC; j++) {  

49.         urb->iso_frame_desc[j].offset = j;  

50.         urb->iso_frame_desc[j].length = 1;  

51. }  

相關焦點

  • Linux USB總線驅動框架分析
    1.2 USB接入識別大致過程當識別出有USB設備插入後,linux內的USB總線驅動程序發出命令至該設備,與設備對話,並詢問設備信息(描述符),設備收到請求後,回復設備描述符給總線驅動程序。且總線驅動程序會為該設備分配一個地址,如上地址為2,當後期訪問某個USB設備時,均會通過這個地址編號,當新接入的USB設備被第一次訪問時,以地址0來訪問。
  • Linux USB滑鼠驅動程序詳解
    一個 USB 總線引出兩個重要的鍊表,一個為 USB 設備鍊表,一個為 USB 驅動鍊表。設備鍊表包含各種系統中的 USB 設備以及這些設備的所有接口,驅動鍊表包含 USB 設備驅動程序(usb device driver)和 USB 驅動程序(usb driver)。
  • Linux USB-Gadget 驅動框架
    有兩點值得注意,第一是 usb gaget 驅動框架不象 usb 主機端有 usb core 的概念,usb 主機可能支持成百類型的外設,把通用功能抽象出來很有意義。Usb device 端則通常沒有這個需求,一些通用功能抽象在一些 Helper 函數裡就可以了。第二是 usb 2.0 裡提出了 OTG 的概念,可以在同一接口上支持 host 以及 device 功能。
  • USB驅動框架(二)
    《USB驅動框架(一)》,接下來看一下主機控制器驅動框架。//include/linux/usb/hcd.hstruct usb_hcd { struct usb_bus self; /* hcd是一個總線 */ struct kref kref; /* 引用計數
  • 一步步教你編寫嵌入式Linux設備驅動程序,快上車!
    I/O Port和硬體打交道離不開I/O Port,老的ISA設備經常是佔用實際的I/O埠,在linux下,作業系統沒有對I/O口屏蔽,也就是說,任何驅動程序都可對任意的I/O口操作,這樣就很容易引起混亂。每個驅動程序應該自己避免誤用埠。有兩個重要的kernel函數可以保證驅動程序做到這一點。
  • Linux驅動實踐:一步一步編寫字符設備驅動程序
    作  者:道哥,10+年嵌入式開發老兵,專注於:C/C++、嵌入式、Linux。關注下方公眾號,回復【書籍】,獲取 Linux、嵌入式領域經典書籍;回復【PDF】,獲取所有原創文章( PDF 格式)。目錄API 函數編寫驅動程序編寫應用程式卸載驅動模塊小結別人的經驗,我們的階梯!
  • 如何編寫嵌入式Linux設備驅動程序?
    也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作。如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck。二、實例剖析我們來寫一個最簡單的字符設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序。
  • 安裝win7系統怎麼注入USB3.0驅動和NVME驅動
    win7注入usb3.0和nvme固態硬碟驅動的方法。時經常遇到0x0000007b藍屏,該藍屏代碼為找不到硬碟,在安裝原版WIN7的時候也會出現找不到硬碟導致安裝不了的問題,為什麼不教大家安裝Windows 10呢,是因為Windows 10系統已經集成了安裝NVMe SSD所必需的USB3.0和NVME驅動程序,所以裝系統相對簡單。
  • 「圖文」深入了解Linux USB驅動工作的整個流程
    驅動程序把驅動程序對象註冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序,熱插撥腳本使用它來確定當一個特定的設備插入到系統時該自動執行哪一個驅動程序的Probe。 5.
  • 關於USB驅動說明
    從一開始學習PLC,就有很多朋友遇到軟體驅動問題,那麼再此說明一下三菱PLC-USB轉232驅動說明:市面上USB轉232線品類眾多
  • Windows下USB音視頻類驅動程序堆棧架構-USB中文網
    一個USB接口的UVC攝像頭接入Windows系統後,Windows會使用系統自帶的驅動進行硬體設備驅動,從而實現「免驅」的效果。
  • 連載 | 系統學習Linux+Android:bootloader編譯等常見驅動程序編寫、調試學習(三)
    系統單片機開發,過渡到linux arm裸機程序開發。今天再來詳細講解下bootloader編譯(本文以u-boot為例)執行,linux內核原理、根文件系統,以及各類在工作中常見驅動程序編寫、調試方法。
  • 重裝系統必備神器:usb萬能驅動
    其實我們可以下載安裝一個usb設備試試,為此,小編就跟大夥嘮嘮這個usb萬能驅動。相信不少人在使用usb或者usb設備的時候,都遇到過無法識別usb的問題。這個問題是比較常見的,有些人是因為電腦的某個程序或者硬體損壞了而無法識別,那麼如果是由於usb驅動發生故障時,該怎麼辦呢?下面,小編就跟大家介紹usb萬能驅動,可解此毒。
  • USB驅動設備無法啟動!
    然後換了usb口不行;換滑鼠不行。想來麻煩大了,想來用慣滑鼠的手,只用tab鍵大概是有些不適應的。抓狂的時候,想用手指去屏幕亂點,結果肯定沒什麼卵用。分析問題應該出在新安的軟體上,所以第一反應是去卸載軟體,想從360軟體管理界面進入,但從程序用tab打開軟體後,就無法進行操作,看來windows只默認應用系統裡的東西。
  • Linux 上如何禁用 USB 存儲
    編譯自 | http://linuxtechlab.com/disable-usb-storage-linux/  作者 | Shusain
  • 圖解嵌入式Linux應用程式、內核、驅動程序及硬體之間的關係
    但是硬體與軟體之間存在一個駁論:為了快速、優質的完成軟體功能設計,應用程式工程師不想也不願關心硬體,而硬體工程師也很難有功夫去處理軟體開發中的一些應用。例如軟體工程師在調用printf的時候,不許也不用關心信息到底是通過什麼樣的處理,走過哪些通路顯示在該顯示的地方,硬體工程師在寫完了一個4*4鍵盤驅動後,無需也不必管應用程式在獲得鍵值後做哪些處理及操作。
  • Linux設備驅動程序編寫
    也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作。如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck。我們來寫一個最簡單的字符設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序。
  • USB主機控制器驅動分析
    先介紹主機控制器的驅動。內核版本:4.20.12驅動路徑:/drivers/usb/chipidea/core.cUSB IP:Chipidea(1)裝載和卸載函數static struct上面只是留下了一些跟主機驅動相關的,主要是一些硬體的初始化。PHY晶片有單獨的驅動,上面的PHY初始化最終會去調用PHY驅動中的函數。
  • Linux 2.6.35 自帶的USB轉UART晶片CH341T的驅動有問題
    老wu看到有CH341T的驅動支持,很開森。直接選中然後開始make。然後就開森不起來了,從Debug Console列印的引導記錄來看,USB 已經加載了,但是看布袋 ttyUSB 的加載,ls /dev/ttyUSB* 也沒任何結果。
  • 一文搞懂 USB 設備端驅動框架
    (driver/usb/gadget/compsite.c)從上圖我們可以看出,對於USB設備端驅動開發而言,更多的關注的是Function driver這層。USB 控制相關過程,內核提供了一個中間層幫我們屏蔽掉了。