1 #include "../globals.h"
3 #ifdef CARDREADER_DB2COM
4 #include "../oscam-time.h"
6 #include "ifd_phoenix.h"
10 #define DEV_MULTICAM "/dev/multicam"
11 #define MULTICAM_GET_PCDAT 10
12 #define MULTICAM_SET_PCDAT 13
17 bool detect_db2com_reader(struct s_reader
*reader
)
20 if(stat(DEV_MULTICAM
, &sb
) == -1)
22 if(stat(reader
->device
, &sb
) == 0)
24 if(S_ISCHR(sb
.st_mode
))
26 int32_t dev_major
= major(sb
.st_rdev
);
27 int32_t dev_minor
= minor(sb
.st_rdev
);
28 if(dev_major
== 4 || dev_major
== 5)
31 switch(dev_minor
& 0x3F)
44 rdr_log_dbg(reader
, D_READER
, "device is major: %d, minor: %d, typ=%d", dev_major
, dev_minor
, reader
->typ
);
50 static int32_t db2com_init(struct s_reader
*reader
)
52 if(reader
->typ
!= R_DB2COM1
&& reader
->typ
!= R_DB2COM2
)
53 { detect_db2com_reader(reader
); }
55 reader
->handle
= open(reader
->device
, O_RDWR
| O_NOCTTY
| O_SYNC
);
56 if(reader
->handle
< 0)
58 rdr_log(reader
, "ERROR: Opening device %s (errno=%d %s)", reader
->device
, errno
, strerror(errno
));
61 if((reader
->fdmc
= open(DEV_MULTICAM
, O_RDWR
)) < 0)
63 rdr_log(reader
, "ERROR: Opening device %s (errno=%d %s)", DEV_MULTICAM
, errno
, strerror(errno
));
64 close(reader
->handle
);
67 if(Phoenix_Init(reader
))
69 rdr_log(reader
, "ERROR: Phoenix_Init returns error");
70 Phoenix_Close(reader
);
76 static int32_t db2com_get_status(struct s_reader
*reader
, int32_t *status
)
80 IO_Serial_Ioctl_Lock(reader
, 1);
81 ioctl(reader
->fdmc
, MULTICAM_GET_PCDAT
, &msr
);
82 if(reader
->typ
== R_DB2COM2
)
83 { *status
= !(msr
& 1); }
85 { *status
= (msr
& 0x0f00) == 0x0f00; }
86 IO_Serial_Ioctl_Lock(reader
, 0);
90 static bool db2com_DTR_RTS(struct s_reader
*reader
, int32_t *dtr
, int32_t *rts
)
94 uint16_t rts_bits
[2] = { 0x10, 0x800 };
95 uint16_t dtr_bits
[2] = {0x100, 0 };
96 int32_t mcport
= reader
->typ
== R_DB2COM2
;
98 rc
= ioctl(reader
->fdmc
, MULTICAM_GET_PCDAT
, &msr
);
104 rdr_log_dbg(reader
, D_DEVICE
, "%s DTR:%s", __func__
, *dtr
? "set" : "clear");
108 { msr
&= (uint16_t)(~dtr_bits
[mcport
]); }
110 { msr
|= dtr_bits
[mcport
]; }
111 rc
= ioctl(reader
->fdmc
, MULTICAM_SET_PCDAT
, &msr
);
115 rc
= 0; // Dummy, can't handle using multicam.o
121 rdr_log_dbg(reader
, D_DEVICE
, "%s RTS:%s", __func__
, *rts
? "set" : "clear");
123 { msr
&= (uint16_t)(~rts_bits
[mcport
]); }
125 { msr
|= rts_bits
[mcport
]; }
126 rc
= ioctl(reader
->fdmc
, MULTICAM_SET_PCDAT
, &msr
);
134 const struct s_cardreader cardreader_db2com
=
141 .reader_init
= db2com_init
,
142 .get_status
= db2com_get_status
,
143 .activate
= Phoenix_Reset
,
144 .transmit
= IO_Serial_Transmit
,
145 .receive
= IO_Serial_Receive
,
146 .close
= Phoenix_Close
,
147 .set_parity
= IO_Serial_SetParity
,
148 .set_baudrate
= IO_Serial_SetBaudrate
,
149 .set_DTS_RTS
= db2com_DTR_RTS
,