URB.txt
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. Revised: 2000-Dec-05.
  2. 1. Specification of the API
  3. 1.1. Basic concept or 'What is an URB?'
  4. The basic idea of the new driver is message passing, the message itself is 
  5. called USB Request Block, or URB for short. 
  6. - An URB consists of all relevant information to execute any USB transaction 
  7. and deliver the data and status back. 
  8. - Execution of an URB is inherently an asynchronous operation, i.e. the 
  9. usb_submit_urb(urb) call returns immediately after it has successfully queued 
  10. the requested action. 
  11. - Ongoing transfers for one URB (e.g. ISO) can simply be canceled with
  12. usb_unlink_urb(urb) at any time. 
  13. - Each URB has a completion handler, which is called after the action
  14. has been successfully completed or canceled (INT transfers behave a bit
  15. differently, see below). The URB also contains a context-pointer for free 
  16. usage and information passing to the completion handler.
  17. - URBs can be linked. After completing one URB, the next one can be
  18. automatically submitted. This is especially useful for ISO transfers:
  19. You only have read/write the data from/to the buffers in the completion 
  20. handler, the continuous streaming itself is transparently done by the 
  21. URB-machinery.
  22. 1.2. The URB structure
  23. typedef struct urb
  24. {
  25. spinlock_t lock; // lock for the URB
  26. // ignore, for host controller/URB machine internal use
  27. void *hcpriv;                   // private data for host controller
  28. struct list_head urb_list;      // list pointer to all active urbs 
  29. // This is used for urb linking
  30. struct urb* next;               // pointer to next URB  
  31. struct usb_device *dev;         // pointer to associated USB device
  32. // pipe is assembled by the various well-known pipe macros in usb.h
  33. unsigned int pipe;              // pipe information
  34. // status after each completion
  35. int status;                     // returned status
  36. unsigned int transfer_flags;    // ASAP, DISABLE_SPD, etc.
  37. // for data stage (CTRL), BULK, INT and ISO
  38. void *transfer_buffer;          // associated data buffer
  39. // expected length
  40. int transfer_buffer_length;     // data buffer length
  41. int actual_length;              // actual data buffer length    
  42. // setup stage for CTRL (always 8 bytes!)
  43. unsigned char* setup_packet;    // setup packet (control only)
  44. // with ASAP, start_frame is set to the determined frame
  45. int start_frame;                // start frame (iso/irq)
  46. int number_of_packets;          // # of packets (iso/int)
  47. int interval;                   // polling interval (irq only)
  48. int error_count;                // number of errors (iso only)
  49. //
  50. void *context;                  // context for completion routine
  51. usb_complete_t complete;        // pointer to completion routine
  52. //
  53. // specification of the requested data offsets and length for ISO
  54. iso_packet_descriptor_t iso_frame_desc[0];
  55. } urb_t, *purb_t;
  56. 1.3. How to get an URB?
  57. URBs are allocated with the following call
  58. purb_t usb_alloc_urb(int isoframes)
  59. Return value is a pointer to the allocated URB, 0 if allocation failed.
  60. The parameter isoframes specifies the number of isochronous transfer frames
  61. you want to schedule. For CTRL/BULK/INT, use 0.
  62. To free an URB, use
  63. void usb_free_urb(purb_t purb)
  64. This call also may free internal (host controller specific) memory in the
  65. future.
  66. 1.4. What has to be filled in?
  67. Depending on the type of transaction, there are some macros 
  68. (FILL_CONTROL_URB, FILL_CONTROL_URB_TO, FILL_BULK_URB,
  69. FILL_BULK_URB_TO, and FILL_INT_URB, defined in usb.h)
  70. that simplify the URB creation. In general, all macros need the usb
  71. device pointer, the pipe (usual format from usb.h), the transfer buffer,
  72. the desired transfer length, the completion  handler, and its context. 
  73. Take a look at the usb_control_msg function that converts the old API 
  74. into the URB API.
  75. Flags:
  76. For ISO there are two startup behaviors: Specified start_frame or ASAP.
  77. For ASAP set USB_ISO_ASAP in transfer_flags.
  78. If short packets should NOT be tolerated, set USB_DISABLE_SPD in 
  79. transfer_flags.
  80. Usually, to reduce restart time, the completion handler is called
  81. AFTER the URB re-submission.  However, it is called BEFORE URB
  82. re-submission for INT transfers that are being continued.
  83. 1.5. How to submit an URB?
  84. Just call
  85. int usb_submit_urb(purb_t purb)
  86. It immediately returns, either with status 0 (request queued) or some
  87. error code, usually caused by the following:
  88. - Out of memory (-ENOMEM)
  89. - Wrong pipe handle (-ENXIO)
  90. - Unplugged device (-ENODEV)
  91. - Stalled endpoint (-EPIPE)
  92. - Too many queued ISO transfers (-EAGAIN)
  93. - Too many requested ISO frames (-EFBIG)
  94. - Invalid INT interval (-EINVAL)
  95. - More than one packet for INT (-EINVAL)
  96. After submission, urb->status is USB_ST_URB_PENDING (-EINPROGRESS).
  97. For isochronous endpoints, subsequent submitting of URBs to the same endpoint
  98. with the ASAP flag result in a seamless ISO streaming. Exception: The 
  99. execution cannot be scheduled later than 900 frames from the 'now'-time. 
  100. The same applies to INT transfers, but here the seamless continuation is 
  101. independent of the transfer flags (implicitly ASAP).
  102. 1.6. How to cancel an already running URB?
  103. For an URB which you've submitted, but which hasn't been returned to
  104. your driver by the host controller, call
  105. int usb_unlink_urb(purb_t purb)
  106. It removes the urb from the internal list and frees all allocated
  107. HW descriptors. The status is changed to USB_ST_URB_KILLED. After 
  108. usb_unlink_urb() returns, you can safely free the URB with usb_free_urb(urb)
  109. and all other possibly associated data (urb->context etc.)
  110. There is also an asynchronous unlink mode.  To use this, set the
  111. the USB_ASYNC_UNLINK flag in urb->transfer flags before calling
  112. usb_unlink_urb().  When using async unlinking, the URB will not
  113. normally be unlinked when usb_unlink_urb() returns.  Instead, wait
  114. for the completion handler to be called.
  115. 1.7. What about the completion handler?
  116. The completion handler is optional, but useful for fast data processing
  117. or wakeup of a sleeping process (as shown in the compatibility wrapper's 
  118. completion handler).
  119. The handler is of the following type:
  120. typedef void (*usb_complete_t)(struct urb *);
  121. i.e. it gets just the URB that caused the completion call.
  122. In the completion handler, you should have a look at urb->status to
  123. detect any USB errors. Since the context parameter is included in the URB,
  124. you can pass information to the completion handler. 
  125. NOTE:  ***** WARNING *****
  126. AVOID using the urb->dev field in your completion handler; it's cleared
  127. as part of URB unlinking.  Instead, use urb->context to hold all the
  128. data your driver needs.
  129. NOTE:  ***** WARNING *****
  130. Also, NEVER SLEEP IN A COMPLETION HANDLER.  These are normally called
  131. during hardware interrupt processing.  If you can, defer substantial
  132. work to a tasklet (bottom half) to keep system latencies low.  You'll
  133. probably need to use spinlocks to protect data structures you manipulate
  134. in completion handlers.
  135. 1.8. How to do isochronous (ISO) transfers?
  136. For ISO transfers you have to append the iso_packet_descriptor_t structure 
  137. to the URB for each frame you want to schedule. When using usb_alloc_urb(n)
  138. (recommended), the iso_packets parameter can be used to allocate the
  139. structures for iso_packets frames.
  140. For each entry you have to specify the data offset for this frame (base is
  141. transfer_buffer), and the length you want to write/expect to read.
  142. After completion, actual_length contains the actual transferred length and 
  143. status contains the resulting USB-status for the ISO transfer for this frame.
  144. It is allowed to specify a varying length from frame to frame (e.g. for
  145. audio synchronisation/adaptive transfer rates). You can also use the length 
  146. 0 to omit one or more frames (striping).
  147. As can be concluded from above, the UHCI-driver does not care for continuous
  148. data in case of short packet ISO reads! There's no fixup_isoc() like in the 
  149. old driver. There may be a common routine to do this in the future, but this 
  150. has nothing to do with the UHCI-driver!
  151. For scheduling you can choose your own start frame or ASAP. As written above,
  152. queuing more than one ISO frame with ASAP to the same device&endpoint result 
  153. in seamless ISO streaming. For continuous streaming you have to use URB
  154. linking. 
  155. 1.9. How to start interrupt (INT) transfers?
  156. INT transfers are currently implemented with different queues for intervals 
  157. for 1, 2, 4,... 128ms. Only one URB is allocated for each interrupt. After
  158. calling the completion handler, that URB is recycled by the host controller
  159. driver (HCD).
  160. With the submission of one URB, the interrupt is scheduled until it is
  161. canceled by usb_unlink_urb.
  162. The usb_submit_urb() call modifies urb->interval to the implemented interval
  163. value that is less than or equal to the requested interval value.