Merge branch 'WirelessLanSetup' into vuplus_experimental
[vuplus_dvbapp] / lib / driver / sc_test.cpp
1 #include <lib/dvb/dvb.h>\r
2 #include <lib/dvb/frontendparms.h>\r
3 \r
4 #include <stdio.h>\r
5 #include <stdlib.h>\r
6 #include <limits.h>\r
7 #include <string.h>\r
8 #include <errno.h>\r
9 #include <sys/ioctl.h>\r
10 #include <sys/types.h>\r
11 #include <sys/stat.h>\r
12 #include <sys/poll.h>\r
13 #include <fcntl.h>\r
14 #include <time.h>\r
15 #include <unistd.h>\r
16 #include <termios.h>\r
17 #include <lib/driver/sc_test.h>\r
18 #include <errno.h>\r
19 #include <lib/base/eerror.h>\r
20 #include <lib/base/estring.h>\r
21 \r
22 #include <stdint.h>\r
23 #include <sys/time.h>\r
24 #include <poll.h>\r
25 \r
26 \r
27 #define SC_CHECK_TIMEOUT        5\r
28 #define SC_REMOVE_TIMEOUT       10\r
29 \r
30 \r
31 #define SMART_CARD0     "/dev/sci0"                     /* upper smart card */\r
32 #define SMART_CARD1     "/dev/sci1"                     /* lower smart card */\r
33 \r
34 #define SC_SUCCESS                      0\r
35 #define NO_DEV_FOUND            -1\r
36 #define SC_NOT_INSERTED -2\r
37 #define SC_NOT_VALID_ATR        -3\r
38 #define SC_NOT_REMOVED          -4\r
39 #define SC_READ_TIMEOUT -5\r
40 \r
41 \r
42 #define SCI_IOW_MAGIC                   's'\r
43 \r
44 /* ioctl cmd table */\r
45 //#include "sci_global.h"\r
46 #define IOCTL_SET_RESET                 _IOW(SCI_IOW_MAGIC, 1,  unsigned long)\r
47 #define IOCTL_SET_MODES                 _IOW(SCI_IOW_MAGIC, 2,  SCI_MODES)\r
48 #define IOCTL_GET_MODES                 _IOW(SCI_IOW_MAGIC, 3,  SCI_MODES)\r
49 #define IOCTL_SET_PARAMETERS            _IOW(SCI_IOW_MAGIC, 4,  SCI_PARAMETERS)\r
50 #define IOCTL_GET_PARAMETERS            _IOW(SCI_IOW_MAGIC, 5,  SCI_PARAMETERS)\r
51 #define IOCTL_SET_CLOCK_START           _IOW(SCI_IOW_MAGIC, 6,  unsigned long)\r
52 #define IOCTL_SET_CLOCK_STOP            _IOW(SCI_IOW_MAGIC, 7,  unsigned long)\r
53 #define IOCTL_GET_IS_CARD_PRESENT       _IOW(SCI_IOW_MAGIC, 8,  unsigned long)\r
54 #define IOCTL_GET_IS_CARD_ACTIVATED     _IOW(SCI_IOW_MAGIC, 9,  unsigned long)\r
55 #define IOCTL_SET_DEACTIVATE            _IOW(SCI_IOW_MAGIC, 10, unsigned long)\r
56 #define IOCTL_SET_ATR_READY             _IOW(SCI_IOW_MAGIC, 11, unsigned long)\r
57 #define IOCTL_GET_ATR_STATUS            _IOW(SCI_IOW_MAGIC, 12, unsigned long)\r
58 #define IOCTL_DUMP_REGS                 _IOW(SCI_IOW_MAGIC, 20, unsigned long)\r
59 \r
60 eSctest *eSctest::instance;\r
61 \r
62 eSctest::eSctest()\r
63 {\r
64         instance = this;\r
65 \r
66 }\r
67 \r
68 eSctest::~eSctest()\r
69 {\r
70         instance=NULL;\r
71 \r
72 }\r
73 \r
74 int eSctest::n_check_smart_card(char *dev_name)\r
75 {\r
76         int fd;\r
77         struct pollfd pollfd;\r
78         unsigned char buf[64];\r
79         int cnt = 0;\r
80         int modem_status;\r
81         int count = SC_CHECK_TIMEOUT;\r
82         int readok=0;\r
83         \r
84         fd = ::open(dev_name, O_RDWR);\r
85         \r
86         if(fd < 0){\r
87                 eDebug("sci0 open error\n");\r
88                 return NO_DEV_FOUND;\r
89         }\r
90         else\r
91                 eDebug("sci0 is opened fd : %d\n", fd);\r
92 \r
93 \r
94         ::ioctl(fd, IOCTL_GET_IS_CARD_PRESENT, &modem_status);\r
95 \r
96         if( modem_status )\r
97                 eDebug("card is now inserted\n");\r
98         else\r
99         {\r
100                 eDebug("card is NOT inserted\n");\r
101                 ::close(fd);\r
102                 return SC_NOT_INSERTED;\r
103         }\r
104 \r
105         /* now smart card is inserted, let's do reset */\r
106 \r
107         ::ioctl(fd, IOCTL_SET_RESET, &modem_status);\r
108 \r
109         /* now we can get the ATR */\r
110 \r
111         pollfd.fd = fd;\r
112         pollfd.events = POLLIN|POLLOUT|POLLERR|POLLPRI;\r
113 \r
114 \r
115         while(poll(&pollfd, 1, 1000)>=0 && count--){\r
116 \r
117                 eDebug("pollfd.revents : 0x%x\n", pollfd.revents);\r
118                 if(pollfd.revents & POLLIN){\r
119                         eDebug(">>read \n");\r
120                         cnt = read(fd, buf, 64);\r
121                         eDebug("<<read cnt:%d\n", cnt);                 \r
122                         if(cnt) \r
123                         {\r
124                                 if(buf[0]==0x3b||buf[0]==0x3f)\r
125                                 {\r
126                                         eDebug("read -%d : 0x%x",cnt, buf[0]);\r
127                                         readok = 1;\r
128                                 }\r
129                                 break;\r
130                         }\r
131                         else\r
132                                 eDebug("no data\n");\r
133                 }\r
134         }\r
135 \r
136         ::close(fd);\r
137         \r
138         if (readok == 0) return SC_NOT_VALID_ATR;\r
139         if(!count) return SC_READ_TIMEOUT;\r
140         return SC_SUCCESS;\r
141 }\r
142 \r
143 int eSctest::check_smart_card(char *dev_name)\r
144 {\r
145         int fd;\r
146         struct pollfd pollfd;\r
147         unsigned char buf[64];\r
148         int cnt = 0;\r
149         int modem_status;\r
150         int count = SC_CHECK_TIMEOUT;\r
151         int readok=0;\r
152         fd = ::open(dev_name, O_RDWR);\r
153         \r
154         if(fd < 0){\r
155                 eDebug("sci0 open error");\r
156                 return NO_DEV_FOUND;\r
157         }\r
158         else\r
159                 eDebug("sci0 is opened fd : %d", fd);\r
160 \r
161         ::tcflush(fd, TCIFLUSH);\r
162 \r
163         ::ioctl(fd, TIOCMGET, &modem_status);\r
164 \r
165         if( modem_status & TIOCM_CAR)\r
166                 eDebug("card is now inserted");\r
167         else\r
168         {\r
169                 eDebug("card is NOT inserted");\r
170                 close(fd);\r
171                 return SC_NOT_INSERTED;\r
172         }\r
173 \r
174         /* now smart card is inserted, let's do reset */\r
175 \r
176         modem_status |= TIOCM_RTS;\r
177         ::ioctl(fd, TIOCMSET, &modem_status);\r
178 \r
179         modem_status &= ~TIOCM_RTS;\r
180         ::ioctl(fd, TIOCMSET, &modem_status);\r
181 \r
182 \r
183         /* now we can get the ATR */\r
184 \r
185         pollfd.fd = fd;\r
186         pollfd.events = POLLIN|POLLOUT|POLLERR|POLLPRI;\r
187 \r
188 \r
189         while(poll(&pollfd, 1, 1000)>=0 && count--){\r
190 \r
191                 eDebug("pollfd.revents : 0x%x %d", pollfd.revents,count);\r
192                 if(pollfd.revents & POLLIN){\r
193                         eDebug(">>read ");\r
194                         cnt = ::read(fd, buf, 64);\r
195                         eDebug("<<read cnt:%d", cnt);\r
196                         if(cnt) \r
197                         {\r
198                                 int i;\r
199                                 for( i = 0 ; i < cnt ; i ++)\r
200                                 {\r
201                                         if(buf[i]!=0x0)\r
202                                                 readok = 1;\r
203                                         eDebug("read : 0x%x", buf[i]);\r
204                                 }\r
205                                 break;\r
206                         }\r
207                         else\r
208                                 eDebug("no data");\r
209                 }\r
210         }\r
211         \r
212         ::close(fd);\r
213         eDebug("readok = %d",readok);\r
214         if (readok == 0) return SC_NOT_VALID_ATR;\r
215         if(count<=0 ) return SC_READ_TIMEOUT;\r
216         return SC_SUCCESS;\r
217 }\r
218 int eSctest::eject_smart_card(char *dev_name)\r
219 {\r
220         int fd;\r
221         struct pollfd pollfd;\r
222         unsigned char buf[64];\r
223         int cnt = 0;\r
224         int modem_status;\r
225         int count = SC_CHECK_TIMEOUT;\r
226         \r
227         fd = ::open(dev_name, O_RDWR);\r
228         \r
229         if(fd < 0){\r
230                 eDebug("sci0 open error");\r
231                 return NO_DEV_FOUND;\r
232         }\r
233         else\r
234                 eDebug("sci0 is opened fd : %d", fd);\r
235 \r
236         ::tcflush(fd, TCIFLUSH);\r
237 \r
238         ::ioctl(fd, TIOCMGET, &modem_status);\r
239 \r
240         if( modem_status & TIOCM_CAR)\r
241                 eDebug("card is now inserted");\r
242         else\r
243         {\r
244                 eDebug("card is NOT inserted");\r
245                 close(fd);\r
246                 return SC_NOT_INSERTED;\r
247         }\r
248         /* now we can get the ATR */\r
249 \r
250         pollfd.fd = fd;\r
251         pollfd.events = POLLIN|POLLOUT|POLLERR|POLLPRI;\r
252 \r
253         /* let's wait until card is removed for count secs.*/\r
254         count = SC_REMOVE_TIMEOUT;      \r
255         do{\r
256                 ::ioctl(fd, TIOCMGET, &modem_status);\r
257                 eDebug("modem_status : 0x%x %d", modem_status,count);\r
258                 sleep(1);       \r
259 \r
260         }\r
261         while((modem_status&TIOCM_CAR) && count--);\r
262 \r
263         if(count<=0 ) return SC_NOT_REMOVED;\r
264         \r
265         ::close(fd);            \r
266         return SC_SUCCESS;\r
267 }\r
268 \r
269 \r
270 int eSctest::VFD_Open()\r
271 {\r
272         VFD_fd = open("/dev/dbox/lcd0", O_RDWR);\r
273         return VFD_fd;\r
274 }\r
275 \r
276 int eSctest::turnon_VFD()\r
277\r
278         ioctl(VFD_fd, 0xa0a0a0a0, 0);\r
279 }\r
280 \r
281 int eSctest::turnoff_VFD()\r
282 {\r
283         ioctl(VFD_fd, 0x01010101, 0);   \r
284 }\r
285 \r
286 void eSctest::VFD_Close()\r
287 {\r
288         close(VFD_fd);\r
289 }\r
290 \r
291 extern int frontend0_fd;\r
292 extern int frontend1_fd;\r
293 \r
294 int eSctest::getFrontendstatus(int fe)\r
295 {\r
296         fe_status_t status;\r
297 \r
298         int m_fd;\r
299         int res;\r
300 \r
301         if (fe == 0)\r
302                 m_fd = frontend0_fd;\r
303         else if (fe==1)\r
304                 m_fd = frontend1_fd;\r
305         else \r
306                 return -1;\r
307 \r
308         if (m_fd < 0)\r
309         {\r
310                 eDebug("%d open error ",fe);\r
311                 return -1;\r
312         }\r
313         else\r
314                 eDebug("%d open ok!!!! ",m_fd);\r
315         \r
316         if ( ioctl(m_fd, FE_READ_STATUS, &status) < 0)\r
317                 eDebug("%d read error ",fe);            \r
318 \r
319         if (status&FE_HAS_LOCK)\r
320                 return 1;\r
321         else\r
322                 return 0;\r
323 \r
324 }\r
325 \r