- simplify cak7 code (thanks to lpm11 and for all who tested)
[oscam.git] / csctapi / ifd_drecas.c
blobfe609a13cc2c1a7d3f294a02498d815f64b11b57
1 /*
2 ifd_drecas.c
3 This module provides IFD handling functions for DreCas reader.
4 */
6 #include "../globals.h"
7 #include "../oscam-string.h"
9 #ifdef CARDREADER_DRECAS
10 #include "../oscam-time.h"
11 #include "icc_async.h"
12 #include "ifd_drecas.h"
13 #include "io_serial.h"
15 #define OK 0
16 #define ERROR 1
18 int32_t DreCas_Init(struct s_reader *reader)
20 const struct s_cardreader *crdr_ops = reader->crdr;
21 if (!crdr_ops) return ERROR;
23 if(crdr_ops->flush) { IO_Serial_Flush(reader); }
25 rdr_log_dbg(reader, D_IFD, "Initializing reader type=%d", reader->typ);
27 /* Default serial port settings */
28 if(reader->atr[0] == 0)
30 if(IO_Serial_SetParams(reader, DEFAULT_BAUDRATE, 8, PARITY_NONE, 1, NULL, NULL)) { return ERROR; }
31 if(crdr_ops->flush) { IO_Serial_Flush(reader); }
33 return OK;
36 int32_t DreCas_GetStatus(struct s_reader *UNUSED(reader), int32_t *UNUSED(status))
38 return OK;
41 int32_t DreCas_Reset(struct s_reader *reader, ATR *atr)
43 rdr_log_dbg(reader, D_IFD, "Resetting card");
44 rdr_log_dbg(reader, D_IFD, "DreCas_Reset");
45 int32_t ret;
46 uint8_t buf[ATR_MAX_SIZE];
47 uint8_t reset_cmd[5] = { 0xDB ,0x03 ,0x00 ,0xC1 ,0xC1 };
49 if(IO_Serial_SetParams(reader, DEFAULT_BAUDRATE, 8, PARITY_NONE, 2, NULL, NULL)) { return ERROR; }
51 const struct s_cardreader *crdr_ops = reader->crdr;
52 if (!crdr_ops) return ERROR;
55 if(crdr_ops->flush) { IO_Serial_Flush(reader); }
57 ret = ERROR;
59 IO_Serial_Ioctl_Lock(reader, 1);
61 /* Module soft reset */
63 IO_Serial_Write(reader, 0, 0, (uint32_t)sizeof(reset_cmd), reset_cmd);
64 cs_sleepms(50);
66 IO_Serial_Ioctl_Lock(reader, 0);
68 int32_t n = 0;
70 while(n < ATR_MAX_SIZE && !IO_Serial_Read(reader, 50, ATR_TIMEOUT, 1, buf + n))
71 { n++; }
73 if(ATR_InitFromArray(atr, buf, n) != ERROR)
74 { ret = OK; }
76 return ret;
79 int32_t DreCas_Close(struct s_reader *reader)
81 rdr_log_dbg(reader, D_IFD, "Closing DreCas device %s", reader->device);
82 IO_Serial_Close(reader);
83 return OK;
86 static int32_t mouse_init(struct s_reader *reader)
88 const struct s_cardreader *crdr_ops = reader->crdr;
89 if (!crdr_ops) return ERROR;
91 reader->handle = open(reader->device, O_RDWR | O_NOCTTY | O_NONBLOCK);
92 if(reader->handle < 0)
94 rdr_log(reader, "ERROR: Opening device %s (errno=%d %s)",
95 reader->device, errno, strerror(errno));
96 return ERROR;
98 if(DreCas_Init(reader))
100 rdr_log(reader, "ERROR: DreCas_Init returns error");
101 DreCas_Close(reader);
102 return ERROR;
104 return OK;
107 static int32_t DreCas_SetParity(struct s_reader *reader, unsigned char UNUSED(parity))
109 return IO_Serial_SetParity(reader, PARITY_NONE);
112 const struct s_cardreader cardreader_drecas =
114 .desc = "drecas",
115 .typ = R_DRECAS,
116 .flush = 1,
117 .read_written = 0,
118 .need_inverse = 0,
119 .reader_init = mouse_init,
120 .get_status = DreCas_GetStatus,
121 .activate = DreCas_Reset,
122 .transmit = IO_Serial_Transmit,
123 .receive = IO_Serial_Receive,
124 .close = DreCas_Close,
125 .set_parity = DreCas_SetParity,
126 .set_baudrate = IO_Serial_SetBaudrate,
129 #endif