3 This module provides IFD handling functions for DreCas reader.
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"
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
); }
36 int32_t DreCas_GetStatus(struct s_reader
*UNUSED(reader
), int32_t *UNUSED(status
))
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");
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
); }
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
);
66 IO_Serial_Ioctl_Lock(reader
, 0);
70 while(n
< ATR_MAX_SIZE
&& !IO_Serial_Read(reader
, 50, ATR_TIMEOUT
, 1, buf
+ n
))
73 if(ATR_InitFromArray(atr
, buf
, n
) != ERROR
)
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
);
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
));
98 if(DreCas_Init(reader
))
100 rdr_log(reader
, "ERROR: DreCas_Init returns error");
101 DreCas_Close(reader
);
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
=
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
,