minor cleanup
[gnuk/gnuk.git] / src / usb_desc.c
1 /*
2  * usb_desc.c - USB Descriptor
3  */
4
5 #include "config.h"
6 #include "usb_lib.h"
7 #include "usb_desc.h"
8
9 #define USB_ICC_INTERFACE_CLASS 0x0B
10 #define USB_ICC_INTERFACE_SUBCLASS 0x00
11 #define USB_ICC_INTERFACE_BULK_PROTOCOL 0x00
12 #define USB_ICC_DATA_SIZE 64
13
14 /* USB Standard Device Descriptor */
15 static const uint8_t gnukDeviceDescriptor[] = {
16   18,   /* bLength */
17   USB_DEVICE_DESCRIPTOR_TYPE,     /* bDescriptorType */
18   0x10, 0x01,   /* bcdUSB = 1.1 */
19   0x00,   /* bDeviceClass: 0 means deferred to interface */
20   0x00,   /* bDeviceSubClass */
21   0x00,   /* bDeviceProtocol */
22   0x40,   /* bMaxPacketSize0 */
23   0x4b, 0x23,   /* idVendor = 0x234b (FSIJ) */
24   0x00, 0x00,   /* idProduct = 0x0000 (FSIJ USB Token) */
25   0x00, 0x02,   /* bcdDevice = 2.00 */
26   1, /* Index of string descriptor describing manufacturer */
27   2, /* Index of string descriptor describing product */
28   3, /* Index of string descriptor describing the device's serial number */
29   0x01    /* bNumConfigurations */
30 };
31
32 #ifdef ENABLE_VIRTUAL_COM_PORT
33 #define W_TOTAL_LENGTH (9+9+54+7+7+9+5+5+4+5+7+9+7+7)
34 #define NUM_INTERFACES 3        /* two for CDC, one for GPG */
35 #else
36 #define W_TOTAL_LENGTH (9+9+54+7+7)
37 #define NUM_INTERFACES 1        /* GPG only */
38 #endif
39
40 /* Configuation Descriptor */
41 static const uint8_t gnukConfigDescriptor[] = {
42   9,                       /* bLength: Configuation Descriptor size */
43   USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
44   W_TOTAL_LENGTH, 0x00,   /* wTotalLength:no of returned bytes */
45   NUM_INTERFACES,   /* bNumInterfaces: */
46   0x01,   /* bConfigurationValue: Configuration value */
47   0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
48 #if defined(USB_SELF_POWERED)
49   0xC0,   /* bmAttributes: self powered */
50 #else
51   0x80,   /* bmAttributes: bus powered */
52 #endif
53   50,     /* MaxPower 100 mA */
54
55   /* Interface Descriptor */
56   9,                          /* bLength: Interface Descriptor size */
57   USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
58   0,                             /* bInterfaceNumber: Index of this interface */
59   0,                        /* Alternate setting for this interface */
60   2,                        /* bNumEndpoints: Bulk-IN, Bulk-OUT */
61   USB_ICC_INTERFACE_CLASS,
62   USB_ICC_INTERFACE_SUBCLASS,
63   USB_ICC_INTERFACE_BULK_PROTOCOL,
64   0,                            /* string index for interface */
65
66   /* ICC Descriptor */
67   54,                     /* bLength: */
68   0x21,                   /* bDescriptorType: USBDESCR_ICC */
69   0x10, 0x01,             /* bcdCCID: revision 1.1 (of CCID) */
70   0,                      /* bMaxSlotIndex: */
71   1,                      /* bVoltageSupport: FIXED VALUE */
72   0x02, 0, 0, 0,          /* dwProtocols: T=1 */
73   0xf3, 0x0d, 0, 0,       /* dwDefaultClock: 3571 (non-ICCD): 3580 (ICCD) */
74   0xf3, 0x0d, 0, 0,       /* dwMaximumClock: 3571 (non-ICCD): 3580 (ICCD) */
75   1,                      /* bNumClockSupported: FIXED VALUE */
76   0x80, 0x25, 0, 0,       /* dwDataRate: 9600: FIXED VALUE */
77   0x80, 0x25, 0, 0,       /* dwMaxDataRate: 9600: FIXED VALUE */
78   1,                      /* bNumDataRateSupported: FIXED VALUE */
79   0xfe, 0, 0, 0,          /* dwMaxIFSD: 254 */
80   0, 0, 0, 0,             /* dwSynchProtocols: FIXED VALUE */
81   0, 0, 0, 0,             /* dwMechanical: FIXED VALUE */
82   /*
83    * According to Specification for USB ICCD (revision 1.0),
84    * dwFeatures should be 0x00040840.
85    *
86    * It is different now for better interaction to GPG's in-stock
87    * ccid-driver.
88    */
89   0x42, 0x08, 0x04, 0x00, /* dwFeatures (not ICCD):
90                            *  Short and extended APDU level: 0x40000 *
91                            *  (what? means ICCD?)          : 0x00800 *
92                            *  Automatic IFSD               : 0x00400
93                            *  NAD value other than 0x00    : 0x00200
94                            *  Can set ICC in clock stop    : 0x00100
95                            *  Automatic PPS CUR            : 0x00080
96                            *  Automatic PPS PROP           : 0x00040 *
97                            *  Auto baud rate change        : 0x00020
98                            *  Auto clock change            : 0x00010
99                            *  Auto voltage selection       : 0x00008
100                            *  Auto activaction of ICC      : 0x00004
101                            *  Automatic conf. based on ATR : 0x00002  g
102                            */
103   0x40, 0x01, 0, 0,       /* dwMaxCCIDMessageLength */
104   0xff,                   /* bClassGetResponse: */
105   0xff,                   /* bClassEnvelope: */
106   0, 0,                   /* wLCDLayout: FIXED VALUE */
107 #if defined(PINPAD_SUPPORT)
108 #if defined(PINPAD_CIR_SUPPORT)
109   1,                      /* bPinSupport: with PIN pad (verify) */
110 #elif defined(PINPAD_DIAL_SUPPORT)
111   3,                      /* bPinSupport: with PIN pad (verify, modify) */
112 #endif
113 #else
114   0,                      /* bPinSupport: No PIN pad */
115 #endif
116   1,                      /* bMaxCCIDBusySlots: 1 */
117   /*Endpoint 1 Descriptor*/
118   7,                           /* bLength: Endpoint Descriptor size */
119   USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
120   0x81,                         /* bEndpointAddress: (IN1) */
121   0x02,                         /* bmAttributes: Bulk */
122   USB_ICC_DATA_SIZE, 0x00,      /* wMaxPacketSize: */
123   0x00,                         /* bInterval */
124   /*Endpoint 2 Descriptor*/
125   7,                           /* bLength: Endpoint Descriptor size */
126   USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
127   0x02,                         /* bEndpointAddress: (OUT2) */
128   0x02,                         /* bmAttributes: Bulk */
129   USB_ICC_DATA_SIZE, 0x00,      /* wMaxPacketSize: */
130   0x00,                         /* bInterval */
131 #ifdef ENABLE_VIRTUAL_COM_PORT
132   /* Interface Descriptor */
133   9,                          /* bLength: Interface Descriptor size */
134   USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
135   0x01,           /* bInterfaceNumber: Number of Interface */
136   0x00,           /* bAlternateSetting: Alternate setting */
137   0x01,           /* bNumEndpoints: One endpoints used */
138   0x02,           /* bInterfaceClass: Communication Interface Class */
139   0x02,           /* bInterfaceSubClass: Abstract Control Model */
140   0x01,           /* bInterfaceProtocol: Common AT commands */
141   0x00,           /* iInterface: */
142   /*Header Functional Descriptor*/
143   5,                        /* bLength: Endpoint Descriptor size */
144   0x24,                     /* bDescriptorType: CS_INTERFACE */
145   0x00,                     /* bDescriptorSubtype: Header Func Desc */
146   0x10,                     /* bcdCDC: spec release number */
147   0x01,
148   /*Call Managment Functional Descriptor*/
149   5,        /* bFunctionLength */
150   0x24,     /* bDescriptorType: CS_INTERFACE */
151   0x01,     /* bDescriptorSubtype: Call Management Func Desc */
152   0x03,     /* bmCapabilities: D0+D1 */
153   0x02,     /* bDataInterface: 2 */
154   /*ACM Functional Descriptor*/
155   4,        /* bFunctionLength */
156   0x24,     /* bDescriptorType: CS_INTERFACE */
157   0x02,     /* bDescriptorSubtype: Abstract Control Management desc */
158   0x02,     /* bmCapabilities */
159   /*Union Functional Descriptor*/
160   5,             /* bFunctionLength */
161   0x24,          /* bDescriptorType: CS_INTERFACE */
162   0x06,          /* bDescriptorSubtype: Union func desc */
163   0x01,          /* bMasterInterface: Communication class interface */
164   0x02,          /* bSlaveInterface0: Data Class Interface */
165   /*Endpoint 4 Descriptor*/
166   7,                           /* bLength: Endpoint Descriptor size */
167   USB_ENDPOINT_DESCRIPTOR_TYPE,    /* bDescriptorType: Endpoint */
168   0x84,                            /* bEndpointAddress: (IN4) */
169   0x03,                            /* bmAttributes: Interrupt */
170   VIRTUAL_COM_PORT_INT_SIZE, 0x00, /* wMaxPacketSize: */
171   0xFF,                            /* bInterval: */
172
173   /*Data class interface descriptor*/
174   9,                           /* bLength: Endpoint Descriptor size */
175   USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
176   0x02,                    /* bInterfaceNumber: Number of Interface */
177   0x00,                    /* bAlternateSetting: Alternate setting */
178   0x02,                    /* bNumEndpoints: Two endpoints used */
179   0x0A,                    /* bInterfaceClass: CDC */
180   0x00,                    /* bInterfaceSubClass: */
181   0x00,                    /* bInterfaceProtocol: */
182   0x00,                    /* iInterface: */
183   /*Endpoint 5 Descriptor*/
184   7,                           /* bLength: Endpoint Descriptor size */
185   USB_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType: Endpoint */
186   0x05,                             /* bEndpointAddress: (OUT5) */
187   0x02,                             /* bmAttributes: Bulk */
188   VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */
189   0x00,                      /* bInterval: ignore for Bulk transfer */
190   /*Endpoint 3 Descriptor*/
191   7,                           /* bLength: Endpoint Descriptor size */
192   USB_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType: Endpoint */
193   0x83,                             /* bEndpointAddress: (IN3) */
194   0x02,                             /* bmAttributes: Bulk */
195   VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */
196   0x00                              /* bInterval */
197 #endif
198 };
199
200
201 /* USB String Descriptors */
202 static const uint8_t gnukStringLangID[] = {
203   4,                            /* bLength */
204   USB_STRING_DESCRIPTOR_TYPE,
205   0x09, 0x04                    /* LangID = 0x0409: US-English */
206 };
207
208 static const uint8_t gnukStringVendor[] = {
209   33*2+2,                       /* bLength */
210   USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType*/
211   /* Manufacturer: "Free Software Initiative of Japan" */
212   'F', 0, 'r', 0, 'e', 0, 'e', 0, ' ', 0, 'S', 0, 'o', 0, 'f', 0,
213   't', 0, 'w', 0, 'a', 0, 'r', 0, 'e', 0, ' ', 0, 'I', 0, 'n', 0,
214   'i', 0, 't', 0, 'i', 0, 'a', 0, 't', 0, 'i', 0, 'v', 0, 'e', 0,
215   ' ', 0, 'o', 0, 'f', 0, ' ', 0, 'J', 0, 'a', 0, 'p', 0, 'a', 0,
216   'n', 0
217 };
218
219 static const uint8_t gnukStringProduct[] = {
220   14*2+2,                       /* bLength */
221   USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */
222   /* Product name: "FSIJ USB Token" */
223   'F', 0, 'S', 0, 'I', 0, 'J', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0,
224   ' ', 0, 'T', 0, 'o', 0, 'k', 0, 'e', 0, 'n', 0
225 };
226
227 const uint8_t gnukStringSerial[] = {
228   13*2+2,                       /* bLength */
229   USB_STRING_DESCRIPTOR_TYPE,   /* bDescriptorType */
230   '0', 0, '.', 0, '1', 0, '5', 0, /* Version number of Gnuk */
231   '-', 0,
232   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
233   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
234 };
235
236
237 const ONE_DESCRIPTOR Device_Descriptor = {
238   (uint8_t*)gnukDeviceDescriptor,
239   sizeof (gnukDeviceDescriptor)
240 };
241
242 const ONE_DESCRIPTOR Config_Descriptor = {
243   (uint8_t*)gnukConfigDescriptor,
244   sizeof (gnukConfigDescriptor)
245 };
246
247 const ONE_DESCRIPTOR String_Descriptor[] = {
248   {(uint8_t*)gnukStringLangID, sizeof (gnukStringLangID)},
249   {(uint8_t*)gnukStringVendor, sizeof (gnukStringVendor)},
250   {(uint8_t*)gnukStringProduct, sizeof (gnukStringProduct)},
251   {(uint8_t*)gnukStringSerial, sizeof (gnukStringSerial)},
252 };