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. }