gnuk/src/usb_desc.c

242 lines
9.1 KiB
C
Raw Normal View History

2010-08-18 03:57:45 +00:00
/*
2010-09-05 09:10:54 +00:00
* usb_desc.c - USB Descriptor
2010-08-18 03:57:45 +00:00
*/
2010-09-04 09:44:01 +00:00
#include "config.h"
2010-08-18 03:57:45 +00:00
#include "usb_lib.h"
#include "usb_desc.h"
#define USB_ICC_INTERFACE_CLASS 0x0B
#define USB_ICC_INTERFACE_SUBCLASS 0x00
#define USB_ICC_INTERFACE_BULK_PROTOCOL 0x00
#define USB_ICC_DATA_SIZE 64
/* USB Standard Device Descriptor */
static const uint8_t gnukDeviceDescriptor[] = {
18, /* bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */
0x00, 0x02, /* bcdUSB = 2.00 */
0x00, /* bDeviceClass: 0 means deferred to interface */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
0x40, /* bMaxPacketSize0 */
2010-09-05 09:10:54 +00:00
0x4b, 0x23, /* idVendor = 0x234b (FSIJ) */
0x00, 0x00, /* idProduct = 0x0000 (FSIJ USB Token) */
2010-08-18 03:57:45 +00:00
0x00, 0x02, /* bcdDevice = 2.00 */
1, /* Index of string descriptor describing manufacturer */
2, /* Index of string descriptor describing product */
3, /* Index of string descriptor describing the device's serial number */
0x01 /* bNumConfigurations */
};
2010-09-04 09:44:01 +00:00
#ifdef ENABLE_VIRTUAL_COM_PORT
#define W_TOTAL_LENGTH (9+9+54+7+7+9+5+5+4+5+7+9+7+7)
#define NUM_INTERFACES 3 /* two for CDC, one for GPG */
#else
#define W_TOTAL_LENGTH (9+9+54+7+7)
#define NUM_INTERFACES 1 /* GPG only */
#endif
2010-08-18 03:57:45 +00:00
/* Configuation Descriptor */
static const uint8_t gnukConfigDescriptor[] = {
9, /* bLength: Configuation Descriptor size */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
2010-09-04 09:44:01 +00:00
W_TOTAL_LENGTH, 0x00, /* wTotalLength:no of returned bytes */
NUM_INTERFACES, /* bNumInterfaces: */
2010-08-18 03:57:45 +00:00
0x01, /* bConfigurationValue: Configuration value */
0x00, /* iConfiguration: Index of string descriptor describing the configuration */
2010-11-12 14:19:27 +00:00
#if defined(USB_SELF_POWERED)
2010-08-18 03:57:45 +00:00
0xC0, /* bmAttributes: self powered */
2010-11-12 14:19:27 +00:00
#else
0x80, /* bmAttributes: bus powered */
#endif
2010-08-18 05:21:58 +00:00
50, /* MaxPower 100 mA */
2010-08-18 03:57:45 +00:00
/* Interface Descriptor */
9, /* bLength: Interface Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
2010-12-10 07:31:25 +00:00
0, /* bInterfaceNumber: Index of this interface */
2010-08-18 03:57:45 +00:00
0, /* Alternate setting for this interface */
2, /* bNumEndpoints: Bulk-IN, Bulk-OUT */
USB_ICC_INTERFACE_CLASS,
USB_ICC_INTERFACE_SUBCLASS,
USB_ICC_INTERFACE_BULK_PROTOCOL,
0, /* string index for interface */
/* ICC Descriptor */
54, /* bLength: */
0x21, /* bDescriptorType: USBDESCR_ICC */
2010-12-10 07:31:25 +00:00
0x10, 0x01, /* bcdCCID: revision 1.1 (of CCID) */
2010-08-18 03:57:45 +00:00
0, /* bMaxSlotIndex: */
1, /* bVoltageSupport: FIXED VALUE */
0x02, 0, 0, 0, /* dwProtocols: T=1 */
2010-12-10 07:31:25 +00:00
0xf3, 0x0d, 0, 0, /* dwDefaultClock: 3571 (non-ICCD): 3580 (ICCD) */
0xf3, 0x0d, 0, 0, /* dwMaximumClock: 3571 (non-ICCD): 3580 (ICCD) */
1, /* bNumClockSupported: FIXED VALUE */
0x80, 0x25, 0, 0, /* dwDataRate: 9600: FIXED VALUE */
0x80, 0x25, 0, 0, /* dwMaxDataRate: 9600: FIXED VALUE */
2010-08-18 03:57:45 +00:00
1, /* bNumDataRateSupported: FIXED VALUE */
2010-12-10 07:31:25 +00:00
0xfe, 0, 0, 0, /* dwMaxIFSD: 254 */
2010-08-18 03:57:45 +00:00
0, 0, 0, 0, /* dwSynchProtocols: FIXED VALUE */
0, 0, 0, 0, /* dwMechanical: FIXED VALUE */
2010-12-08 05:10:30 +00:00
/*
* According to Specification for USB ICCD (revision 1.0),
* dwFeatures should be 0x00040840.
*
* It is different now for better interaction to GPG's in-stock
* ccid-driver.
*/
2010-12-10 07:31:25 +00:00
0x42, 0x08, 0x04, 0x00, /* dwFeatures (not ICCD):
* Short and extended APDU level: 0x40000 *
* (what? means ICCD?) : 0x00800 *
2010-09-09 16:25:44 +00:00
* Automatic IFSD : 0x00400
2010-12-10 07:31:25 +00:00
* NAD value other than 0x00 : 0x00200
* Can set ICC in clock stop : 0x00100
2010-09-09 16:25:44 +00:00
* Automatic PPS CUR : 0x00080
2010-12-10 07:31:25 +00:00
* Automatic PPS PROP : 0x00040 *
* Auto baud rate change : 0x00020
* Auto clock change : 0x00010
* Auto voltage selection : 0x00008
* Auto activaction of ICC : 0x00004
* Automatic conf. based on ATR : 0x00002 g
2010-09-09 16:25:44 +00:00
*/
2010-12-07 05:34:25 +00:00
0x40, 0x01, 0, 0, /* dwMaxCCIDMessageLength */
2010-08-18 03:57:45 +00:00
0xff, /* bClassGetResponse: */
0xff, /* bClassEnvelope: */
0, 0, /* wLCDLayout: FIXED VALUE */
2011-01-04 12:06:55 +00:00
#if defined(PINPAD_SUPPORT)
2011-01-19 05:36:04 +00:00
#if defined(PINPAD_CIR_SUPPORT)
1, /* bPinSupport: with PIN pad (verify) */
#elif defined(PINPAD_DIAL_SUPPORT)
3, /* bPinSupport: with PIN pad (verify, modify) */
#endif
2011-01-04 12:06:55 +00:00
#else
2010-08-18 03:57:45 +00:00
0, /* bPinSupport: No PIN pad */
2011-01-04 12:06:55 +00:00
#endif
2010-08-18 03:57:45 +00:00
1, /* bMaxCCIDBusySlots: 1 */
2010-09-04 09:44:01 +00:00
/*Endpoint 1 Descriptor*/
2010-08-18 03:57:45 +00:00
7, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
2010-09-04 09:44:01 +00:00
0x81, /* bEndpointAddress: (IN1) */
2010-08-18 03:57:45 +00:00
0x02, /* bmAttributes: Bulk */
USB_ICC_DATA_SIZE, 0x00, /* wMaxPacketSize: */
0x00, /* bInterval */
2010-09-04 09:44:01 +00:00
/*Endpoint 2 Descriptor*/
2010-08-18 03:57:45 +00:00
7, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
2010-09-04 09:44:01 +00:00
0x02, /* bEndpointAddress: (OUT2) */
2010-08-18 03:57:45 +00:00
0x02, /* bmAttributes: Bulk */
USB_ICC_DATA_SIZE, 0x00, /* wMaxPacketSize: */
0x00, /* bInterval */
2010-09-04 09:44:01 +00:00
#ifdef ENABLE_VIRTUAL_COM_PORT
2010-08-18 03:57:45 +00:00
/* Interface Descriptor */
9, /* bLength: Interface Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
0x01, /* bInterfaceNumber: Number of Interface */
0x00, /* bAlternateSetting: Alternate setting */
0x01, /* bNumEndpoints: One endpoints used */
0x02, /* bInterfaceClass: Communication Interface Class */
0x02, /* bInterfaceSubClass: Abstract Control Model */
0x01, /* bInterfaceProtocol: Common AT commands */
0x00, /* iInterface: */
/*Header Functional Descriptor*/
5, /* bLength: Endpoint Descriptor size */
0x24, /* bDescriptorType: CS_INTERFACE */
0x00, /* bDescriptorSubtype: Header Func Desc */
0x10, /* bcdCDC: spec release number */
0x01,
/*Call Managment Functional Descriptor*/
5, /* bFunctionLength */
0x24, /* bDescriptorType: CS_INTERFACE */
0x01, /* bDescriptorSubtype: Call Management Func Desc */
2010-08-26 10:50:06 +00:00
0x03, /* bmCapabilities: D0+D1 */
2010-08-18 08:02:04 +00:00
0x02, /* bDataInterface: 2 */
2010-08-18 03:57:45 +00:00
/*ACM Functional Descriptor*/
4, /* bFunctionLength */
0x24, /* bDescriptorType: CS_INTERFACE */
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
0x02, /* bmCapabilities */
/*Union Functional Descriptor*/
5, /* bFunctionLength */
0x24, /* bDescriptorType: CS_INTERFACE */
0x06, /* bDescriptorSubtype: Union func desc */
2010-08-18 05:21:58 +00:00
0x01, /* bMasterInterface: Communication class interface */
0x02, /* bSlaveInterface0: Data Class Interface */
2010-09-04 09:44:01 +00:00
/*Endpoint 4 Descriptor*/
2010-08-18 03:57:45 +00:00
7, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
2010-09-04 09:44:01 +00:00
0x84, /* bEndpointAddress: (IN4) */
2010-08-18 03:57:45 +00:00
0x03, /* bmAttributes: Interrupt */
VIRTUAL_COM_PORT_INT_SIZE, 0x00, /* wMaxPacketSize: */
0xFF, /* bInterval: */
/*Data class interface descriptor*/
9, /* bLength: Endpoint Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
0x02, /* bInterfaceNumber: Number of Interface */
0x00, /* bAlternateSetting: Alternate setting */
0x02, /* bNumEndpoints: Two endpoints used */
0x0A, /* bInterfaceClass: CDC */
0x00, /* bInterfaceSubClass: */
0x00, /* bInterfaceProtocol: */
0x00, /* iInterface: */
2010-09-04 09:44:01 +00:00
/*Endpoint 5 Descriptor*/
2010-08-18 03:57:45 +00:00
7, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
2010-09-04 09:44:01 +00:00
0x05, /* bEndpointAddress: (OUT5) */
2010-08-18 03:57:45 +00:00
0x02, /* bmAttributes: Bulk */
VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */
0x00, /* bInterval: ignore for Bulk transfer */
2010-09-04 09:44:01 +00:00
/*Endpoint 3 Descriptor*/
2010-08-18 03:57:45 +00:00
7, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
2010-09-04 09:44:01 +00:00
0x83, /* bEndpointAddress: (IN3) */
2010-08-18 03:57:45 +00:00
0x02, /* bmAttributes: Bulk */
VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */
0x00 /* bInterval */
2010-09-04 09:44:01 +00:00
#endif
2010-08-18 03:57:45 +00:00
};
/* USB String Descriptors */
static const uint8_t gnukStringLangID[] = {
4, /* bLength */
USB_STRING_DESCRIPTOR_TYPE,
0x09, 0x04 /* LangID = 0x0409: US-English */
};
static const uint8_t gnukStringVendor[] = {
33*2+2, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
/* Manufacturer: "Free Software Initiative of Japan" */
'F', 0, 'r', 0, 'e', 0, 'e', 0, ' ', 0, 'S', 0, 'o', 0, 'f', 0,
't', 0, 'w', 0, 'a', 0, 'r', 0, 'e', 0, ' ', 0, 'I', 0, 'n', 0,
'i', 0, 't', 0, 'i', 0, 'a', 0, 't', 0, 'i', 0, 'v', 0, 'e', 0,
' ', 0, 'o', 0, 'f', 0, ' ', 0, 'J', 0, 'a', 0, 'p', 0, 'a', 0,
'n', 0
};
2010-09-04 09:44:01 +00:00
static const uint8_t gnukStringProduct[] = {
2010-08-18 03:57:45 +00:00
14*2+2, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
/* Product name: "FSIJ USB Token" */
'F', 0, 'S', 0, 'I', 0, 'J', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0,
' ', 0, 'T', 0, 'o', 0, 'k', 0, 'e', 0, 'n', 0
};
2010-09-04 09:44:01 +00:00
const ONE_DESCRIPTOR Device_Descriptor = {
2010-08-18 03:57:45 +00:00
(uint8_t*)gnukDeviceDescriptor,
sizeof (gnukDeviceDescriptor)
};
2010-09-04 04:48:26 +00:00
const ONE_DESCRIPTOR Config_Descriptor = {
2010-08-18 03:57:45 +00:00
(uint8_t*)gnukConfigDescriptor,
sizeof (gnukConfigDescriptor)
};
2011-01-07 07:18:47 +00:00
const ONE_DESCRIPTOR String_Descriptor[3] = {
2010-08-18 03:57:45 +00:00
{(uint8_t*)gnukStringLangID, sizeof (gnukStringLangID)},
{(uint8_t*)gnukStringVendor, sizeof (gnukStringVendor)},
{(uint8_t*)gnukStringProduct, sizeof (gnukStringProduct)},
};