hcd.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:9k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 2001 by David Brownell
  3.  * 
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of the GNU General Public License as published by the
  6.  * Free Software Foundation; either version 2 of the License, or (at your
  7.  * option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12.  * for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software Foundation,
  16.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18. /*-------------------------------------------------------------------------*/
  19. /*
  20.  * USB Host Controller Driver (usb_hcd) framework
  21.  *
  22.  * Since "struct usb_bus" is so thin, you can't share much code in it.
  23.  * This framework is a layer over that, and should be more sharable.
  24.  */
  25. /*-------------------------------------------------------------------------*/
  26. struct usb_hcd { /* usb_bus.hcpriv points to this */
  27. /*
  28.  * housekeeping
  29.  */
  30. struct usb_bus *bus; /* hcd is-a bus */
  31. struct list_head hcd_list;
  32. const char *bus_name;
  33. const char *product_desc;
  34. const char *description; /* "ehci-hcd" etc */
  35. struct timer_list rh_timer; /* drives root hub */
  36. struct list_head dev_list; /* devices on this bus */
  37. /*
  38.  * hardware info/state
  39.  */
  40. struct hc_driver *driver; /* hw-specific hooks */
  41. int irq; /* irq allocated */
  42. void *regs; /* device memory/io */
  43. #ifdef CONFIG_PCI
  44. /* a few non-PCI controllers exist, mostly for OHCI */
  45. struct pci_dev *pdev; /* pci is typical */
  46. int region; /* pci region for regs */
  47. u32 pci_state [16]; /* for PM state save */
  48. atomic_t resume_count; /* multiple resumes issue */
  49. #endif
  50. int state;
  51. # define __ACTIVE 0x01
  52. # define __SLEEPY 0x02
  53. # define __SUSPEND 0x04
  54. # define __TRANSIENT 0x80
  55. # define USB_STATE_HALT 0
  56. # define USB_STATE_RUNNING (__ACTIVE)
  57. # define USB_STATE_READY (__ACTIVE|__SLEEPY)
  58. # define USB_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE)
  59. # define USB_STATE_RESUMING (__SUSPEND|__TRANSIENT)
  60. # define USB_STATE_SUSPENDED (__SUSPEND)
  61. #define HCD_IS_RUNNING(state) ((state) & __ACTIVE)
  62. #define HCD_IS_SUSPENDED(state) ((state) & __SUSPEND)
  63. /* more shared queuing code would be good; it should support
  64.  * smarter scheduling, handle transaction translators, etc;
  65.  * input size of periodic table to an interrupt scheduler. 
  66.  * (ohci 32, uhci 1024, ehci 256/512/1024).
  67.  */
  68. };
  69. struct hcd_dev { /* usb_device.hcpriv points to this */
  70. struct list_head dev_list; /* on this hcd */
  71. struct list_head urb_list; /* pending on this dev */
  72. /* per-configuration HC/HCD state, such as QH or ED */
  73. void *ep[32];
  74. };
  75. // urb.hcpriv is really hardware-specific
  76. struct hcd_timeout { /* timeouts we allocate */
  77. struct list_head timeout_list;
  78. struct timer_list timer;
  79. };
  80. /*-------------------------------------------------------------------------*/
  81. /* each driver provides one of these, and hardware init support */
  82. struct hc_driver {
  83. const char *description; /* "ehci-hcd" etc */
  84. /* irq handler */
  85. void (*irq) (struct usb_hcd *hcd);
  86. int flags;
  87. #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */
  88. #define HCD_USB11 0x0010 /* USB 1.1 */
  89. #define HCD_USB2 0x0020 /* USB 2.0 */
  90. /* called to init HCD and root hub */
  91. int (*start) (struct usb_hcd *hcd);
  92. /* called after all devices were suspended */
  93. int (*suspend) (struct usb_hcd *hcd, u32 state);
  94. /* called before any devices get resumed */
  95. int (*resume) (struct usb_hcd *hcd);
  96. /* cleanly make HCD stop writing memory and doing I/O */
  97. void (*stop) (struct usb_hcd *hcd);
  98. /* return current frame number */
  99. int (*get_frame_number) (struct usb_hcd *hcd);
  100. // FIXME: rework generic-to-specific HCD linkage (specific contains generic)
  101. /* memory lifecycle */
  102. struct usb_hcd *(*hcd_alloc) (void);
  103. void (*hcd_free) (struct usb_hcd *hcd);
  104. /* manage i/o requests, device state */
  105. int (*urb_enqueue) (struct usb_hcd *hcd, struct urb *urb,
  106. int mem_flags);
  107. int (*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb);
  108. // frees configuration resources -- allocated as needed during
  109. // urb_enqueue, and not freed by urb_dequeue
  110. void (*free_config) (struct usb_hcd *hcd,
  111. struct usb_device *dev);
  112. /* root hub support */
  113. int (*hub_status_data) (struct usb_hcd *hcd, char *buf);
  114. int (*hub_control) (struct usb_hcd *hcd,
  115. u16 typeReq, u16 wValue, u16 wIndex,
  116. char *buf, u16 wLength);
  117. };
  118. extern void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb);
  119. #ifdef CONFIG_PCI
  120. struct pci_device_id;
  121. extern int usb_hcd_pci_probe (struct pci_dev *dev,
  122. const struct pci_device_id *id);
  123. extern void usb_hcd_pci_remove (struct pci_dev *dev);
  124. #ifdef CONFIG_PM
  125. // FIXME:  see Documentation/power/pci.txt (2.4.6 and later?)
  126. // extern int usb_hcd_pci_save_state (struct pci_dev *dev, u32 state);
  127. extern int usb_hcd_pci_suspend (struct pci_dev *dev, u32 state);
  128. extern int usb_hcd_pci_resume (struct pci_dev *dev);
  129. // extern int usb_hcd_pci_enable_wake (struct pci_dev *dev, u32 state, int flg);
  130. #endif /* CONFIG_PM */
  131. #endif /* CONFIG_PCI */
  132. /*-------------------------------------------------------------------------*/
  133. /*
  134.  * HCD Root Hub support
  135.  */
  136. #include "hub.h"
  137. /* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
  138. #define DeviceRequest 
  139. ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
  140. #define DeviceOutRequest 
  141. ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
  142. #define InterfaceRequest 
  143. ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
  144. #define EndpointRequest 
  145. ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
  146. #define EndpointOutRequest 
  147. ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
  148. /* table 9.6 standard features */
  149. #define DEVICE_REMOTE_WAKEUP 1
  150. #define ENDPOINT_HALT 0
  151. /* class requests from the USB 2.0 hub spec, table 11-15 */
  152. /* GetBusState and SetHubDescriptor are optional, omitted */
  153. #define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE)
  154. #define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE)
  155. #define GetHubDescriptor (0xa000 | USB_REQ_GET_DESCRIPTOR)
  156. #define GetHubStatus (0xa000 | USB_REQ_GET_STATUS)
  157. #define GetPortStatus (0xa300 | USB_REQ_GET_STATUS)
  158. #define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE)
  159. #define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE)
  160. /*-------------------------------------------------------------------------*/
  161. /*
  162.  * Generic bandwidth allocation constants/support
  163.  */
  164. #define FRAME_TIME_USECS 1000L
  165. #define BitTime(bytecount)  (7 * 8 * bytecount / 6)  /* with integer truncation */
  166. /* Trying not to use worst-case bit-stuffing
  167.                    of (7/6 * 8 * bytecount) = 9.33 * bytecount */
  168. /* bytecount = data payload byte count */
  169. #define NS_TO_US(ns) ((ns + 500L) / 1000L)
  170. /* convert & round nanoseconds to microseconds */
  171. extern void usb_claim_bandwidth (struct usb_device *dev, struct urb *urb,
  172. int bustime, int isoc);
  173. extern void usb_release_bandwidth (struct usb_device *dev, struct urb *urb,
  174. int isoc);
  175. /*
  176.  * Full/low speed bandwidth allocation constants/support.
  177.  */
  178. #define BW_HOST_DELAY 1000L /* nanoseconds */
  179. #define BW_HUB_LS_SETUP 333L /* nanoseconds */
  180.                         /* 4 full-speed bit times (est.) */
  181. #define FRAME_TIME_BITS         12000L /* frame = 1 millisecond */
  182. #define FRAME_TIME_MAX_BITS_ALLOC (90L * FRAME_TIME_BITS / 100L)
  183. #define FRAME_TIME_MAX_USECS_ALLOC (90L * FRAME_TIME_USECS / 100L)
  184. extern int usb_check_bandwidth (struct usb_device *dev, struct urb *urb);
  185. /*
  186.  * Ceiling microseconds (typical) for that many bytes at high speed
  187.  * ISO is a bit less, no ACK ... from USB 2.0 spec, 5.11.3 (and needed
  188.  * to preallocate bandwidth)
  189.  */
  190. #define USB2_HOST_DELAY 5 /* nsec, guess */
  191. #define HS_USECS(bytes) NS_TO_US ( ((55 * 8 * 2083)/1000) 
  192. + ((2083UL * (3167 + BitTime (bytes)))/1000) 
  193. + USB2_HOST_DELAY)
  194. #define HS_USECS_ISO(bytes) NS_TO_US ( ((long)(38 * 8 * 2.083)) 
  195. + ((2083UL * (3167 + BitTime (bytes)))/1000) 
  196. + USB2_HOST_DELAY)
  197. extern long usb_calc_bus_time (int speed, int is_input,
  198. int isoc, int bytecount);
  199. /*-------------------------------------------------------------------------*/
  200. /* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */
  201. // bleech -- resurfaced in 2.4.11 or 2.4.12
  202. #define bitmap  DeviceRemovable
  203. /*-------------------------------------------------------------------------*/
  204. /* random stuff */
  205. #define RUN_CONTEXT (in_irq () ? "in_irq" 
  206. : (in_interrupt () ? "in_interrupt" : "can sleep"))
  207. /* 2.5 changes ... */
  208. #ifndef container_of
  209. #define container_of list_entry
  210. #endif
  211. #define usb_get_urb(x) (x)
  212. #define usb_put_urb(x)
  213. static inline struct usb_bus *hcd_to_bus (struct usb_hcd *hcd)
  214. { return hcd->bus; }
  215. static inline void
  216. usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe)
  217. { }