Added support for Interrupt endpoint.

It is only used to inform the host changes on card status (insert or removal). Actually it only notifies the insertion of the virtual card on connect.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos 2023-02-17 19:43:26 +01:00
parent fc40588547
commit e44fde509b
No known key found for this signature in database
GPG key ID: C0095B7870A4CCD3
2 changed files with 22 additions and 8 deletions

View file

@ -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;

View file

@ -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;
}