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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Driver for USB Mass Storage compliant devices
  2.  * Main Header File
  3.  *
  4.  * $Id: usb.h,v 1.18 2001/07/30 00:27:59 mdharm Exp $
  5.  *
  6.  * Current development and maintenance by:
  7.  *   (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
  8.  *
  9.  * Initial work by:
  10.  *   (c) 1999 Michael Gee (michael@linuxspecific.com)
  11.  *
  12.  * This driver is based on the 'USB Mass Storage Class' document. This
  13.  * describes in detail the protocol used to communicate with such
  14.  * devices.  Clearly, the designers had SCSI and ATAPI commands in
  15.  * mind when they created this document.  The commands are all very
  16.  * similar to commands in the SCSI-II and ATAPI specifications.
  17.  *
  18.  * It is important to note that in a number of cases this class
  19.  * exhibits class-specific exemptions from the USB specification.
  20.  * Notably the usage of NAK, STALL and ACK differs from the norm, in
  21.  * that they are used to communicate wait, failed and OK on commands.
  22.  *
  23.  * Also, for certain devices, the interrupt endpoint is used to convey
  24.  * status of a command.
  25.  *
  26.  * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more
  27.  * information about this driver.
  28.  *
  29.  * This program is free software; you can redistribute it and/or modify it
  30.  * under the terms of the GNU General Public License as published by the
  31.  * Free Software Foundation; either version 2, or (at your option) any
  32.  * later version.
  33.  *
  34.  * This program is distributed in the hope that it will be useful, but
  35.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  36.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  37.  * General Public License for more details.
  38.  *
  39.  * You should have received a copy of the GNU General Public License along
  40.  * with this program; if not, write to the Free Software Foundation, Inc.,
  41.  * 675 Mass Ave, Cambridge, MA 02139, USA.
  42.  */
  43. #ifndef _USB_H_
  44. #define _USB_H_
  45. #include <linux/usb.h>
  46. #include <linux/blk.h>
  47. #include <linux/smp_lock.h>
  48. #include <linux/completion.h>
  49. #include "scsi.h"
  50. #include "hosts.h"
  51. /* 
  52.  * GUID definitions
  53.  */
  54. #define GUID(x) __u32 x[3]
  55. #define GUID_EQUAL(x, y) (x[0] == y[0] && x[1] == y[1] && x[2] == y[2])
  56. #define GUID_CLEAR(x) x[0] = x[1] = x[2] = 0;
  57. #define GUID_NONE(x) (!x[0] && !x[1] && !x[2])
  58. #define GUID_FORMAT "%08x%08x%08x"
  59. #define GUID_ARGS(x) x[0], x[1], x[2]
  60. static inline void make_guid( __u32 *pg, __u16 vendor, __u16 product, char *serial)
  61. {
  62. pg[0] = (vendor << 16) | product;
  63. pg[1] = pg[2] = 0;
  64. while (*serial) {
  65. pg[1] <<= 4;
  66. pg[1] |= pg[2] >> 28;
  67. pg[2] <<= 4;
  68. if (*serial >= 'a')
  69. *serial -= 'a' - 'A';
  70. pg[2] |= (*serial <= '9' && *serial >= '0') ? *serial - '0'
  71. : *serial - 'A' + 10;
  72. serial++;
  73. }
  74. }
  75. struct us_data;
  76. /*
  77.  * Unusual device list definitions 
  78.  */
  79. struct us_unusual_dev {
  80. const char* vendorName;
  81. const char* productName;
  82. __u8  useProtocol;
  83. __u8  useTransport;
  84. int (*initFunction)(struct us_data *);
  85. unsigned int flags;
  86. };
  87. /* Flag definitions */
  88. #define US_FL_SINGLE_LUN      0x00000001 /* allow access to only LUN 0     */
  89. #define US_FL_MODE_XLATE      0x00000002 /* translate _6 to _10 commands for
  90.     Win/MacOS compatibility */
  91. #define US_FL_START_STOP      0x00000004 /* ignore START_STOP commands     */
  92. #define US_FL_IGNORE_SER      0x00000010 /* Ignore the serial number given  */
  93. #define US_FL_SCM_MULT_TARG   0x00000020 /* supports multiple targets */
  94. #define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs fixing */
  95. #define USB_STOR_STRING_LEN 32
  96. typedef int (*trans_cmnd)(Scsi_Cmnd*, struct us_data*);
  97. typedef int (*trans_reset)(struct us_data*);
  98. typedef void (*proto_cmnd)(Scsi_Cmnd*, struct us_data*);
  99. typedef void (*extra_data_destructor)(void *);  /* extra data destructor   */
  100. /* we allocate one of these for every device that we remember */
  101. struct us_data {
  102. struct us_data *next;  /* next device */
  103. /* the device we're working with */
  104. struct semaphore dev_semaphore;  /* protect pusb_dev */
  105. struct usb_device *pusb_dev;  /* this usb_device */
  106. unsigned int flags;  /* from filter initially */
  107. /* information about the device -- always good */
  108. char vendor[USB_STOR_STRING_LEN];
  109. char product[USB_STOR_STRING_LEN];
  110. char serial[USB_STOR_STRING_LEN];
  111. char *transport_name;
  112. char *protocol_name;
  113. u8 subclass;
  114. u8 protocol;
  115. u8 max_lun;
  116. /* information about the device -- only good if device is attached */
  117. u8 ifnum;  /* interface number   */
  118. u8 ep_in;  /* bulk in endpoint   */
  119. u8 ep_out;  /* bulk out endpoint  */
  120. struct usb_endpoint_descriptor *ep_int;  /* interrupt endpoint */ 
  121. /* function pointers for this device */
  122. trans_cmnd transport;  /* transport function    */
  123. trans_reset transport_reset; /* transport device reset */
  124. proto_cmnd proto_handler;  /* protocol handler    */
  125. /* SCSI interfaces */
  126. GUID(guid);  /* unique dev id */
  127. struct Scsi_Host *host;  /* our dummy host data */
  128. Scsi_Host_Template htmplt;  /* own host template */
  129. int host_number;  /* to find us */
  130. int host_no;  /* allocated by scsi */
  131. Scsi_Cmnd *srb;  /* current srb */
  132. /* thread information */
  133. Scsi_Cmnd *queue_srb;  /* the single queue slot */
  134. int action;  /* what to do   */
  135. int pid;  /* control thread   */
  136. /* interrupt info for CBI devices -- only good if attached */
  137. struct semaphore ip_waitq;  /* for CBI interrupts  */
  138. atomic_t ip_wanted[1];  /* is an IRQ expected?  */
  139. /* interrupt communications data */
  140. struct semaphore irq_urb_sem;  /* to protect irq_urb  */
  141. struct urb *irq_urb;  /* for USB int requests */
  142. unsigned char irqbuf[2];  /* buffer for USB IRQ  */
  143. unsigned char irqdata[2];  /* data from USB IRQ  */
  144. /* control and bulk communications data */
  145. struct semaphore current_urb_sem; /* to protect irq_urb  */
  146. struct urb *current_urb;  /* non-int USB requests */
  147. struct completion current_done;  /* the done flag        */
  148. /* the semaphore for sleeping the control thread */
  149. struct semaphore sema;  /* to sleep thread on   */
  150. /* mutual exclusion structures */
  151. struct completion notify;  /* thread begin/end     */
  152. struct semaphore queue_exclusion; /* to protect data structs */
  153. struct us_unusual_dev   *unusual_dev;  /* If unusual device       */
  154. void *extra;  /* Any extra data          */
  155. extra_data_destructor extra_destructor;/* extra data destructor   */
  156. };
  157. /* The list of structures and the protective lock for them */
  158. extern struct us_data *us_list;
  159. extern struct semaphore us_list_semaphore;
  160. /* The structure which defines our driver */
  161. extern struct usb_driver usb_storage_driver;
  162. /* Function to fill an inquiry response. See usb.c for details */
  163. extern void fill_inquiry_response(struct us_data *us,
  164. unsigned char *data, unsigned int data_len);
  165. #endif