diff options
author | NIIBE Yutaka <[email protected]> | 2020-09-28 04:29:51 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-10-06 02:43:13 +0000 |
commit | 7db836c0e9223a4d5f30636e35e18156a97e6b91 (patch) | |
tree | 4925553879d0610a669a94a670c0de27db6adbdb | |
parent | scd: For SPR532, submit the ESCape command at initialization. (diff) | |
download | gnupg-7db836c0e9223a4d5f30636e35e18156a97e6b91.tar.gz gnupg-7db836c0e9223a4d5f30636e35e18156a97e6b91.zip |
scd: Change handling of SPR532 card reader.
* scd/ccid-driver.c (ccid_vendor_specific_init): Put some workaround
for SPR532 initialization.
(ccid_slot_status): Send ESCape command after GetSlotStatus.
--
Backport master commit of:
684a52dffa8b7f79b26fe53b3ab10d7748a8fb37
GnuPG-bug-id: 5065
Fixes-commit: 4fae55f8ee11b3f710524e5e8b8a91b159949f2d
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | scd/ccid-driver.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index ff058d459..ab4d100c9 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -1284,9 +1284,14 @@ ccid_vendor_specific_init (ccid_driver_t handle) } else if (handle->id_vendor == VENDOR_SCM) { - DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n"); - r = send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3, - NULL, 0, NULL); + /* + * It seems that SEQ may be out of sync between host and the card reader, + * and SET_INTERFACE doesn't reset it. Make sure it works at the init. + */ + abort_cmd (handle, 0); + r = libusb_clear_halt (handle->idev, handle->ep_intr); + DEBUGOUT_1 ("libusb_clear_halt intr: %s\n", libusb_error_name (r)); + r = 0; } if (r != 0 && r != CCID_DRIVER_ERR_CARD_INACTIVE @@ -2419,7 +2424,15 @@ ccid_slot_status (ccid_driver_t handle, int *statusbits, int on_wire) /* Setup interrupt transfer at the initial call of slot_status with ON_WIRE == 0 */ if (handle->transfer == NULL && handle->ep_intr >= 0) - ccid_setup_intr (handle); + { + ccid_setup_intr (handle); + if (handle->id_vendor == VENDOR_SCM) + { + DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n"); + send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3, + NULL, 0, NULL); + } + } *statusbits = 0; return 0; |