mirror of
https://github.com/polhenarejos/pico-keys-sdk
synced 2026-05-28 00:51:25 +02:00
Enable each USB interface independently depending on PHY parameters.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -122,6 +122,9 @@ uint8_t sc_itf_to_usb_itf(uint8_t itf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ccid_init_buffers() {
|
void ccid_init_buffers() {
|
||||||
|
if (ITF_SC_TOTAL == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (ccid_rx == NULL) {
|
if (ccid_rx == NULL) {
|
||||||
ccid_rx = (usb_buffer_t *)calloc(ITF_SC_TOTAL, sizeof(usb_buffer_t));
|
ccid_rx = (usb_buffer_t *)calloc(ITF_SC_TOTAL, sizeof(usb_buffer_t));
|
||||||
}
|
}
|
||||||
@@ -170,11 +173,6 @@ void tud_vendor_rx_cb(uint8_t itf, const uint8_t *buffer, uint16_t bufsize) {
|
|||||||
} while (len > 0);
|
} while (len > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tud_vendor_tx_cb(uint8_t itf, uint32_t sent_bytes) {
|
|
||||||
(void) sent_bytes;
|
|
||||||
tud_vendor_n_write_flush(itf);
|
|
||||||
}
|
|
||||||
|
|
||||||
int driver_write_ccid(uint8_t itf, const uint8_t *tx_buffer, uint16_t buffer_size) {
|
int driver_write_ccid(uint8_t itf, const uint8_t *tx_buffer, uint16_t buffer_size) {
|
||||||
if (*tx_buffer != 0x81) {
|
if (*tx_buffer != 0x81) {
|
||||||
DEBUG_PAYLOAD(tx_buffer, buffer_size);
|
DEBUG_PAYLOAD(tx_buffer, buffer_size);
|
||||||
@@ -346,16 +344,17 @@ void ccid_task() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ENABLE_EMULATION
|
|
||||||
|
|
||||||
#define USB_CONFIG_ATT_ONE TU_BIT(7)
|
|
||||||
|
|
||||||
#define MAX_USB_POWER 1
|
|
||||||
|
|
||||||
void ccid_init() {
|
void ccid_init() {
|
||||||
ccid_init_buffers();
|
ccid_init_buffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ENABLE_EMULATION
|
||||||
|
|
||||||
|
void tud_vendor_tx_cb(uint8_t itf, uint32_t sent_bytes) {
|
||||||
|
(void) sent_bytes;
|
||||||
|
tud_vendor_n_write_flush(itf);
|
||||||
|
}
|
||||||
|
|
||||||
static void ccid_init_cb(void) {
|
static void ccid_init_cb(void) {
|
||||||
vendord_init();
|
vendord_init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -303,28 +303,24 @@ uint16_t emul_read(uint8_t itf) {
|
|||||||
driver_write_emul(itf, ccid_atr ? ccid_atr + 1 : NULL, ccid_atr ? ccid_atr[0] : 0);
|
driver_write_emul(itf, ccid_atr ? ccid_atr + 1 : NULL, ccid_atr ? ccid_atr[0] : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
switch(itf) {
|
|
||||||
#ifdef USB_ITF_CCID
|
#ifdef USB_ITF_CCID
|
||||||
case ITF_CCID: {
|
else if (itf == ITF_CCID) {
|
||||||
uint16_t sent = 0;
|
uint16_t sent = 0;
|
||||||
DEBUG_PAYLOAD(emul_rx, len);
|
DEBUG_PAYLOAD(emul_rx, len);
|
||||||
apdu.rdata = emul_tx;
|
apdu.rdata = emul_tx;
|
||||||
if ((sent = apdu_process(itf, emul_rx, len)) > 0) {
|
if ((sent = apdu_process(itf, emul_rx, len)) > 0) {
|
||||||
process_apdu();
|
process_apdu();
|
||||||
apdu_finish();
|
apdu_finish();
|
||||||
}
|
|
||||||
if (sent > 0) {
|
|
||||||
uint16_t ret = apdu_next();
|
|
||||||
DEBUG_PAYLOAD(apdu.rdata, ret);
|
|
||||||
driver_write_emul(itf, apdu.rdata, ret);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (sent > 0) {
|
||||||
|
uint16_t ret = apdu_next();
|
||||||
|
DEBUG_PAYLOAD(apdu.rdata, ret);
|
||||||
|
driver_write_emul(itf, apdu.rdata, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
default:
|
else {
|
||||||
emul_rx_size += valread;
|
emul_rx_size += valread;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return (uint16_t)emul_rx_size;
|
return (uint16_t)emul_rx_size;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ int driver_write_hid(uint8_t itf, const uint8_t *buffer, uint16_t buffer_size);
|
|||||||
int driver_process_usb_nopacket_hid();
|
int driver_process_usb_nopacket_hid();
|
||||||
|
|
||||||
void hid_init() {
|
void hid_init() {
|
||||||
|
if (ITF_HID_TOTAL == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (send_buffer_size == NULL) {
|
if (send_buffer_size == NULL) {
|
||||||
send_buffer_size = (uint16_t *)calloc(ITF_HID_TOTAL, sizeof(uint16_t));
|
send_buffer_size = (uint16_t *)calloc(ITF_HID_TOTAL, sizeof(uint16_t));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,15 +45,15 @@ static mutex_t mutex;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
uint8_t ITF_HID_CTAP = 0, ITF_HID_KB = 0;
|
uint8_t ITF_HID_CTAP = ITF_INVALID, ITF_HID_KB = ITF_INVALID;
|
||||||
uint8_t ITF_HID = 0, ITF_KEYBOARD = 0;
|
uint8_t ITF_HID = ITF_INVALID, ITF_KEYBOARD = ITF_INVALID;
|
||||||
uint8_t ITF_HID_TOTAL = 0;
|
uint8_t ITF_HID_TOTAL = 0;
|
||||||
extern void hid_init();
|
extern void hid_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USB_ITF_CCID
|
#ifdef USB_ITF_CCID
|
||||||
uint8_t ITF_SC_CCID = 0, ITF_SC_WCID = 0;
|
uint8_t ITF_SC_CCID = ITF_INVALID, ITF_SC_WCID = ITF_INVALID;
|
||||||
uint8_t ITF_CCID = 0, ITF_WCID = 0;
|
uint8_t ITF_CCID = ITF_INVALID, ITF_WCID = ITF_INVALID;
|
||||||
uint8_t ITF_SC_TOTAL = 0;
|
uint8_t ITF_SC_TOTAL = 0;
|
||||||
extern void ccid_init();
|
extern void ccid_init();
|
||||||
#endif
|
#endif
|
||||||
@@ -80,6 +80,13 @@ void usb_init() {
|
|||||||
queue_init(&card_to_usb_q, sizeof(uint32_t), 64);
|
queue_init(&card_to_usb_q, sizeof(uint32_t), 64);
|
||||||
queue_init(&usb_to_card_q, sizeof(uint32_t), 64);
|
queue_init(&usb_to_card_q, sizeof(uint32_t), 64);
|
||||||
|
|
||||||
|
uint8_t enabled_usb_itf = PHY_USB_ITF_CCID | PHY_USB_ITF_WCID | PHY_USB_ITF_HID | PHY_USB_ITF_KB;
|
||||||
|
#ifndef ENABLE_EMULATION
|
||||||
|
if (phy_data.enabled_usb_itf_present) {
|
||||||
|
enabled_usb_itf = phy_data.enabled_usb_itf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
ITF_HID_TOTAL = 0;
|
ITF_HID_TOTAL = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -88,21 +95,21 @@ void usb_init() {
|
|||||||
#endif
|
#endif
|
||||||
ITF_TOTAL = 0;
|
ITF_TOTAL = 0;
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
if (1) {
|
if (enabled_usb_itf & PHY_USB_ITF_HID) {
|
||||||
ITF_HID_CTAP = ITF_HID_TOTAL++;
|
ITF_HID_CTAP = ITF_HID_TOTAL++;
|
||||||
ITF_HID = ITF_TOTAL++;
|
ITF_HID = ITF_TOTAL++;
|
||||||
}
|
}
|
||||||
if (1) {
|
if (enabled_usb_itf & PHY_USB_ITF_KB) {
|
||||||
ITF_HID_KB = ITF_HID_TOTAL++;
|
ITF_HID_KB = ITF_HID_TOTAL++;
|
||||||
ITF_KEYBOARD = ITF_TOTAL++;
|
ITF_KEYBOARD = ITF_TOTAL++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_ITF_CCID
|
#ifdef USB_ITF_CCID
|
||||||
if (1) {
|
if (enabled_usb_itf & PHY_USB_ITF_CCID) {
|
||||||
ITF_SC_CCID = ITF_SC_TOTAL++;
|
ITF_SC_CCID = ITF_SC_TOTAL++;
|
||||||
ITF_CCID = ITF_TOTAL++;
|
ITF_CCID = ITF_TOTAL++;
|
||||||
}
|
}
|
||||||
if (1) {
|
if (enabled_usb_itf & PHY_USB_ITF_WCID) {
|
||||||
ITF_SC_WCID = ITF_SC_TOTAL++;
|
ITF_SC_WCID = ITF_SC_TOTAL++;
|
||||||
ITF_WCID = ITF_TOTAL++;
|
ITF_WCID = ITF_TOTAL++;
|
||||||
}
|
}
|
||||||
@@ -112,10 +119,14 @@ void usb_init() {
|
|||||||
timeout_counter = (uint32_t *)calloc(ITF_TOTAL, sizeof(uint32_t));
|
timeout_counter = (uint32_t *)calloc(ITF_TOTAL, sizeof(uint32_t));
|
||||||
}
|
}
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
hid_init();
|
if (ITF_HID_TOTAL > 0) {
|
||||||
|
hid_init();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_ITF_CCID
|
#ifdef USB_ITF_CCID
|
||||||
ccid_init();
|
if (ITF_SC_TOTAL > 0) {
|
||||||
|
ccid_init();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,8 @@
|
|||||||
#define EV_BUTTON_TIMEOUT 16
|
#define EV_BUTTON_TIMEOUT 16
|
||||||
#define EV_BUTTON_PRESSED 32
|
#define EV_BUTTON_PRESSED 32
|
||||||
|
|
||||||
|
static const uint8_t ITF_INVALID = 0xFF;
|
||||||
|
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
extern uint8_t ITF_HID_CTAP, ITF_HID_KB;
|
extern uint8_t ITF_HID_CTAP, ITF_HID_KB;
|
||||||
extern uint8_t ITF_HID, ITF_KEYBOARD;
|
extern uint8_t ITF_HID, ITF_KEYBOARD;
|
||||||
|
|||||||
@@ -147,38 +147,38 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
|
|||||||
TUSB_DESC_TOTAL_LEN = TUD_CONFIG_DESC_LEN;
|
TUSB_DESC_TOTAL_LEN = TUD_CONFIG_DESC_LEN;
|
||||||
uint8_t *p = desc_config + TUD_CONFIG_DESC_LEN;
|
uint8_t *p = desc_config + TUD_CONFIG_DESC_LEN;
|
||||||
#ifdef USB_ITF_HID
|
#ifdef USB_ITF_HID
|
||||||
if (1) {
|
if (ITF_HID != ITF_INVALID) {
|
||||||
TUSB_DESC_TOTAL_LEN += TUD_HID_INOUT_DESC_LEN;
|
TUSB_DESC_TOTAL_LEN += TUD_HID_INOUT_DESC_LEN;
|
||||||
const uint8_t desc[] = { TUD_HID_INOUT_DESCRIPTOR(0, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, TUSB_DIR_IN_MASK | EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10) };
|
const uint8_t desc[] = { TUD_HID_INOUT_DESCRIPTOR(0, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, TUSB_DIR_IN_MASK | EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10) };
|
||||||
memcpy(p, desc, sizeof(desc));
|
memcpy(p, desc, sizeof(desc));
|
||||||
p[2] = ITF_HID;
|
p[2] = ITF_HID;
|
||||||
p[8] = ITF_HID + 5;
|
p[8] = 5;
|
||||||
p += sizeof(desc);
|
p += sizeof(desc);
|
||||||
}
|
}
|
||||||
if (1) {
|
if (ITF_KEYBOARD != ITF_INVALID) {
|
||||||
TUSB_DESC_TOTAL_LEN += TUD_HID_DESC_LEN;
|
TUSB_DESC_TOTAL_LEN += TUD_HID_DESC_LEN;
|
||||||
const uint8_t desc_kb[] = { 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) };
|
const uint8_t desc_kb[] = { 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) };
|
||||||
memcpy(p, desc_kb, sizeof(desc_kb));
|
memcpy(p, desc_kb, sizeof(desc_kb));
|
||||||
p[2] = ITF_KEYBOARD;
|
p[2] = ITF_KEYBOARD;
|
||||||
p[8] = ITF_KEYBOARD + 5;
|
p[8] = 6;
|
||||||
p += sizeof(desc_kb);
|
p += sizeof(desc_kb);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_ITF_CCID
|
#ifdef USB_ITF_CCID
|
||||||
if (1) {
|
if (ITF_CCID != ITF_INVALID) {
|
||||||
TUSB_DESC_TOTAL_LEN += TUSB_SMARTCARD_CCID_DESC_LEN;
|
TUSB_DESC_TOTAL_LEN += TUSB_SMARTCARD_CCID_DESC_LEN;
|
||||||
const uint8_t desc_ccid[] = { TUD_SMARTCARD_DESCRIPTOR(ITF_CCID, ITF_CCID+5, 1, TUSB_DIR_IN_MASK | 1, TUSB_DIR_IN_MASK | 2, 64) };
|
const uint8_t desc_ccid[] = { TUD_SMARTCARD_DESCRIPTOR(ITF_CCID, ITF_CCID+5, 1, TUSB_DIR_IN_MASK | 1, TUSB_DIR_IN_MASK | 2, 64) };
|
||||||
memcpy(p, desc_ccid, sizeof(desc_ccid));
|
memcpy(p, desc_ccid, sizeof(desc_ccid));
|
||||||
p[2] = ITF_CCID;
|
p[2] = ITF_CCID;
|
||||||
p[8] = ITF_CCID + 5;
|
p[8] = 7;
|
||||||
p += sizeof(desc_ccid);
|
p += sizeof(desc_ccid);
|
||||||
}
|
}
|
||||||
if (1) {
|
if (ITF_WCID != ITF_INVALID) {
|
||||||
TUSB_DESC_TOTAL_LEN += TUSB_SMARTCARD_WCID_DESC_LEN;
|
TUSB_DESC_TOTAL_LEN += TUSB_SMARTCARD_WCID_DESC_LEN;
|
||||||
const uint8_t desc_wcid[] = { TUD_SMARTCARD_DESCRIPTOR_WEB(ITF_WCID, ITF_WCID+5, 3, TUSB_DIR_IN_MASK | 3, 64) };
|
const uint8_t desc_wcid[] = { TUD_SMARTCARD_DESCRIPTOR_WEB(ITF_WCID, ITF_WCID+5, 3, TUSB_DIR_IN_MASK | 3, 64) };
|
||||||
memcpy(p, desc_wcid, sizeof(desc_wcid));
|
memcpy(p, desc_wcid, sizeof(desc_wcid));
|
||||||
p[2] = ITF_WCID;
|
p[2] = ITF_WCID;
|
||||||
p[8] = ITF_WCID + 5;
|
p[8] = 8;
|
||||||
p += sizeof(desc_wcid);
|
p += sizeof(desc_wcid);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -302,14 +302,10 @@ char const *string_desc_arr [] = {
|
|||||||
"Pico Key", // 2: Product
|
"Pico Key", // 2: Product
|
||||||
"11223344", // 3: Serials, should use chip ID
|
"11223344", // 3: Serials, should use chip ID
|
||||||
"Config" // 4: Vendor Interface
|
"Config" // 4: Vendor Interface
|
||||||
#ifdef USB_ITF_HID
|
|
||||||
, "HID Interface"
|
, "HID Interface"
|
||||||
, "HID Keyboard Interface"
|
, "HID Keyboard Interface"
|
||||||
#endif
|
|
||||||
#ifdef USB_ITF_CCID
|
|
||||||
, "CCID OTP FIDO Interface"
|
, "CCID OTP FIDO Interface"
|
||||||
, "WebCCID Interface"
|
, "WebCCID Interface"
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ESP_PLATFORM
|
#ifdef ESP_PLATFORM
|
||||||
|
|||||||
Reference in New Issue
Block a user