diff --git a/src/usb/ccid/ccid.c b/src/usb/ccid/ccid.c index 12f072f..272cadb 100644 --- a/src/usb/ccid/ccid.c +++ b/src/usb/ccid/ccid.c @@ -101,6 +101,7 @@ struct ccid_header { uint8_t ccid_status = 1; static uint8_t itf_num; +extern tusb_desc_endpoint_t const desc_ep3; void ccid_write_offset(uint16_t size, uint16_t offset) { if (*usb_get_tx(ITF_CCID) + offset != 0x81) { @@ -268,8 +269,6 @@ uint8_t *driver_prepare_response_ccid() { static void ccid_init_cb(void) { TU_LOG1("-------- CCID INIT\r\n"); vendord_init(); - - //ccid_notify_slot_change(c); } static void ccid_reset_cb(uint8_t rhport) { @@ -288,11 +287,16 @@ static uint16_t ccid_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, //vendord_open expects a CLASS_VENDOR interface class memcpy(itf_vendor, itf_desc, sizeof(uint8_t) * max_len); ((tusb_desc_interface_t *) itf_vendor)->bInterfaceClass = TUSB_CLASS_VENDOR_SPECIFIC; - vendord_open(rhport, (tusb_desc_interface_t *) itf_vendor, max_len); + ((tusb_desc_interface_t *) itf_vendor)->bNumEndpoints -= 1; + vendord_open(rhport, (tusb_desc_interface_t *) itf_vendor, max_len-sizeof(tusb_desc_endpoint_t)); + TU_ASSERT(usbd_edpt_open(rhport, &desc_ep3), 0); free(itf_vendor); + uint8_t msg[] = {0x50, 0x03}; + usbd_edpt_xfer(rhport, desc_ep3.bEndpointAddress, msg, sizeof(msg)); + uint16_t const drv_len = sizeof(tusb_desc_interface_t) + sizeof(struct ccid_class_descriptor) + - 2 * sizeof(tusb_desc_endpoint_t); + 3 * sizeof(tusb_desc_endpoint_t); TU_VERIFY(max_len >= drv_len, 0); itf_num = itf_desc->bInterfaceNumber; diff --git a/src/usb/usb_descriptors.c b/src/usb/usb_descriptors.c index 74f0515..c673222 100644 --- a/src/usb/usb_descriptors.c +++ b/src/usb/usb_descriptors.c @@ -74,7 +74,7 @@ tusb_desc_configuration_t const desc_config = { .wTotalLength = (sizeof(tusb_desc_configuration_t) #ifdef USB_ITF_CCID + sizeof(tusb_desc_interface_t) + sizeof(struct ccid_class_descriptor) + - 2 * sizeof(tusb_desc_endpoint_t) + 3 * sizeof(tusb_desc_endpoint_t) #endif #ifdef USB_ITF_HID + TUD_HID_INOUT_DESC_LEN + TUD_HID_DESC_LEN @@ -120,7 +120,7 @@ tusb_desc_interface_t const desc_interface = { .bDescriptorType = TUSB_DESC_INTERFACE, .bInterfaceNumber = ITF_CCID, .bAlternateSetting = 0, - .bNumEndpoints = 2, + .bNumEndpoints = 3, .bInterfaceClass = TUSB_CLASS_SMART_CARD, .bInterfaceSubClass = 0, .bInterfaceProtocol = 0, @@ -139,17 +139,26 @@ tusb_desc_endpoint_t const desc_ep1 = { tusb_desc_endpoint_t const desc_ep2 = { .bLength = sizeof(tusb_desc_endpoint_t), .bDescriptorType = TUSB_DESC_ENDPOINT, - .bEndpointAddress = 2, + .bEndpointAddress = 1, .bmAttributes.xfer = TUSB_XFER_BULK, .wMaxPacketSize = (64), .bInterval = 0 }; + +tusb_desc_endpoint_t const desc_ep3 = { + .bLength = sizeof(tusb_desc_endpoint_t), + .bDescriptorType = TUSB_DESC_ENDPOINT, + .bEndpointAddress = TUSB_DIR_IN_MASK | 2, + .bmAttributes.xfer = TUSB_XFER_INTERRUPT, + .wMaxPacketSize = (64), + .bInterval = 0 +}; #endif static uint8_t desc_config_extended[sizeof(tusb_desc_configuration_t) #ifdef USB_ITF_CCID + sizeof(tusb_desc_interface_t) + - sizeof(struct ccid_class_descriptor) + 2 * + sizeof(struct ccid_class_descriptor) + 3 * sizeof(tusb_desc_endpoint_t) #endif #ifdef USB_ITF_HID @@ -213,6 +222,7 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { p += sizeof(struct ccid_class_descriptor); memcpy(p, &desc_ep1, sizeof(tusb_desc_endpoint_t)); p += sizeof(tusb_desc_endpoint_t); memcpy(p, &desc_ep2, sizeof(tusb_desc_endpoint_t)); p += sizeof(tusb_desc_endpoint_t); + memcpy(p, &desc_ep3, sizeof(tusb_desc_endpoint_t)); p += sizeof(tusb_desc_endpoint_t); #endif initd = 1; }