From 25e050b4fddbe545742fa1b4bfb669fbf375e45b Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 20 Dec 2013 13:21:18 +0900 Subject: [PATCH] support USB_FSIJ_GNUK_CARD_CHANGE control --- ChangeLog | 6 ++++++ src/gnuk.h | 6 +++++- src/usb-icc.c | 7 +++++-- src/usb_ctrl.c | 17 +++++++++++++---- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 403194b..8601a01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-12-20 Niibe Yutaka + + * src/usb_ctrl.c (USB_FSIJ_GNUK_CARD_CHANGE): New. + (usb_cb_setup): Support USB_FSIJ_GNUK_CARD_CHANGE. + * src/usb-icc.c (ccid_card_change_signal): New argument HOW. + 2013-12-20 Niibe Yutaka * polarssl/include/polarssl/bn_mul.h (MULADDC_1024_CORE) diff --git a/src/gnuk.h b/src/gnuk.h index 811ad84..f3399b6 100644 --- a/src/gnuk.h +++ b/src/gnuk.h @@ -17,7 +17,11 @@ struct apdu { }; extern struct apdu apdu; -void ccid_card_change_signal (void); + +#define CARD_CHANGE_INSERT 0 +#define CARD_CHANGE_REMOVE 1 +#define CARD_CHANGE_TOGGLE 2 +void ccid_card_change_signal (int how); /* CCID thread */ #define EV_RX_DATA_READY (1) /* USB Rx data available */ diff --git a/src/usb-icc.c b/src/usb-icc.c index 8d819d0..0258294 100644 --- a/src/usb-icc.c +++ b/src/usb-icc.c @@ -1325,11 +1325,14 @@ USBthread (void *arg) } void -ccid_card_change_signal (void) +ccid_card_change_signal (int how) { struct ccid *c = &ccid; - eventflag_signal (&c->ccid_comm, EV_CARD_CHANGE); + if (how == CARD_CHANGE_TOGGLE + || (c->icc_state == ICC_STATE_NOCARD && how == CARD_CHANGE_INSERT) + || (c->icc_state != ICC_STATE_NOCARD && how == CARD_CHANGE_REMOVE)) + eventflag_signal (&c->ccid_comm, EV_CARD_CHANGE); } diff --git a/src/usb_ctrl.c b/src/usb_ctrl.c index 7a93a03..67b102e 100644 --- a/src/usb_ctrl.c +++ b/src/usb_ctrl.c @@ -241,9 +241,10 @@ static const uint8_t lun_table[] = { 0, 0, 0, 0, }; static const uint8_t *const mem_info[] = { &_regnual_start, __heap_end__, }; -#define USB_FSIJ_GNUK_MEMINFO 0 -#define USB_FSIJ_GNUK_DOWNLOAD 1 -#define USB_FSIJ_GNUK_EXEC 2 +#define USB_FSIJ_GNUK_MEMINFO 0 +#define USB_FSIJ_GNUK_DOWNLOAD 1 +#define USB_FSIJ_GNUK_EXEC 2 +#define USB_FSIJ_GNUK_CARD_CHANGE 3 static uint32_t rbit (uint32_t v) { @@ -315,6 +316,14 @@ usb_cb_setup (uint8_t req, uint8_t req_no, return download_check_crc32 ((uint32_t *)addr); } + else if (req_no == USB_FSIJ_GNUK_CARD_CHANGE && len == 0) + { + if (value != 0 && value != 1 && value != 2) + return USB_UNSUPPORT; + + ccid_card_change_signal (value); + return USB_SUCCESS; + } } } else if (type_rcp == (CLASS_REQUEST | INTERFACE_RECIPIENT)) @@ -427,7 +436,7 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value, if (index == 1 && req_no == USB_HID_REQ_SET_REPORT) { if ((hid_report ^ hid_report_saved) & HID_LED_STATUS_CARDCHANGE) - ccid_card_change_signal (); + ccid_card_change_signal (CARD_CHANGE_TOGGLE); hid_report_saved = hid_report; }