Using new style.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos 2023-02-15 00:14:10 +01:00
parent 43ef33d60b
commit 31f899416c
No known key found for this signature in database
GPG key ID: C0095B7870A4CCD3
4 changed files with 80 additions and 120 deletions

View file

@ -39,16 +39,13 @@ extern bool wait_button();
extern void low_flash_init_core1();
static inline const uint16_t make_uint16_t(uint8_t b1, uint8_t b2)
{
static inline const uint16_t make_uint16_t(uint8_t b1, uint8_t b2) {
return (b1 << 8) | b2;
}
static inline const uint16_t get_uint16_t(const uint8_t *b, uint16_t offset)
{
return make_uint16_t(b[offset], b[offset+1]);
static inline const uint16_t get_uint16_t(const uint8_t *b, uint16_t offset) {
return make_uint16_t(b[offset], b[offset + 1]);
}
static inline void put_uint16_t(uint16_t n, uint8_t *b)
{
static inline void put_uint16_t(uint16_t n, uint8_t *b) {
*b++ = (n >> 8) & 0xff;
*b = n & 0xff;
}

View file

@ -62,9 +62,8 @@ app_t *current_app = NULL;
const uint8_t *ccid_atr = NULL;
int register_app(app_t *(*select_aid)(app_t *, const uint8_t *, uint8_t))
{
if (num_apps < sizeof(apps)/sizeof(app_t)) {
int register_app(app_t *(*select_aid)(app_t *, const uint8_t *, uint8_t)) {
if (num_apps < sizeof(apps) / sizeof(app_t)) {
apps[num_apps].select_aid = select_aid;
num_apps++;
return 1;
@ -74,19 +73,16 @@ int register_app(app_t *(*select_aid)(app_t *, const uint8_t *, uint8_t))
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
void led_set_blink(uint32_t mode)
{
void led_set_blink(uint32_t mode) {
blink_interval_ms = mode;
}
uint32_t timeout = 0;
void timeout_stop()
{
void timeout_stop() {
timeout = 0;
}
void timeout_start()
{
void timeout_start() {
timeout = board_millis();
}
@ -94,8 +90,7 @@ void execute_tasks();
static bool req_button_pending = false;
bool is_req_button_pending()
{
bool is_req_button_pending() {
return req_button_pending;
}
@ -103,16 +98,14 @@ uint32_t button_timeout = 15000;
bool cancel_button = false;
#ifdef ENABLE_EMULATION
uint32_t board_millis()
{
uint32_t board_millis() {
struct timeval start;
gettimeofday(&start, NULL);
return start.tv_sec * 1000 + start.tv_usec/1000;
return start.tv_sec * 1000 + start.tv_usec / 1000;
}
#else
bool wait_button()
{
bool wait_button() {
uint32_t start_button = board_millis();
bool timeout = false;
cancel_button = false;
@ -144,8 +137,7 @@ bool wait_button()
struct apdu apdu;
void led_blinking_task()
{
void led_blinking_task() {
#ifdef PICO_DEFAULT_LED_PIN
static uint32_t start_ms = 0;
static uint8_t led_state = false;
@ -168,8 +160,7 @@ void led_blinking_task()
#endif
}
void led_off_all()
{
void led_off_all() {
#ifdef PIMORONI_TINY2040
gpio_put(TINY2040_LED_R_PIN, 1);
gpio_put(TINY2040_LED_G_PIN, 1);
@ -181,8 +172,7 @@ void led_off_all()
#endif
}
void init_rtc()
{
void init_rtc() {
#ifndef ENABLE_EMULATION
rtc_init();
datetime_t dt = {
@ -201,8 +191,7 @@ void init_rtc()
extern void neug_task();
extern void usb_task();
void execute_tasks()
{
void execute_tasks() {
usb_task();
#ifndef ENABLE_EMULATION
tud_task(); // tinyusb device task
@ -210,8 +199,7 @@ void execute_tasks()
led_blinking_task();
}
int main(void)
{
int main(void) {
#ifndef ENABLE_EMULATION
usb_init();

View file

@ -33,19 +33,17 @@
#include <stdlib.h>
// Device specific functions
static uint8_t rx_buffer[ITF_TOTAL][4096] = { 0 }, tx_buffer[ITF_TOTAL][4096+64] = { 0 };
static uint8_t rx_buffer[ITF_TOTAL][4096] = { 0 }, tx_buffer[ITF_TOTAL][4096 + 64] = { 0 };
static uint16_t w_offset[ITF_TOTAL] = { 0 }, r_offset[ITF_TOTAL] = { 0 };
static uint16_t w_len[ITF_TOTAL] = { 0 }, tx_r_offset[ITF_TOTAL] = { 0 };
static uint32_t timeout_counter[ITF_TOTAL] = { 0 };
uint8_t card_locked_itf = ITF_TOTAL; // no locked
void usb_set_timeout_counter(uint8_t itf, uint32_t v)
{
void usb_set_timeout_counter(uint8_t itf, uint32_t v) {
timeout_counter[itf] = v;
}
uint32_t usb_write_offset(uint8_t itf, uint16_t len, uint16_t offset)
{
uint32_t usb_write_offset(uint8_t itf, uint16_t len, uint16_t offset) {
#ifndef ENABLE_EMULATION
uint8_t pkt_max = 64;
#endif
@ -57,17 +55,17 @@ uint32_t usb_write_offset(uint8_t itf, uint16_t len, uint16_t offset)
tx_r_offset[itf] = offset;
#ifdef USB_ITF_HID
if (itf == ITF_HID) {
w = driver_write_hid(tx_buffer[itf]+offset, MIN(len, pkt_max));
w = driver_write_hid(tx_buffer[itf] + offset, MIN(len, pkt_max));
}
#endif
#ifdef USB_ITF_CCID
if (itf == ITF_CCID) {
w = driver_write_ccid(tx_buffer[itf]+offset, MIN(len, pkt_max));
w = driver_write_ccid(tx_buffer[itf] + offset, MIN(len, pkt_max));
}
#endif
#ifdef ENABLE_EMULATION
if (itf == ITF_EMUL) {
w = driver_write_emul(tx_buffer[itf]+offset, len);
w = driver_write_emul(tx_buffer[itf] + offset, len);
}
#endif
w_len[itf] -= w;
@ -75,8 +73,7 @@ uint32_t usb_write_offset(uint8_t itf, uint16_t len, uint16_t offset)
return w;
}
size_t usb_rx(uint8_t itf, const uint8_t *buffer, size_t len)
{
size_t usb_rx(uint8_t itf, const uint8_t *buffer, size_t len) {
uint16_t size = MIN(sizeof(rx_buffer[itf]) - w_offset[itf], len);
if (size > 0) {
if (buffer == NULL) {
@ -90,7 +87,8 @@ size_t usb_rx(uint8_t itf, const uint8_t *buffer, size_t len)
size = driver_read_ccid(rx_buffer[itf] + w_offset[itf], size);
}
#endif
} else {
}
else {
memcpy(rx_buffer[itf] + w_offset[itf], buffer, size);
}
w_offset[itf] += size;
@ -98,23 +96,22 @@ size_t usb_rx(uint8_t itf, const uint8_t *buffer, size_t len)
return size;
}
uint32_t usb_write_flush(uint8_t itf)
{
uint32_t usb_write_flush(uint8_t itf) {
int w = 0;
if (w_len[itf] > 0) {
#ifdef USB_ITF_HID
if (itf == ITF_HID) {
w = driver_write_hid(tx_buffer[itf]+tx_r_offset[itf], MIN(w_len[itf], 64));
w = driver_write_hid(tx_buffer[itf] + tx_r_offset[itf], MIN(w_len[itf], 64));
}
#endif
#ifdef USB_ITF_CCID
if (itf == ITF_CCID) {
w = driver_write_ccid(tx_buffer[itf]+tx_r_offset[itf], MIN(w_len[itf], 64));
w = driver_write_ccid(tx_buffer[itf] + tx_r_offset[itf], MIN(w_len[itf], 64));
}
#endif
#ifdef ENABLE_EMULATION
if (itf == ITF_EMUL) {
w = driver_write_emul(tx_buffer[itf]+tx_r_offset[itf], w_len[itf]);
w = driver_write_emul(tx_buffer[itf] + tx_r_offset[itf], w_len[itf]);
}
#endif
tx_r_offset[itf] += w;
@ -123,33 +120,27 @@ uint32_t usb_write_flush(uint8_t itf)
return w;
}
uint32_t usb_write(uint8_t itf, uint16_t len)
{
uint32_t usb_write(uint8_t itf, uint16_t len) {
return usb_write_offset(itf, len, 0);
}
uint16_t usb_read_available(uint8_t itf)
{
uint16_t usb_read_available(uint8_t itf) {
return w_offset[itf] - r_offset[itf];
}
uint16_t usb_write_available(uint8_t itf)
{
uint16_t usb_write_available(uint8_t itf) {
return w_len[itf] > 0;
}
uint8_t *usb_get_rx(uint8_t itf)
{
uint8_t *usb_get_rx(uint8_t itf) {
return rx_buffer[itf];
}
uint8_t *usb_get_tx(uint8_t itf)
{
uint8_t *usb_get_tx(uint8_t itf) {
return tx_buffer[itf];
}
void usb_clear_rx(uint8_t itf)
{
void usb_clear_rx(uint8_t itf) {
w_offset[itf] = r_offset[itf] = 0;
}
@ -167,8 +158,7 @@ queue_t usb_to_card_q;
queue_t card_to_usb_q;
#endif
void usb_init()
{
void usb_init() {
#ifndef ENABLE_EMULATION
queue_init(&card_to_usb_q, sizeof(uint32_t), 64);
queue_init(&usb_to_card_q, sizeof(uint32_t), 64);
@ -178,8 +168,7 @@ void usb_init()
extern int driver_process_usb_nopacket();
extern uint32_t timeout;
static int usb_event_handle(uint8_t itf)
{
static int usb_event_handle(uint8_t itf) {
#ifndef ENABLE_EMULATION
uint16_t rx_read = usb_read_available(itf);
#else
@ -208,7 +197,8 @@ static int usb_event_handle(uint8_t itf)
queue_add_blocking(&usb_to_card_q, &flag);
#endif
timeout_start();
} else {
}
else {
#ifdef USB_ITF_HID
if (itf == ITF_HID) {
driver_process_usb_nopacket_hid();
@ -224,8 +214,7 @@ static int usb_event_handle(uint8_t itf)
}
extern void low_flash_init();
void card_init_core1()
{
void card_init_core1() {
#ifndef ENABLE_EMULATION
low_flash_init_core1();
#endif
@ -233,8 +222,7 @@ void card_init_core1()
size_t finished_data_size = 0;
void card_start(void (*func)(void))
{
void card_start(void (*func)(void)) {
#ifndef ENABLE_EMULATION
uint32_t m = 0;
while (queue_is_empty(&usb_to_card_q) == false) {
@ -253,8 +241,7 @@ void card_start(void (*func)(void))
#endif
}
void card_exit()
{
void card_exit() {
#ifndef ENABLE_EMULATION
uint32_t flag = EV_EXIT;
queue_try_add(&usb_to_card_q, &flag);
@ -263,8 +250,7 @@ void card_exit()
card_locked_itf = ITF_TOTAL;
}
extern void hid_task();
void usb_task()
{
void usb_task() {
#ifndef ENABLE_EMULATION
bool mounted = false;
#else
@ -308,11 +294,13 @@ void usb_task()
#endif
led_set_blink(BLINK_MOUNTED);
card_locked_itf = ITF_TOTAL;
} else if (m == EV_PRESS_BUTTON) {
}
else if (m == EV_PRESS_BUTTON) {
uint32_t flag = wait_button() ? EV_BUTTON_TIMEOUT : EV_BUTTON_PRESSED;
queue_try_add(&usb_to_card_q, &flag);
}
} else {
}
else {
if (timeout > 0) {
if (timeout + timeout_counter[itf] < board_millis()) {
#ifdef USB_ITF_HID
@ -339,8 +327,7 @@ void usb_task()
}
uint8_t *usb_prepare_response(uint8_t itf)
{
uint8_t *usb_prepare_response(uint8_t itf) {
#ifdef USB_ITF_HID
if (itf == ITF_HID) {
return driver_prepare_response_hid();

View file

@ -38,8 +38,7 @@
//--------------------------------------------------------------------+
// Device Descriptors
//--------------------------------------------------------------------+
tusb_desc_device_t const desc_device =
{
tusb_desc_device_t const desc_device = {
.bLength = sizeof(tusb_desc_device_t),
.bDescriptorType = TUSB_DESC_DEVICE,
.bcdUSB = (USB_BCD),
@ -60,8 +59,7 @@ tusb_desc_device_t const desc_device =
.bNumConfigurations = 1
};
uint8_t const *tud_descriptor_device_cb(void)
{
uint8_t const *tud_descriptor_device_cb(void) {
return (uint8_t const *) &desc_device;
}
@ -70,14 +68,13 @@ uint8_t const *tud_descriptor_device_cb(void)
// Configuration Descriptor
//--------------------------------------------------------------------+
tusb_desc_configuration_t const desc_config =
{
tusb_desc_configuration_t const desc_config = {
.bLength = sizeof(tusb_desc_configuration_t),
.bDescriptorType = TUSB_DESC_CONFIGURATION,
.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)
2 * sizeof(tusb_desc_endpoint_t)
#endif
#ifdef USB_ITF_HID
+ TUD_HID_INOUT_DESC_LEN + TUD_HID_DESC_LEN
@ -87,7 +84,7 @@ tusb_desc_configuration_t const desc_config =
.bConfigurationValue = 1,
.iConfiguration = 4,
.bmAttributes = USB_CONFIG_ATT_ONE | TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,
.bMaxPower = TUSB_DESC_CONFIG_POWER_MA(MAX_USB_POWER+1),
.bMaxPower = TUSB_DESC_CONFIG_POWER_MA(MAX_USB_POWER + 1),
};
#ifdef USB_ITF_CCID
@ -98,7 +95,7 @@ static const struct ccid_class_descriptor desc_ccid = {
.bMaxSlotIndex = 0,
.bVoltageSupport = 0x01, // 5.0V
.dwProtocols = (
0x01| // T=0
0x01 | // T=0
0x02), // T=1
.dwDefaultClock = (0xDFC),
.dwMaximumClock = (0xDFC),
@ -110,7 +107,7 @@ static const struct ccid_class_descriptor desc_ccid = {
.dwSynchProtocols = (0),
.dwMechanical = (0),
.dwFeatures = 0x40840, //USB-ICC, short & extended APDU
.dwMaxCCIDMessageLength = 65544+10,
.dwMaxCCIDMessageLength = 65544 + 10,
.bClassGetResponse = 0xFF,
.bclassEnvelope = 0xFF,
.wLcdLayout = 0x0,
@ -118,8 +115,7 @@ static const struct ccid_class_descriptor desc_ccid = {
.bMaxCCIDBusySlots = 0x01,
};
tusb_desc_interface_t const desc_interface =
{
tusb_desc_interface_t const desc_interface = {
.bLength = sizeof(tusb_desc_interface_t),
.bDescriptorType = TUSB_DESC_INTERFACE,
.bInterfaceNumber = ITF_CCID,
@ -128,11 +124,10 @@ tusb_desc_interface_t const desc_interface =
.bInterfaceClass = TUSB_CLASS_SMART_CARD,
.bInterfaceSubClass = 0,
.bInterfaceProtocol = 0,
.iInterface = ITF_CCID+5,
.iInterface = ITF_CCID + 5,
};
tusb_desc_endpoint_t const desc_ep1 =
{
tusb_desc_endpoint_t const desc_ep1 = {
.bLength = sizeof(tusb_desc_endpoint_t),
.bDescriptorType = TUSB_DESC_ENDPOINT,
.bEndpointAddress = TUSB_DIR_IN_MASK | 1,
@ -141,8 +136,7 @@ tusb_desc_endpoint_t const desc_ep1 =
.bInterval = 0
};
tusb_desc_endpoint_t const desc_ep2 =
{
tusb_desc_endpoint_t const desc_ep2 = {
.bLength = sizeof(tusb_desc_endpoint_t),
.bDescriptorType = TUSB_DESC_ENDPOINT,
.bEndpointAddress = 2,
@ -155,7 +149,7 @@ tusb_desc_endpoint_t const desc_ep2 =
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) + 2 *
sizeof(tusb_desc_endpoint_t)
#endif
#ifdef USB_ITF_HID
@ -194,19 +188,17 @@ enum {
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END \
uint8_t const desc_hid_report[] =
{
uint8_t const desc_hid_report[] = {
TUD_HID_REPORT_DESC_FIDO_U2F(CFG_TUD_HID_EP_BUFSIZE)
};
uint8_t const desc_hid_report_kb[] =
{
uint8_t const desc_hid_report_kb[] = {
TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD))
};
#define EPNUM_HID 0x03
static uint8_t desc_hid[] = {
TUD_HID_INOUT_DESCRIPTOR(ITF_HID,
ITF_HID+5,
ITF_HID + 5,
HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report),
EPNUM_HID,
@ -216,24 +208,23 @@ static uint8_t desc_hid[] = {
};
static uint8_t desc_hid_kb[] = {
TUD_HID_DESCRIPTOR(ITF_KEYBOARD, ITF_KEYBOARD+5, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_kb), 0x80 | (EPNUM_HID+1), 16, 5)
TUD_HID_DESCRIPTOR(ITF_KEYBOARD, ITF_KEYBOARD + 5, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_kb), 0x80 | (EPNUM_HID + 1), 16, 5)
};
uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf)
{
uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) {
printf("report_cb %d\n", itf);
if (itf == ITF_HID) {
return desc_hid_report;
} else if (itf == ITF_KEYBOARD) {
}
else if (itf == ITF_KEYBOARD) {
return desc_hid_report_kb;
}
return NULL;
}
#endif
uint8_t const *tud_descriptor_configuration_cb(uint8_t index)
{
uint8_t const *tud_descriptor_configuration_cb(uint8_t index) {
(void) index; // for multiple configurations
static uint8_t initd = 0;
@ -262,14 +253,12 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index)
#define MS_OS_20_DESC_LEN 0xB2
uint8_t const desc_bos[] =
{
uint8_t const desc_bos[] = {
// total length, number of device caps
TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 2)
};
uint8_t const *tud_descriptor_bos_cb(void)
{
uint8_t const *tud_descriptor_bos_cb(void) {
return desc_bos;
}
@ -278,8 +267,7 @@ uint8_t const *tud_descriptor_bos_cb(void)
//--------------------------------------------------------------------+
// array of pointer to string descriptors
char const *string_desc_arr [] =
{
char const *string_desc_arr [] = {
(const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
"Pol Henarejos", // 1: Manufacturer
"Pico Key", // 2: Product
@ -296,8 +284,7 @@ char const *string_desc_arr [] =
static uint16_t _desc_str[32];
uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid)
{
uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
(void) langid;
uint8_t chr_count;
@ -305,11 +292,12 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid)
if (index == 0) {
memcpy(&_desc_str[1], string_desc_arr[0], 2);
chr_count = 1;
} else {
}
else {
// Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.
// https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors
if (!(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0]))) {
if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {
return NULL;
}
@ -329,11 +317,11 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid)
// Convert ASCII string into UTF-16
for (uint8_t i = 0; i < chr_count; i++) {
_desc_str[1+i] = str[i];
_desc_str[1 + i] = str[i];
}
}
_desc_str[0] = (TUSB_DESC_STRING << 8) | (2*chr_count + 2);
_desc_str[0] = (TUSB_DESC_STRING << 8) | (2 * chr_count + 2);
return _desc_str;
}