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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * sa1100_usb.h
  3.  *
  4.  * Public interface to the sa1100 USB core. For use by client modules
  5.  * like usb-eth and usb-char.
  6.  *
  7.  */
  8. #ifndef _SA1100_USB_H
  9. #define _SA1100_USB_H
  10. #include <asm/byteorder.h>
  11. typedef void (*usb_callback_t)(int flag, int size);
  12. /* in usb_ctl.c (see also descriptor methods at bottom of file) */
  13. // Open the USB client for client and initialize data structures
  14. // to default values, but _do not_ start UDC.
  15. int sa1100_usb_open( const char * client_name );
  16. // Start UDC running
  17. int sa1100_usb_start( void );
  18. // Immediately stop udc, fire off completion routines w/-EINTR
  19. int sa1100_usb_stop( void ) ;
  20. // Disconnect client from usb core
  21. int sa1100_usb_close( void ) ;
  22. // set notify callback for when core reaches configured state
  23. // return previous pointer (if any)
  24. typedef void (*usb_notify_t)(void);
  25. usb_notify_t sa1100_set_configured_callback( usb_notify_t callback );
  26. /* in usb_send.c */
  27. int sa1100_usb_xmitter_avail( void );
  28. int sa1100_usb_send(char *buf, int len, usb_callback_t callback);
  29. void sa1100_usb_send_reset(void);
  30. /* in usb_recev.c */
  31. int sa1100_usb_recv(char *buf, int len, usb_callback_t callback);
  32. void sa1100_usb_recv_reset(void);
  33. //////////////////////////////////////////////////////////////////////////////
  34. // Descriptor Management
  35. //////////////////////////////////////////////////////////////////////////////
  36. #define DescriptorHeader 
  37. __u8 bLength;        
  38. __u8 bDescriptorType
  39. // --- Device Descriptor -------------------
  40. typedef struct {
  41.  DescriptorHeader;
  42.  __u16 bcdUSB;     /* USB specification revision number in BCD */
  43.  __u8  bDeviceClass; /* USB class for entire device */
  44.  __u8  bDeviceSubClass; /* USB subclass information for entire device */
  45.  __u8  bDeviceProtocol; /* USB protocol information for entire device */
  46.  __u8  bMaxPacketSize0; /* Max packet size for endpoint zero */
  47.  __u16 idVendor;        /* USB vendor ID */
  48.  __u16 idProduct;       /* USB product ID */
  49.  __u16 bcdDevice;       /* vendor assigned device release number */
  50.  __u8  iManufacturer; /* index of manufacturer string */
  51.  __u8  iProduct;        /* index of string that describes product */
  52.  __u8  iSerialNumber; /* index of string containing device serial number */
  53.  __u8  bNumConfigurations; /* number fo configurations */
  54. } __attribute__ ((packed)) device_desc_t;
  55. // --- Configuration Descriptor ------------
  56. typedef struct {
  57.  DescriptorHeader;
  58.  __u16 wTotalLength;     /* total # of bytes returned in the cfg buf 4 this cfg */
  59.  __u8  bNumInterfaces;      /* number of interfaces in this cfg */
  60.  __u8  bConfigurationValue; /* used to uniquely ID this cfg */
  61.  __u8  iConfiguration;      /* index of string describing configuration */
  62.  __u8  bmAttributes;        /* bitmap of attributes for ths cfg */
  63.  __u8  MaxPower;     /* power draw in 2ma units */
  64. } __attribute__ ((packed)) config_desc_t;
  65. // bmAttributes:
  66. enum { USB_CONFIG_REMOTEWAKE=0x20, USB_CONFIG_SELFPOWERED=0x40,
  67.    USB_CONFIG_BUSPOWERED=0x80 };
  68. // MaxPower:
  69. #define USB_POWER( x)  ((x)>>1) /* convert mA to descriptor units of A for MaxPower */
  70. // --- Interface Descriptor ---------------
  71. typedef struct {
  72.  DescriptorHeader;
  73.  __u8  bInterfaceNumber;   /* Index uniquely identfying this interface */
  74.  __u8  bAlternateSetting;  /* ids an alternate setting for this interface */
  75.  __u8  bNumEndpoints;      /* number of endpoints in this interface */
  76.  __u8  bInterfaceClass;    /* USB class info applying to this interface */
  77.  __u8  bInterfaceSubClass; /* USB subclass info applying to this interface */
  78.  __u8  bInterfaceProtocol; /* USB protocol info applying to this interface */
  79.  __u8  iInterface;         /* index of string describing interface */
  80. } __attribute__ ((packed)) intf_desc_t;
  81. // --- Endpoint  Descriptor ---------------
  82. typedef struct {
  83.  DescriptorHeader;
  84.  __u8  bEndpointAddress;  /* 0..3 ep num, bit 7: 0 = 0ut 1= in */
  85.  __u8  bmAttributes;      /* 0..1 = 0: ctrl, 1: isoc, 2: bulk 3: intr */
  86.  __u16 wMaxPacketSize;    /* data payload size for this ep in this cfg */
  87.  __u8  bInterval;         /* polling interval for this ep in this cfg */
  88. } __attribute__ ((packed)) ep_desc_t;
  89. // bEndpointAddress:
  90. enum { USB_OUT= 0, USB_IN=1 };
  91. #define USB_EP_ADDRESS(a,d) (((a)&0xf) | ((d) << 7))
  92. // bmAttributes:
  93. enum { USB_EP_CNTRL=0, USB_EP_BULK=2, USB_EP_INT=3 };
  94. // --- String Descriptor -------------------
  95. typedef struct {
  96.  DescriptorHeader;
  97.  __u16 bString[1];   /* unicode string .. actaully 'n' __u16s */
  98. } __attribute__ ((packed)) string_desc_t;
  99. /*=======================================================
  100.  * Handy helpers when working with above
  101.  *
  102.  */
  103. // these are x86-style 16 bit "words" ...
  104. #define make_word_c( w ) __constant_cpu_to_le16(w)
  105. #define make_word( w )   __cpu_to_le16(w)
  106. // descriptor types
  107. enum { USB_DESC_DEVICE=1, USB_DESC_CONFIG=2, USB_DESC_STRING=3,
  108.    USB_DESC_INTERFACE=4, USB_DESC_ENDPOINT=5 };
  109. /*=======================================================
  110.  * Default descriptor layout for SA-1100 and SA-1110 UDC
  111.  */
  112. /* "config descriptor buffer" - that is, one config,
  113.    ..one interface and 2 endpoints */
  114. struct cdb {
  115.  config_desc_t cfg;
  116.  intf_desc_t   intf;
  117.  ep_desc_t     ep1;
  118.  ep_desc_t     ep2;
  119. } __attribute__ ((packed));
  120. /* all SA device descriptors */
  121. typedef struct {
  122.  device_desc_t dev;   /* device descriptor */
  123.  struct cdb b;        /* bundle of descriptors for this cfg */
  124. } __attribute__ ((packed)) desc_t;
  125. /*=======================================================
  126.  * Descriptor API
  127.  */
  128. /* Get the address of the statically allocated desc_t structure
  129.    in the usb core driver. Clients can modify this between
  130.    the time they call sa1100_usb_open() and sa1100_usb_start()
  131. */
  132. desc_t *
  133. sa1100_usb_get_descriptor_ptr( void );
  134. /* Set a pointer to the string descriptor at "index". The driver
  135.  ..has room for 8 string indicies internally. Index zero holds
  136.  ..a LANGID code and is set to US English by default. Inidices
  137.  ..1-7 are available for use in the config descriptors as client's
  138.  ..see fit. This pointer is assumed to be good as long as the
  139.  ..SA usb core is open (so statically allocate them). Returnes -EINVAL
  140.  ..if index out of range */
  141. int sa1100_usb_set_string_descriptor( int index, string_desc_t * p );
  142. /* reverse of above */
  143. string_desc_t *
  144. sa1100_usb_get_string_descriptor( int index );
  145. /* kmalloc() a string descriptor and convert "p" to unicode in it */
  146. string_desc_t *
  147. sa1100_usb_kmalloc_string_descriptor( const char * p );
  148. #endif /* _SA1100_USB_H */