static int32_t db2com_get_status(struct s_reader *reader, int32_t *status) { *status = 0; uint16_t msr = 1; IO_Serial_Ioctl_Lock(reader, 1); ioctl(reader->fdmc, MULTICAM_GET_PCDAT, &msr); if(reader->typ == R_DB2COM2) { *status = !(msr & 1); } else { *status = (msr & 0x0f00) == 0x0f00; } IO_Serial_Ioctl_Lock(reader, 0); return OK; }
bool IO_Serial_SetParams (struct s_reader * reader, uint32_t bitrate, uint32_t bits, int32_t parity, uint32_t stopbits, int32_t * dtr, int32_t * rts) { struct termios newtio; if(reader->typ == R_INTERNAL) return ERROR; memset (&newtio, 0, sizeof (newtio)); if (IO_Serial_SetBitrate (reader, bitrate, & newtio)) return ERROR; /* Set the character size */ switch (bits) { case 5: newtio.c_cflag |= CS5; break; case 6: newtio.c_cflag |= CS6; break; case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } /* Set the parity */ switch (parity) { case PARITY_ODD: newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; break; case PARITY_EVEN: newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD; break; case PARITY_NONE: newtio.c_cflag &= ~PARENB; break; } /* Set the number of stop bits */ switch (stopbits) { case 1: newtio.c_cflag &= (~CSTOPB); break; case 2: newtio.c_cflag |= CSTOPB; break; } /* Selects raw (non-canonical) input and output */ newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); newtio.c_oflag &= ~OPOST; #if 1 newtio.c_iflag |= IGNPAR; /* Ignore parity errors!!! Windows driver does so why shouldn't I? */ #endif /* Enable receiver, hang on close, ignore control line */ newtio.c_cflag |= CREAD | HUPCL | CLOCAL; /* Read 1 byte minimun, no timeout specified */ newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 0; if (IO_Serial_SetProperties(reader, newtio)) return ERROR; reader->current_baudrate = bitrate; IO_Serial_Ioctl_Lock(reader, 1); IO_Serial_DTR_RTS(reader, dtr, rts); IO_Serial_Ioctl_Lock(reader, 0); return OK; }
int32_t ICC_Async_GetStatus (struct s_reader *reader, int32_t * card) { int32_t in=0; if (reader->crdr.active==1 && reader->crdr.get_status) { call(reader->crdr.get_status(reader, &in)); if (in) *card = TRUE; else *card = FALSE; return OK; } switch(reader->typ) { case R_DB2COM1: case R_DB2COM2: #if defined(TUXBOX) && defined(PPC) { uint16_t msr=1; IO_Serial_Ioctl_Lock(reader, 1); ioctl(reader->fdmc, GET_PCDAT, &msr); if (reader->typ == R_DB2COM2) in=(!(msr & 1)); else in=((msr & 0x0f00) == 0x0f00); IO_Serial_Ioctl_Lock(reader, 0); } break; #endif case R_SC8in1: cs_writelock(&sc8in1_lock); call (Sc8in1_GetStatus(reader, &in)); cs_writeunlock(&sc8in1_lock); break; case R_MP35: case R_MOUSE: call (Phoenix_GetStatus(reader, &in)); break; #if defined(LIBUSB) case R_SMART: call (SR_GetStatus(reader, &in)); break; #endif case R_INTERNAL: #if defined(SCI_DEV) call (Sci_GetStatus(reader, &in)); #elif defined(COOL) call (Cool_GetStatus(&in)); #elif defined(WITH_STAPI) call (STReader_GetStatus(reader->stsmart_handle, &in)); #elif defined(AZBOX) call(Azbox_GetStatus(reader, &in)); #endif break; #ifdef HAVE_PCSC case R_PCSC: in = pcsc_check_card_inserted(reader); break; #endif default: cs_log("ERROR ICC_Get_Status: unknow reader type %i",reader->typ); return ERROR; } if (in) *card = TRUE; else *card = FALSE; return OK; }