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
|
|
|
|
};
|
|
|
|
|
2011-05-11 01:56:36 +00:00
|
|
|
const uint8_t gnukStringSerial[] = {
|
|
|
|
13*2+2, /* bLength */
|
|
|
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
2011-10-07 02:01:21 +00:00
|
|
|
'0', 0, '.', 0, '1', 0, '4', 0, /* Version number of Gnuk */
|
2011-05-11 01:56:36 +00:00
|
|
|
'-', 0,
|
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
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-05-11 01:56:36 +00:00
|
|
|
const ONE_DESCRIPTOR String_Descriptor[] = {
|
2010-08-18 03:57:45 +00:00
|
|
|
{(uint8_t*)gnukStringLangID, sizeof (gnukStringLangID)},
|
|
|
|
{(uint8_t*)gnukStringVendor, sizeof (gnukStringVendor)},
|
|
|
|
{(uint8_t*)gnukStringProduct, sizeof (gnukStringProduct)},
|
2011-05-11 01:56:36 +00:00
|
|
|
{(uint8_t*)gnukStringSerial, sizeof (gnukStringSerial)},
|
2010-08-18 03:57:45 +00:00
|
|
|
};
|