From 218441a45a50993c585ad74b3d0a632d2cf1124e Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 19 Jun 2024 23:28:55 +0200 Subject: [PATCH] Added support for enable/disable Web CCID on the fly. Signed-off-by: Pol Henarejos --- src/main.c | 7 ++++++- src/usb/usb.c | 2 +- src/usb/usb_descriptors.c | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index ec3554e..30eb76c 100644 --- a/src/main.c +++ b/src/main.c @@ -364,7 +364,9 @@ pico_unique_board_id_t pico_serial; #include "tinyusb.h" #include "esp_efuse.h" #define pico_get_unique_board_id(a) do { uint32_t value; esp_efuse_read_block(EFUSE_BLK1, &value, 0, 32); memcpy((uint8_t *)(a), &value, sizeof(uint32_t)); esp_efuse_read_block(EFUSE_BLK1, &value, 32, 32); memcpy((uint8_t *)(a)+4, &value, sizeof(uint32_t)); } while(0) -extern const tinyusb_config_t tusb_cfg; +extern tinyusb_config_t tusb_cfg; +extern bool enable_wcid; +extern const uint8_t desc_config[]; TaskHandle_t hcore0 = NULL, hcore1 = NULL; int app_main() { #else @@ -417,6 +419,9 @@ int main(void) { usb_init(); #ifdef ESP_PLATFORM tusb_cfg.string_descriptor[3] = pico_serial_str; + if (enable_wcid) { + tusb_cfg.configuration_descriptor = desc_config; + } tinyusb_driver_install(&tusb_cfg); #else tusb_init(); diff --git a/src/usb/usb.c b/src/usb/usb.c index ab1a0af..bd7e236 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -162,7 +162,7 @@ queue_t card_to_usb_q; #ifndef ENABLE_EMULATION extern tusb_desc_device_t desc_device; -bool enable_wcid = false; +extern bool enable_wcid; #endif void usb_init() { #ifndef ENABLE_EMULATION diff --git a/src/usb/usb_descriptors.c b/src/usb/usb_descriptors.c index 4c6ab4e..0c9f045 100644 --- a/src/usb/usb_descriptors.c +++ b/src/usb/usb_descriptors.c @@ -40,6 +40,8 @@ #define MAX_USB_POWER 1 +bool enable_wcid = false; + //--------------------------------------------------------------------+ // Device Descriptors //--------------------------------------------------------------------+ @@ -80,12 +82,18 @@ uint8_t const *tud_descriptor_device_cb(void) { #define TUSB_SMARTCARD_WCID_DESC_LEN (TUD_INTERFACE_DESC_LEN + TUSB_SMARTCARD_LEN + 2 * TUD_ENDPOINT_DESC_LEN) enum { - TUSB_DESC_TOTAL_LEN = TUD_CONFIG_DESC_LEN + TUSB_DESC_TOTAL_LEN_NOWCID = TUD_CONFIG_DESC_LEN #ifdef USB_ITF_HID + TUD_HID_INOUT_DESC_LEN + TUD_HID_DESC_LEN #endif #ifdef USB_ITF_CCID + TUSB_SMARTCARD_CCID_DESC_LEN +#endif +}; + +enum { + TUSB_DESC_TOTAL_LEN = TUSB_DESC_TOTAL_LEN_NOWCID +#ifdef USB_ITF_CCID #ifdef USB_ITF_WCID + TUSB_SMARTCARD_WCID_DESC_LEN #endif @@ -118,6 +126,17 @@ uint8_t const desc_hid_report_kb[] = { 7, TUSB_DESC_ENDPOINT, _epint, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), 0 #endif +const uint8_t desc_config_nowcid[] = { + TUD_CONFIG_DESCRIPTOR(1, ITF_TOTAL-1, 4, TUSB_DESC_TOTAL_LEN_NOWCID, USB_CONFIG_ATT_ONE | TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), +#ifdef USB_ITF_HID + TUD_HID_INOUT_DESCRIPTOR(ITF_HID, ITF_HID + 5, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, TUSB_DIR_IN_MASK | EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10), + TUD_HID_DESCRIPTOR(ITF_KEYBOARD, ITF_KEYBOARD + 5, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report_kb), TUSB_DIR_IN_MASK | (EPNUM_HID + 1), 16, 5), +#endif +#ifdef USB_ITF_CCID + TUD_SMARTCARD_DESCRIPTOR(ITF_CCID, ITF_CCID+5, 1, TUSB_DIR_IN_MASK | 1, TUSB_DIR_IN_MASK | 2, 64), +#endif +}; + const uint8_t desc_config[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_TOTAL, 4, TUSB_DESC_TOTAL_LEN, USB_CONFIG_ATT_ONE | TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), #ifdef USB_ITF_HID @@ -149,8 +168,10 @@ uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) { #ifndef ESP_PLATFORM uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { (void) index; // for multiple configurations - printf("tud_descriptor_configuration_cb %d\n",index); - return desc_config; + if (enable_wcid) { + return desc_config; + } + return desc_config_nowcid; } #endif @@ -254,7 +275,10 @@ uint8_t const desc_bos[] = { }; uint8_t const *tud_descriptor_bos_cb(void) { - return desc_bos; + if (enable_wcid) { + return desc_bos; + } + return NULL; } #endif //--------------------------------------------------------------------+ @@ -281,12 +305,12 @@ char const *string_desc_arr [] = { }; #ifdef ESP_PLATFORM -const tinyusb_config_t tusb_cfg = { +tinyusb_config_t tusb_cfg = { .device_descriptor = &desc_device, .string_descriptor = string_desc_arr, .string_descriptor_count = sizeof(string_desc_arr) / sizeof(string_desc_arr[0]), .external_phy = false, - .configuration_descriptor = desc_config, + .configuration_descriptor = desc_config_nowcid, }; #else static uint16_t _desc_str[32];