/***************************************************************************** * * ccid_open_hack_pre * ****************************************************************************/ int ccid_open_hack_pre(unsigned int reader_index) { _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); switch (ccid_descriptor->readerID) { case MYSMARTPAD: ccid_descriptor->dwMaxIFSD = 254; break; case CL1356D: /* the firmware needs some time to initialize */ (void)sleep(1); ccid_descriptor->readTimeout = 60*1000; /* 60 seconds */ break; case OZ776: case OZ776_7772: ccid_descriptor->dwMaxDataRate = 9600; break; case ElatecTWN4: /* use a timeout of 400 ms instead of 100 ms in CmdGetSlotStatus() * used by CreateChannelByNameOrChannel() * The reader answers after 280 ms if no tag is present */ case SCM_SCL011: /* The SCM SCL011 reader needs 350 ms to answer */ ccid_descriptor->readTimeout = DEFAULT_COM_READ_TIMEOUT * 4; break; } /* CCID */ if ((PROTOCOL_CCID == ccid_descriptor->bInterfaceProtocol) && (3 == ccid_descriptor -> bNumEndpoints)) { #ifndef TWIN_SERIAL /* just wait for 100ms in case a notification is in the pipe */ (void)InterruptRead(reader_index, 100); #endif } /* ICCD type A */ if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); DEBUG_COMM("ICCD type A"); (void)CmdPowerOff(reader_index); (void)CmdPowerOn(reader_index, &n, tmp, CCID_CLASS_AUTO_VOLTAGE); (void)CmdPowerOff(reader_index); } /* ICCD type B */ if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); DEBUG_COMM("ICCD type B"); if (CCID_CLASS_SHORT_APDU == (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK)) { /* use the extended APDU comm alogorithm */ ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_EXTENDED_APDU; } (void)CmdPowerOff(reader_index); (void)CmdPowerOn(reader_index, &n, tmp, CCID_CLASS_AUTO_VOLTAGE); (void)CmdPowerOff(reader_index); } return 0; } /* ccid_open_hack_pre */
/***************************************************************************** * * ccid_open_hack_pre * ****************************************************************************/ int ccid_open_hack_pre(unsigned int reader_index) { _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); switch (ccid_descriptor->readerID) { case MYSMARTPAD: ccid_descriptor->dwMaxIFSD = 254; break; case CL1356D: /* the firmware needs some time to initialize */ (void)sleep(1); ccid_descriptor->readTimeout = 60*1000; /* 60 seconds */ break; case GEMPCTWIN: case GEMPCKEY: case DELLSCRK: /* Only the chipset with firmware version 2.00 is "bogus" * The reader may send packets of 0 bytes when the reader is * connected to a USB 3 port */ if (0x0200 == ccid_descriptor->IFD_bcdDevice) { ccid_descriptor->zlp = TRUE; DEBUG_INFO1("ZLP fixup"); } break; case OZ776_7772: ccid_descriptor->dwMaxDataRate = 9600; break; case SCR331NTTCOM: ccid_descriptor->bInterfaceProtocol = 0; break; } /* CCID */ if ((PROTOCOL_CCID == ccid_descriptor->bInterfaceProtocol) && (3 == ccid_descriptor -> bNumEndpoints)) { #ifndef TWIN_SERIAL /* just wait for 100ms in case a notification is in the pipe */ (void)InterruptRead(reader_index, 100); #endif } /* ICCD type A */ if (PROTOCOL_ICCD_A == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); DEBUG_COMM("ICCD type A"); (void)CmdPowerOff(reader_index); (void)CmdPowerOn(reader_index, &n, tmp, CCID_CLASS_AUTO_VOLTAGE); (void)CmdPowerOff(reader_index); } /* ICCD type B */ if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) { unsigned char tmp[MAX_ATR_SIZE]; unsigned int n = sizeof(tmp); DEBUG_COMM("ICCD type B"); if (CCID_CLASS_SHORT_APDU == (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK)) { /* use the extended APDU comm alogorithm */ ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_EXTENDED_APDU; } (void)CmdPowerOff(reader_index); (void)CmdPowerOn(reader_index, &n, tmp, CCID_CLASS_AUTO_VOLTAGE); (void)CmdPowerOff(reader_index); } return 0; } /* ccid_open_hack_pre */