LBPUT("%s: set serial options: %d,",devName,baud);
tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
if(!(mode&SM_1SB)) tio.c_cflag |= CSTOPB;
- tio.c_iflag = (INPCK | BRKINT);
+ tio.c_iflag = (INPCK | IGNBRK);
tio.c_cc[VMIN] = 1;
cfsetispeed(&tio,bconst);
cfsetospeed(&tio,bconst);
cSmartCard::cSmartCard(const struct CardConfig *Cfg, const struct StatusMsg *Msg)
{
- cfg=Cfg; msg=Msg;
+ msg=Msg;
ser=0; atr=0; idStr[0]=0; cardUp=false; needsReset=true;
+ NewCardConfig(Cfg);
+}
+
+void cSmartCard::NewCardConfig(const struct CardConfig *Cfg)
+{
+ cfg=Cfg;
}
bool cSmartCard::GetCardIdStr(char *str, int len)
Invert(tmp,len);
data=tmp;
}
- int r=ser->Write(data,len);
+ int r=ser->Write(data,len,cfg->serDL);
if(r>0) {
unsigned char *buff=AUTOMEM(r);
int rr=ser->Read(buff,r,cfg->serTO);
struct CardConfig {
int SerMode;
- int workTO, serTO; // values in ms
+ int workTO, serTO, serDL; // values in ms
};
struct StatusMsg {
bool IsoWrite(const unsigned char *cmd, const unsigned char *data);
bool Status(void);
bool Test(bool res);
+ void NewCardConfig(const struct CardConfig *Cfg);
int CheckSctLen(const unsigned char *data, int off);
void TriggerReset(void) { needsReset=true; }
static void Invert(unsigned char *data, int n);
SM_8O2,2000,1400
};
+static const struct CardConfig cardCfgDelay = {
+ SM_8O2,2000,1400,20
+ };
+
cSmartCardVideoGuard2::cSmartCardVideoGuard2(void)
:cSmartCard(&cardCfg,msgs)
{
static unsigned char ins7401[] = { 0xD0,0x74,0x01,0x00,0x00 };
int l;
- if((l=ReadCmdLen(ins7401))<0) return false;
+ if((l=ReadCmdLen(ins7401))<0) {
+ PRINTF(L_SC_ERROR,"bogus answer. Now try delayed mode");
+ NewCardConfig(&cardCfgDelay);
+ if((l=ReadCmdLen(ins7401))<0) return false;
+ }
ins7401[4]=l;
unsigned char buff[256];
if(!IsoRead(ins7401,buff) || !Status()) {