diff --git a/ChangeLog b/ChangeLog index fd21c49..305f668 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2016-03-08 Niibe Yutaka + + * tool/gnuk_token.py (gnuk_token.__init__, regnual.__init__): + Don't call setConfiguration method. + + * src/usb_lld.h (usb_cb_ctrl_write_finish): Change the API of + callback, which possibly needs INDEX, VALUE, and LEN parameters. + (usb_lld_set_data_to_recv): Fix the type of P. + (USB_DEVICE_DESCRIPTOR_TYPE, USB_CONFIGURATION_DESCRIPTOR_TYPE) + (USB_STRING_DESCRIPTOR_TYPE, USB_INTERFACE_DESCRIPTOR_TYPE) + (USB_ENDPOINT_DESCRIPTOR_TYPE): Remove, as we have the enumeration + values for same things. + + * src/usb_stm32f103.c (handle_in0): Follow the change. + * src/usb_ctrl.c (usb_cb_ctrl_write_finish): Likewise. + + * src/usb_desc.c (usb_cb_get_descriptor): Use HID_INTERFACE. + (device_desc, config_desc, string_descriptors) + (usb_cb_get_descriptor): Use the enumeration types. + * src/configure: Use the enumeration types. + + * regnual/regnual.c: Follow the change of usb_lld.h. + 2016-02-09 Niibe Yutaka * src/openpgp.c (cmd_verify): Support VERIFY reset, which is diff --git a/regnual/regnual.c b/regnual/regnual.c index 5693931..51e0283 100644 --- a/regnual/regnual.c +++ b/regnual/regnual.c @@ -1,7 +1,7 @@ /* * regnual.c -- Firmware installation for STM32F103 Flash ROM * - * Copyright (C) 2012, 2013, 2015 + * Copyright (C) 2012, 2013, 2015, 2016 * Free Software Initiative of Japan * Author: NIIBE Yutaka * @@ -51,7 +51,7 @@ static uint32_t flash_end; /* USB Standard Device Descriptor */ static const uint8_t regnual_device_desc[] = { 18, /* bLength */ - USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ + DEVICE_DESCRIPTOR, /* bDescriptorType */ 0x10, 0x01, /* bcdUSB = 1.1 */ 0xFF, /* bDeviceClass: VENDOR */ 0x00, /* bDeviceSubClass */ @@ -66,8 +66,8 @@ static const uint8_t regnual_device_desc[] = { static const uint8_t regnual_config_desc[] = { 9, - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - 18, 0, /* wTotalLength: no of returned bytes */ + CONFIG_DESCRIPTOR, /* bDescriptorType: Configuration */ + 18, 0, /* wTotalLength: no of returned bytes */ 1, /* bNumInterfaces: single vendor interface */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: None */ @@ -80,8 +80,8 @@ static const uint8_t regnual_config_desc[] = { /* Interface Descriptor */ 9, - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ - 0, /* bInterfaceNumber: Index of this interface */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: Interface */ + 0, /* bInterfaceNumber: Index of this interface */ 0, /* Alternate setting for this interface */ 0, /* bNumEndpoints: None */ 0xFF, @@ -92,7 +92,7 @@ static const uint8_t regnual_config_desc[] = { static const uint8_t regnual_string_lang_id[] = { 4, /* bLength */ - USB_STRING_DESCRIPTOR_TYPE, + STRING_DESCRIPTOR, 0x09, 0x04 /* LangID = 0x0409: US-English */ }; @@ -100,7 +100,7 @@ static const uint8_t regnual_string_lang_id[] = { static const uint8_t regnual_string_serial[] = { 8*2+2, - USB_STRING_DESCRIPTOR_TYPE, + STRING_DESCRIPTOR, /* FSIJ-0.0 */ 'F', 0, 'S', 0, 'I', 0, 'J', 0, '-', 0, '0', 0, '.', 0, '0', 0, @@ -173,29 +173,30 @@ static uint32_t calc_crc32 (void) } -void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value) +void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, + struct req_args *detail) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); if (type_rcp == (VENDOR_REQUEST | DEVICE_RECIPIENT) && USB_SETUP_SET (req)) { - if (req_no == USB_REGNUAL_SEND && value == 0) + if (req_no == USB_REGNUAL_SEND && detail->value == 0) result = calc_crc32 (); else if (req_no == USB_REGNUAL_FLASH) { - uint32_t dst_addr = (0x08000000 + value * 0x100); + uint32_t dst_addr = (0x08000000 + detail->value * 0x100); result = flash_write (dst_addr, (const uint8_t *)mem, 256); } - else if (req_no == USB_REGNUAL_PROTECT && value == 0) + else if (req_no == USB_REGNUAL_PROTECT && detail->value == 0) result = flash_protect (); - else if (req_no == USB_REGNUAL_FINISH && value == 0) + else if (req_no == USB_REGNUAL_FINISH && detail->value == 0) nvic_system_reset (); } } int -usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) +usb_cb_setup (uint8_t req, uint8_t req_no, struct req_args *detail) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); @@ -250,7 +251,7 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, - struct control_info *detail) + struct req_args *detail) { if (rcp != DEVICE_RECIPIENT) return USB_UNSUPPORT; @@ -310,7 +311,7 @@ int usb_cb_handle_event (uint8_t event_type, uint16_t value) return USB_UNSUPPORT; } -int usb_cb_interface (uint8_t cmd, struct control_info *detail) +int usb_cb_interface (uint8_t cmd, struct req_args *detail) { (void)cmd; (void)detail; return USB_UNSUPPORT; diff --git a/src/configure b/src/configure index 4a13faa..673d096 100755 --- a/src/configure +++ b/src/configure @@ -276,14 +276,14 @@ output_vendor_product_serial_strings () { echo "static const uint8_t ${prefix}string_vendor[] = {" echo " ${#VENDOR}*2+2, /* bLength */" - echo " USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Manufacturer: \"$VENDOR\" */" echo $VENDOR | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' echo echo "static const uint8_t ${prefix}string_product[] = {" echo " ${#PRODUCT}*2+2, /* bLength */" - echo " USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Product name: \"$PRODUCT\" */" echo $PRODUCT | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' @@ -292,7 +292,7 @@ output_vendor_product_serial_strings () { echo echo "uint8_t ${prefix}string_serial[] = {" echo " ${#SERIALNO}*2+2+16, /* bLength */" - echo " USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* Serial number: \"$SERIALNO\" */" echo $SERIALNO | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff," @@ -302,14 +302,14 @@ output_vendor_product_serial_strings () { echo '#ifdef USB_STRINGS_FOR_GNUK' echo "static const uint8_t ${prefix}revision_detail[] = {" echo " ${#REVISION}*2+2, /* bLength */" - echo " USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* revision detail: \"$REVISION\" */" echo $REVISION | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' echo echo "static const uint8_t ${prefix}config_options[] = {" echo " ${#CONFIG}*2+2, /* bLength */" - echo " USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */" + echo " STRING_DESCRIPTOR, /* bDescriptorType */" echo " /* configure options: \"$CONFIG\" */" echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p" echo '};' diff --git a/src/usb_ctrl.c b/src/usb_ctrl.c index 3dbe45c..d1815f7 100644 --- a/src/usb_ctrl.c +++ b/src/usb_ctrl.c @@ -1,7 +1,7 @@ /* * usb_ctrl.c - USB control pipe device specific code for Gnuk * - * Copyright (C) 2010, 2011, 2012, 2013, 2015 + * Copyright (C) 2010, 2011, 2012, 2013, 2015, 2016 * Free Software Initiative of Japan * Author: NIIBE Yutaka * @@ -61,12 +61,12 @@ static struct line_coding line_coding = { #define CDC_CTRL_DTR 0x0001 static int -vcom_port_data_setup (uint8_t req, uint8_t req_no, struct control_info *detail) +vcom_port_data_setup (uint8_t req, uint8_t req_no, struct req_args *arg) { if (USB_SETUP_GET (req)) { if (req_no == USB_CDC_REQ_GET_LINE_CODING) - return usb_lld_reply_request (&line_coding, sizeof(line_coding), detail); + return usb_lld_reply_request (&line_coding, sizeof(line_coding), arg); } else /* USB_SETUP_SET (req) */ { @@ -79,7 +79,7 @@ vcom_port_data_setup (uint8_t req, uint8_t req_no, struct control_info *detail) { uint8_t connected_saved = stdout.connected; - if ((detail->value & CDC_CTRL_DTR) != 0) + if ((arg->value & CDC_CTRL_DTR) != 0) { if (stdout.connected == 0) /* It's Open call */ @@ -264,7 +264,7 @@ static int download_check_crc32 (const uint32_t *end_p) } int -usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) +usb_cb_setup (uint8_t req, uint8_t req_no, struct req_args *arg) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); @@ -273,27 +273,29 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) if (USB_SETUP_GET (req)) { if (req_no == USB_FSIJ_GNUK_MEMINFO) - return usb_lld_reply_request (mem_info, sizeof (mem_info), detail); + return usb_lld_reply_request (mem_info, sizeof (mem_info), arg); } else /* SETUP_SET */ { - uint8_t *addr = (uint8_t *)(0x20000000 + detail->value * 0x100 + detail->index); + uint8_t *addr = (uint8_t *)(0x20000000 + arg->value * 0x100 + + arg->index); if (req_no == USB_FSIJ_GNUK_DOWNLOAD) { if (*icc_state_p != ICC_STATE_EXITED) return USB_UNSUPPORT; - if (addr < &_regnual_start || addr + detail->len > __heap_end__) + if (addr < &_regnual_start || addr + arg->len > __heap_end__) return USB_UNSUPPORT; - if (detail->index + detail->len < 256) - memset (addr + detail->index + detail->len, 0, 256 - (detail->index + detail->len)); + if (arg->index + arg->len < 256) + memset (addr + arg->index + arg->len, 0, + 256 - (arg->index + arg->len)); - usb_lld_set_data_to_recv (addr, detail->len); + usb_lld_set_data_to_recv (addr, arg->len); return USB_SUCCESS; } - else if (req_no == USB_FSIJ_GNUK_EXEC && detail->len == 0) + else if (req_no == USB_FSIJ_GNUK_EXEC && arg->len == 0) { if (*icc_state_p != ICC_STATE_EXITED) return USB_UNSUPPORT; @@ -303,28 +305,28 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) return download_check_crc32 ((uint32_t *)addr); } - else if (req_no == USB_FSIJ_GNUK_CARD_CHANGE && detail->len == 0) + else if (req_no == USB_FSIJ_GNUK_CARD_CHANGE && arg->len == 0) { - if (detail->value != 0 && detail->value != 1 && detail->value != 2) + if (arg->value != 0 && arg->value != 1 && arg->value != 2) return USB_UNSUPPORT; - ccid_card_change_signal (detail->value); + ccid_card_change_signal (arg->value); return USB_SUCCESS; } } } else if (type_rcp == (CLASS_REQUEST | INTERFACE_RECIPIENT)) { - if (detail->index == ICC_INTERFACE) + if (arg->index == ICC_INTERFACE) { if (USB_SETUP_GET (req)) { if (req_no == USB_CCID_REQ_GET_CLOCK_FREQUENCIES) return usb_lld_reply_request (freq_table, sizeof (freq_table), - detail); + arg); else if (req_no == USB_CCID_REQ_GET_DATA_RATES) return usb_lld_reply_request (data_rate_table, - sizeof (data_rate_table), detail); + sizeof (data_rate_table), arg); } else { @@ -335,24 +337,24 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) } } #ifdef HID_CARD_CHANGE_SUPPORT - else if (index == HID_INTERFACE) + else if (arg->index == HID_INTERFACE) { switch (req_no) { case USB_HID_REQ_GET_IDLE: - return usb_lld_reply_request (&hid_idle_rate, 1, detail); + return usb_lld_reply_request (&hid_idle_rate, 1, arg); case USB_HID_REQ_SET_IDLE: - usb_lld_set_data_to_recv (&hid_idle_rate, 1, detail); + usb_lld_set_data_to_recv (&hid_idle_rate, 1); return USB_SUCCESS; case USB_HID_REQ_GET_REPORT: /* Request of LED status and key press */ - return usb_lld_reply_request (&hid_report, 2, detail); + return usb_lld_reply_request (&hid_report, 2, arg); case USB_HID_REQ_SET_REPORT: /* Received LED set request */ - if (detail->len == 1) - usb_lld_set_data_to_recv (&hid_report, detail->len); + if (arg->len == 1) + usb_lld_set_data_to_recv (&hid_report, arg->len); return USB_SUCCESS; case USB_HID_REQ_GET_PROTOCOL: @@ -366,17 +368,17 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) } #endif #ifdef ENABLE_VIRTUAL_COM_PORT - else if (index == VCOM_INTERFACE_0) - return vcom_port_data_setup (req, req_no, detail); + else if (arg->index == VCOM_INTERFACE_0) + return vcom_port_data_setup (req, req_no, arg); #endif #ifdef PINPAD_DND_SUPPORT - else if (index == MSC_INTERFACE) + else if (arg->index == MSC_INTERFACE) { if (USB_SETUP_GET (req)) { if (req_no == MSC_GET_MAX_LUN_COMMAND) return usb_lld_reply_request (lun_table, sizeof (lun_table), - detail); + arg); } else if (req_no == MSC_MASS_STORAGE_RESET_COMMAND) @@ -391,7 +393,7 @@ usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) void -usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value) +usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, struct req_args *arg) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); @@ -402,7 +404,7 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value) if (*icc_state_p != ICC_STATE_EXITED) return; - (void)value; (void)index; + (void)arg; usb_lld_prepare_shutdown (); /* No further USB communication */ led_blink (LED_GNUK_EXEC); /* Notify the main. */ } @@ -410,7 +412,7 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value) #ifdef HID_CARD_CHANGE_SUPPORT else if (type_rcp == (CLASS_REQUEST | INTERFACE_RECIPIENT)) { - if (index == HID_INTERFACE && req_no == USB_HID_REQ_SET_REPORT) + if (arg->index == HID_INTERFACE && req_no == USB_HID_REQ_SET_REPORT) { if ((hid_report ^ hid_report_saved) & HID_LED_STATUS_CARDCHANGE) ccid_card_change_signal (CARD_CHANGE_TOGGLE); @@ -464,11 +466,11 @@ int usb_cb_handle_event (uint8_t event_type, uint16_t value) return USB_UNSUPPORT; } -int usb_cb_interface (uint8_t cmd, struct control_info *detail) +int usb_cb_interface (uint8_t cmd, struct req_args *arg) { const uint8_t zero = 0; - uint16_t interface = detail->index; - uint16_t alt = detail->value; + uint16_t interface = arg->index; + uint16_t alt = arg->value; if (interface >= NUM_INTERFACES) return USB_UNSUPPORT; @@ -485,7 +487,7 @@ int usb_cb_interface (uint8_t cmd, struct control_info *detail) } case USB_GET_INTERFACE: - return usb_lld_reply_request (&zero, 1, detail); + return usb_lld_reply_request (&zero, 1, arg); case USB_QUERY_INTERFACE: default: diff --git a/src/usb_desc.c b/src/usb_desc.c index 8db6f3e..361a605 100644 --- a/src/usb_desc.c +++ b/src/usb_desc.c @@ -61,7 +61,7 @@ static const uint8_t hid_report_desc[] = { /* USB Standard Device Descriptor */ static const uint8_t device_desc[] = { 18, /* bLength */ - USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ + DEVICE_DESCRIPTOR, /* bDescriptorType */ 0x10, 0x01, /* bcdUSB = 1.1 */ 0x00, /* bDeviceClass: 0 means deferred to interface */ 0x00, /* bDeviceSubClass */ @@ -101,9 +101,9 @@ static const uint8_t device_desc[] = { /* Configuation Descriptor */ static const uint8_t config_desc[] = { 9, /* bLength: Configuation Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - W_TOTAL_LENGTH, 0x00, /* wTotalLength:no of returned bytes */ - NUM_INTERFACES, /* bNumInterfaces: */ + CONFIG_DESCRIPTOR, /* bDescriptorType: Configuration */ + W_TOTAL_LENGTH, 0x00, /* wTotalLength:no of returned bytes */ + NUM_INTERFACES, /* bNumInterfaces: */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ USB_INITIAL_FEATURE, /* bmAttributes*/ @@ -111,7 +111,7 @@ static const uint8_t config_desc[] = { /* Interface Descriptor */ 9, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: Interface */ ICC_INTERFACE, /* bInterfaceNumber: Index of this interface */ 0, /* Alternate setting for this interface */ 3, /* bNumEndpoints: Bulk-IN, Bulk-OUT, Intr-IN */ @@ -167,21 +167,21 @@ static const uint8_t config_desc[] = { 1, /* bMaxCCIDBusySlots: 1 */ /*Endpoint IN1 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x81, /* bEndpointAddress: (IN1) */ 0x02, /* bmAttributes: Bulk */ USB_ICC_DATA_SIZE, 0x00, /* wMaxPacketSize: */ 0x00, /* bInterval */ /*Endpoint OUT1 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x01, /* bEndpointAddress: (OUT1) */ 0x02, /* bmAttributes: Bulk */ USB_ICC_DATA_SIZE, 0x00, /* wMaxPacketSize: */ 0x00, /* bInterval */ /*Endpoint IN2 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x82, /* bEndpointAddress: (IN2) */ 0x03, /* bmAttributes: Interrupt */ 0x04, 0x00, /* wMaxPacketSize: 4 */ @@ -190,7 +190,7 @@ static const uint8_t config_desc[] = { #ifdef HID_CARD_CHANGE_SUPPORT /* Interface Descriptor */ 9, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: Interface */ HID_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoint used */ @@ -209,7 +209,7 @@ static const uint8_t config_desc[] = { /*Endpoint IN7 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x87, /* bEndpointAddress: (IN7) */ 0x03, /* bmAttributes: Interrupt */ 0x02, 0x00, /* wMaxPacketSize: 2 */ @@ -219,7 +219,7 @@ static const uint8_t config_desc[] = { #ifdef ENABLE_VIRTUAL_COM_PORT /* Interface Descriptor */ 9, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: Interface */ VCOM_INTERFACE_0, /* bInterfaceNumber: Index of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ @@ -251,7 +251,7 @@ static const uint8_t config_desc[] = { VCOM_INTERFACE_1, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 4 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x84, /* bEndpointAddress: (IN4) */ 0x03, /* bmAttributes: Interrupt */ VIRTUAL_COM_PORT_INT_SIZE, 0x00, /* wMaxPacketSize: */ @@ -259,7 +259,7 @@ static const uint8_t config_desc[] = { /*Data class interface descriptor*/ 9, /* bLength: Endpoint Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: */ VCOM_INTERFACE_1, /* bInterfaceNumber: Index of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ @@ -269,14 +269,14 @@ static const uint8_t config_desc[] = { 0x00, /* iInterface: */ /*Endpoint 5 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x05, /* bEndpointAddress: (OUT5) */ 0x02, /* bmAttributes: Bulk */ VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */ 0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint 3 Descriptor*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x83, /* bEndpointAddress: (IN3) */ 0x02, /* bmAttributes: Bulk */ VIRTUAL_COM_PORT_DATA_SIZE, 0x00, /* wMaxPacketSize: */ @@ -285,7 +285,7 @@ static const uint8_t config_desc[] = { #ifdef PINPAD_DND_SUPPORT /* Interface Descriptor.*/ 9, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + INTERFACE_DESCRIPTOR, /* bDescriptorType: Interface */ MSC_INTERFACE, /* bInterfaceNumber. */ 0x00, /* bAlternateSetting. */ 0x02, /* bNumEndpoints. */ @@ -298,14 +298,14 @@ static const uint8_t config_desc[] = { 0x00, /* iInterface. */ /* Endpoint Descriptor.*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x86, /* bEndpointAddress: (IN6) */ 0x02, /* bmAttributes (Bulk). */ 0x40, 0x00, /* wMaxPacketSize. */ 0x00, /* bInterval (ignored for bulk). */ /* Endpoint Descriptor.*/ 7, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + ENDPOINT_DESCRIPTOR, /* bDescriptorType: Endpoint */ 0x06, /* bEndpointAddress: (OUT6) */ 0x02, /* bmAttributes (Bulk). */ 0x40, 0x00, /* wMaxPacketSize. */ @@ -317,7 +317,7 @@ static const uint8_t config_desc[] = { /* USB String Descriptors */ static const uint8_t gnuk_string_lang_id[] = { 4, /* bLength */ - USB_STRING_DESCRIPTOR_TYPE, + STRING_DESCRIPTOR, 0x09, 0x04 /* LangID = 0x0409: US-English */ }; @@ -346,20 +346,20 @@ static const struct desc string_descriptors[] = { int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, - struct control_info *detail) + struct req_args *arg) { if (rcp == DEVICE_RECIPIENT) { if (desc_type == DEVICE_DESCRIPTOR) - return usb_lld_reply_request (device_desc, sizeof (device_desc), detail); + return usb_lld_reply_request (device_desc, sizeof (device_desc), arg); else if (desc_type == CONFIG_DESCRIPTOR) - return usb_lld_reply_request (config_desc, sizeof (config_desc), detail); + return usb_lld_reply_request (config_desc, sizeof (config_desc), arg); else if (desc_type == STRING_DESCRIPTOR) { if (desc_index < NUM_STRING_DESC) return usb_lld_reply_request (string_descriptors[desc_index].desc, string_descriptors[desc_index].size, - detail); + arg); else if (desc_index == NUM_STRING_DESC) { uint8_t usbbuf[64]; @@ -375,22 +375,22 @@ usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, usbbuf[i*2+3] = 0; } usbbuf[0] = len = i*2 + 2; - usbbuf[1] = USB_STRING_DESCRIPTOR_TYPE; - return usb_lld_reply_request (usbbuf, len, detail); + usbbuf[1] = STRING_DESCRIPTOR; + return usb_lld_reply_request (usbbuf, len, arg); } } } #ifdef HID_CARD_CHANGE_SUPPORT else if (rcp == INTERFACE_RECIPIENT) { - if (detail->index == 1) + if (arg->index == HID_INTERFACE) { if (desc_type == USB_DT_HID) return usb_lld_reply_request (config_desc+ICC_TOTAL_LENGTH+9, 9, - detail); + arg); else if (desc_type == USB_DT_REPORT) return usb_lld_reply_request (hid_report_desc, HID_REPORT_DESC_SIZE, - detail); + arg); } } #endif diff --git a/src/usb_lld.h b/src/usb_lld.h index fd4bc08..34a1068 100644 --- a/src/usb_lld.h +++ b/src/usb_lld.h @@ -1,9 +1,3 @@ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - #define STANDARD_ENDPOINT_DESC_SIZE 0x09 /* endpoints enumeration */ @@ -24,7 +18,7 @@ enum RECIPIENT_TYPE { - DEVICE_RECIPIENT, /* Recipient device */ + DEVICE_RECIPIENT = 0, /* Recipient device */ INTERFACE_RECIPIENT, /* Recipient interface */ ENDPOINT_RECIPIENT, /* Recipient endpoint */ OTHER_RECIPIENT @@ -55,19 +49,20 @@ enum USB_SUCCESS = 1, }; -struct control_info { +struct req_args { uint16_t value; uint16_t index; uint16_t len; }; void usb_cb_device_reset (void); -int usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail); -int usb_cb_interface (uint8_t cmd, struct control_info *detail); +int usb_cb_setup (uint8_t req, uint8_t req_no, struct req_args *arg); +int usb_cb_interface (uint8_t cmd, struct req_args *arg); int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, - struct control_info *detail); + struct req_args *arg); int usb_cb_handle_event (uint8_t event_type, uint16_t value); -void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value); +void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, + struct req_args *arg); enum { USB_EVENT_ADDRESS, @@ -103,7 +98,7 @@ void usb_lld_txcpy (const void *src, int ep_num, int offset, size_t len); void usb_lld_tx_enable (int ep_num, size_t len); void usb_lld_write (uint8_t ep_num, const void *buf, size_t len); int usb_lld_reply_request (const void *buf, size_t buflen, - struct control_info *ctrl); + struct req_args *arg); void usb_lld_rx_enable (int ep_num); int usb_lld_rx_data_len (int ep_num); void usb_lld_rxcpy (uint8_t *dst, int ep_num, int offset, size_t len); @@ -114,7 +109,7 @@ void usb_lld_setup_endpoint (int ep_num, int ep_type, int ep_kind, void usb_lld_set_configuration (uint8_t config); uint8_t usb_lld_current_configuration (void); void usb_lld_set_feature (uint8_t feature); -void usb_lld_set_data_to_recv (const void *p, size_t len); +void usb_lld_set_data_to_recv (void *p, size_t len); void usb_lld_prepare_shutdown (void); void usb_lld_shutdown (void); diff --git a/src/usb_stm32f103.c b/src/usb_stm32f103.c index ac96dda..7df3841 100644 --- a/src/usb_stm32f103.c +++ b/src/usb_stm32f103.c @@ -62,6 +62,8 @@ struct DEVICE_INFO uint8_t bRequest; /**/ uint16_t value; + uint16_t index; + uint16_t len; }; static struct DEVICE_INFO device_info; @@ -462,26 +464,26 @@ static void handle_datastage_in (void) st103_ep_set_tx_status (ENDP0, EP_TX_VALID); } -typedef int (*HANDLER) (uint8_t req, struct control_info *detail); +typedef int (*HANDLER) (uint8_t req, struct req_args *arg); -static int std_none (uint8_t req, struct control_info *detail) +static int std_none (uint8_t req, struct req_args *arg) { - (void)req; (void)detail; + (void)req; (void)arg; return USB_UNSUPPORT; } -static int std_get_status (uint8_t req, struct control_info *detail) +static int std_get_status (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; uint16_t status_info = 0; - if (detail->value != 0 || detail->len != 2 || (detail->index >> 8) != 0 + if (arg->value != 0 || arg->len != 2 || (arg->index >> 8) != 0 || (req & REQUEST_DIR) == 0) return USB_UNSUPPORT; if (rcp == DEVICE_RECIPIENT) { - if (detail->index == 0) + if (arg->index == 0) { /* Get Device Status */ uint8_t feature = dev_p->current_feature; @@ -498,7 +500,7 @@ static int std_get_status (uint8_t req, struct control_info *detail) else /* Self-powered */ status_info &= ~1; - return usb_lld_reply_request (&status_info, 2, detail); + return usb_lld_reply_request (&status_info, 2, arg); } } else if (rcp == INTERFACE_RECIPIENT) @@ -508,21 +510,21 @@ static int std_get_status (uint8_t req, struct control_info *detail) if (dev_p->current_configuration == 0) return USB_UNSUPPORT; - r = usb_cb_interface (USB_QUERY_INTERFACE, detail); + r = usb_cb_interface (USB_QUERY_INTERFACE, arg); if (r != USB_SUCCESS) return USB_UNSUPPORT; - return usb_lld_reply_request (&status_info, 2, detail); + return usb_lld_reply_request (&status_info, 2, arg); } else if (rcp == ENDPOINT_RECIPIENT) { - uint8_t endpoint = (detail->index & 0x0f); + uint8_t endpoint = (arg->index & 0x0f); uint16_t status; - if ((detail->index & 0x70) || endpoint == ENDP0) + if ((arg->index & 0x70) || endpoint == ENDP0) return USB_UNSUPPORT; - if ((detail->index & 0x80)) + if ((arg->index & 0x80)) { status = st103_ep_get_tx_status (endpoint); if (status == 0) /* Disabled */ @@ -539,13 +541,13 @@ static int std_get_status (uint8_t req, struct control_info *detail) status_info |= 1; /* OUT Endpoint stalled */ } - return usb_lld_reply_request (&status_info, 2, detail); + return usb_lld_reply_request (&status_info, 2, arg); } return USB_UNSUPPORT; } -static int std_clear_feature (uint8_t req, struct control_info *detail) +static int std_clear_feature (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; @@ -554,10 +556,10 @@ static int std_clear_feature (uint8_t req, struct control_info *detail) if (rcp == DEVICE_RECIPIENT) { - if (detail->len != 0 || detail->index != 0) + if (arg->len != 0 || arg->index != 0) return USB_UNSUPPORT; - if (detail->value == DEVICE_REMOTE_WAKEUP) + if (arg->value == DEVICE_REMOTE_WAKEUP) { dev_p->current_feature &= ~(1 << 5); return USB_SUCCESS; @@ -565,17 +567,17 @@ static int std_clear_feature (uint8_t req, struct control_info *detail) } else if (rcp == ENDPOINT_RECIPIENT) { - uint8_t endpoint = (detail->index & 0x0f); + uint8_t endpoint = (arg->index & 0x0f); uint16_t status; if (dev_p->current_configuration == 0) return USB_UNSUPPORT; - if (detail->len != 0 || (detail->index >> 8) != 0 - || detail->value != ENDPOINT_STALL || endpoint == ENDP0) + if (arg->len != 0 || (arg->index >> 8) != 0 + || arg->value != ENDPOINT_STALL || endpoint == ENDP0) return USB_UNSUPPORT; - if ((detail->index & 0x80)) + if ((arg->index & 0x80)) status = st103_ep_get_tx_status (endpoint); else status = st103_ep_get_rx_status (endpoint); @@ -583,7 +585,7 @@ static int std_clear_feature (uint8_t req, struct control_info *detail) if (status == 0) /* Disabled */ return USB_UNSUPPORT; - if (detail->index & 0x80) /* IN endpoint */ + if (arg->index & 0x80) /* IN endpoint */ st103_ep_clear_dtog_tx (endpoint); else /* OUT endpoint */ st103_ep_clear_dtog_rx (endpoint); @@ -595,7 +597,7 @@ static int std_clear_feature (uint8_t req, struct control_info *detail) return USB_UNSUPPORT; } -static int std_set_feature (uint8_t req, struct control_info *detail) +static int std_set_feature (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; @@ -604,10 +606,10 @@ static int std_set_feature (uint8_t req, struct control_info *detail) if (rcp == DEVICE_RECIPIENT) { - if (detail->len != 0 || detail->index != 0) + if (arg->len != 0 || arg->index != 0) return USB_UNSUPPORT; - if (detail->value == DEVICE_REMOTE_WAKEUP) + if (arg->value == DEVICE_REMOTE_WAKEUP) { dev_p->current_feature |= 1 << 5; // event?? @@ -616,17 +618,17 @@ static int std_set_feature (uint8_t req, struct control_info *detail) } else if (rcp == ENDPOINT_RECIPIENT) { - uint8_t endpoint = (detail->index & 0x0f); + uint8_t endpoint = (arg->index & 0x0f); uint32_t status; if (dev_p->current_configuration == 0) return USB_UNSUPPORT; - if (detail->len != 0 || (detail->index >> 8) != 0 - || detail->value != 0 || endpoint == ENDP0) + if (arg->len != 0 || (arg->index >> 8) != 0 + || arg->value != 0 || endpoint == ENDP0) return USB_UNSUPPORT; - if ((detail->index & 0x80)) + if ((arg->index & 0x80)) status = st103_ep_get_tx_status (endpoint); else status = st103_ep_get_rx_status (endpoint); @@ -634,7 +636,7 @@ static int std_set_feature (uint8_t req, struct control_info *detail) if (status == 0) /* Disabled */ return USB_UNSUPPORT; - if (detail->index & 0x80) + if (arg->index & 0x80) /* IN endpoint */ st103_ep_set_tx_status (endpoint, EP_TX_STALL); else @@ -648,59 +650,58 @@ static int std_set_feature (uint8_t req, struct control_info *detail) return USB_UNSUPPORT; } -static int std_set_address (uint8_t req, struct control_info *detail) +static int std_set_address (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; if ((req & REQUEST_DIR) == 1) return USB_UNSUPPORT; - if (rcp == DEVICE_RECIPIENT && detail->len == 0 && detail->value <= 127 - && detail->index == 0 && dev_p->current_configuration == 0) + if (rcp == DEVICE_RECIPIENT && arg->len == 0 && arg->value <= 127 + && arg->index == 0 && dev_p->current_configuration == 0) return USB_SUCCESS; return USB_UNSUPPORT; } -static int std_get_descriptor (uint8_t req, struct control_info *detail) +static int std_get_descriptor (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; if ((req & REQUEST_DIR) == 0) return USB_UNSUPPORT; - return usb_cb_get_descriptor (rcp, (detail->value >> 8), - (detail->value & 0xff), detail); + return usb_cb_get_descriptor (rcp, (arg->value >> 8), + (arg->value & 0xff), arg); } -static int std_get_configuration (uint8_t req, struct control_info *detail) +static int std_get_configuration (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; - (void)detail; if ((req & REQUEST_DIR) == 0) return USB_UNSUPPORT; if (rcp == DEVICE_RECIPIENT) - return usb_lld_reply_request (&dev_p->current_configuration, 1, detail); + return usb_lld_reply_request (&dev_p->current_configuration, 1, arg); return USB_UNSUPPORT; } -static int std_set_configuration (uint8_t req, struct control_info *detail) +static int std_set_configuration (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; if ((req & REQUEST_DIR) == 1) return USB_UNSUPPORT; - if (rcp == DEVICE_RECIPIENT && detail->index == 0 && detail->len == 0) - return usb_cb_handle_event (USB_EVENT_CONFIG, detail->value); + if (rcp == DEVICE_RECIPIENT && arg->index == 0 && arg->len == 0) + return usb_cb_handle_event (USB_EVENT_CONFIG, arg->value); return USB_UNSUPPORT; } -static int std_get_interface (uint8_t req, struct control_info *detail) +static int std_get_interface (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; @@ -709,35 +710,34 @@ static int std_get_interface (uint8_t req, struct control_info *detail) if (rcp == INTERFACE_RECIPIENT) { - if (detail->value != 0 || (detail->index >> 8) != 0 || detail->len != 1) + if (arg->value != 0 || (arg->index >> 8) != 0 || arg->len != 1) return USB_UNSUPPORT; if (dev_p->current_configuration == 0) return USB_UNSUPPORT; - return usb_cb_interface (USB_GET_INTERFACE, detail); + return usb_cb_interface (USB_GET_INTERFACE, arg); } return USB_UNSUPPORT; } -static int std_set_interface (uint8_t req, struct control_info *detail) +static int std_set_interface (uint8_t req, struct req_args *arg) { uint8_t rcp = req & RECIPIENT; if ((req & REQUEST_DIR) == 1 || rcp != INTERFACE_RECIPIENT - || detail->len != 0 || (detail->index >> 8) != 0 - || (detail->value >> 8) != 0 || dev_p->current_configuration == 0) + || arg->len != 0 || (arg->index >> 8) != 0 + || (arg->value >> 8) != 0 || dev_p->current_configuration == 0) return USB_UNSUPPORT; - return usb_cb_interface (USB_SET_INTERFACE, detail); + return usb_cb_interface (USB_SET_INTERFACE, arg); } static void handle_setup0 (void) { const uint16_t *pw; - struct control_info ctrl; uint16_t w; uint8_t req_no; int r = USB_UNSUPPORT; @@ -749,11 +749,11 @@ static void handle_setup0 (void) dev_p->bmRequestType = w & 0xff; dev_p->bRequest = req_no = w >> 8; pw++; - ctrl.value = *pw++; + dev_p->value = *pw++; pw++; - ctrl.index = *pw++; + dev_p->index = *pw++; pw++; - ctrl.len = *pw; + dev_p->len = *pw; data_p->addr = NULL; data_p->len = 0; @@ -777,11 +777,13 @@ static void handle_setup0 (void) default: handler = std_none; break; } - r = (*handler) (dev_p->bmRequestType, &ctrl); + r = (*handler) (dev_p->bmRequestType, + (struct req_args *)&dev_p->value); } } else - r = usb_cb_setup (dev_p->bmRequestType, req_no, &ctrl); + r = usb_cb_setup (dev_p->bmRequestType, req_no, + (struct req_args *)&dev_p->value); if (r != USB_SUCCESS) dev_p->state = STALLED; @@ -789,8 +791,7 @@ static void handle_setup0 (void) { if (USB_SETUP_SET (dev_p->bmRequestType)) { - dev_p->value = ctrl.value; - if (ctrl.len == 0) + if (dev_p->len == 0) { dev_p->state = WAIT_STATUS_IN; st103_set_tx_count (ENDP0, 0); @@ -819,8 +820,8 @@ static void handle_in0 (void) usb_cb_handle_event (USB_EVENT_ADDRESS, dev_p->value); } else - usb_cb_ctrl_write_finish (dev_p->bmRequestType, dev_p->bRequest, - dev_p->value); + usb_cb_ctrl_write_finish (dev_p->bmRequestType, dev_p->bRequest, + (struct req_args *)&dev_p->value); dev_p->state = STALLED; } @@ -1042,9 +1043,9 @@ void usb_lld_set_feature (uint8_t feature) dev_p->current_feature = feature; } -void usb_lld_set_data_to_recv (const void *p, size_t len) +void usb_lld_set_data_to_recv (void *p, size_t len) { - data_p->addr = (uint8_t *)p; + data_p->addr = p; data_p->len = len; } @@ -1129,7 +1130,7 @@ void usb_lld_from_pmabuf (void *dst, uint16_t addr, size_t n) * BUFLEN: size of the data. */ int -usb_lld_reply_request (const void *buf, size_t buflen, struct control_info *ctl) +usb_lld_reply_request (const void *buf, size_t buflen, struct req_args *ctl) { uint32_t len_asked = ctl->len; uint32_t len; diff --git a/tool/gnuk_token.py b/tool/gnuk_token.py index e739a1b..ad3ce9c 100644 --- a/tool/gnuk_token.py +++ b/tool/gnuk_token.py @@ -67,7 +67,6 @@ class gnuk_token(object): if interface.interfaceSubClass != CCID_SUBCLASS: raise ValueError("Wrong interface sub class") self.__devhandle = device.open() - self.__devhandle.setConfiguration(configuration.value) self.__devhandle.claimInterface(interface) self.__devhandle.setAltInterface(0) @@ -473,10 +472,6 @@ class regnual(object): if intf.interfaceClass != 0xff: raise ValueError("Wrong interface class") self.__devhandle = dev.open() - try: - self.__devhandle.setConfiguration(conf) - except: - pass self.__devhandle.claimInterface(intf) self.__devhandle.setAltInterface(0)