source: titan/titan/cadev.h @ 23994

Last change on this file since 23994 was 23206, checked in by nit, 11 years ago

[titan] revert

File size: 3.8 KB
Line 
1#ifndef CADEV_H
2#define CADEV_H
3
4struct dvbdev* caopen(int adapter)
5{
6        int fd = -1;
7        struct dvbdev* node = dvbdev;
8
9        while(node != NULL)
10        {
11                if(node->fd == -1 && node->type == CADEV && node->adapter == adapter)
12                        break;
13                node = node->next;
14        }
15
16        if(node != NULL)
17        {
18                if((fd = open(node->dev, O_RDWR | O_NONBLOCK)) < 0)
19                {
20                        debug(200, "open ca failed %s", node->dev);
21                        node = NULL;
22                }
23                else
24                {
25                        node->fd = fd;
26                        closeonexec(fd);
27                }
28        }
29
30        return node;
31}
32
33int caopendirect(char *cadev)
34{
35        int fd = -1;
36
37        if((fd = open(cadev, O_RDWR | O_NONBLOCK)) < 0)
38        {
39                debug(200, "open ca failed %s", cadev);
40        }
41
42        closeonexec(fd);
43        return fd;
44}
45
46void caclose(struct dvbdev* node, int fd)
47{
48        if(node != NULL)
49        {
50                close(node->fd);
51                node->fd = -1;
52        }
53        else
54                close(fd);
55}
56
57int cagetcaps(struct dvbdev* node, struct ca_caps* caps)
58{
59        if(node == NULL)
60        {
61                err("NULL detect");
62                return 1;
63        }
64
65        //caps.slot_num
66        //caps.slot_type
67        //caps.descr_num
68        //caps.descr_type
69
70        debug(200, "CA_GET_CAP");
71        if(ioctl(node->fd, CA_GET_CAP, caps) < 0)
72        {
73                perr("CA_GET_CAP");
74                return 1;
75        }
76
77        return 0;
78}
79
80int cagetmsg(struct dvbdev* node, struct ca_msg *msg)
81{
82        if(node == NULL)
83        {
84                err("NULL detect");
85                return 1;
86        }
87
88        debug(200, "CA_GET_MSG");
89        if(ioctl(node->fd, CA_GET_MSG, msg) < 0)
90        {
91                perr("CA_GET_MSG");
92                return 1;
93        }
94
95        return 0;
96}
97
98int casendmsg(struct dvbdev* node, struct ca_msg *msg)
99{
100        if(node == NULL)
101        {
102                err("NULL detect");
103                return 1;
104        }
105
106        debug(200, "CA_SEND_MSG");
107        if(ioctl(node->fd, CA_SEND_MSG, msg) < 0)
108        {
109                perr("CA_SEND_MSG");
110                return 1;
111        }
112
113        return 0;
114}
115
116int cagetdesc(struct dvbdev* node, struct ca_descr *descr)
117{
118        if(node == NULL)
119        {
120                err("NULL detect");
121                return 1;
122        }
123
124        debug(200, "CA_GET_DESCR_INFO");
125        if(ioctl(node->fd, CA_GET_DESCR_INFO, descr) < 0)
126        {
127                perr("CA_GET_DESCR_INFO");
128                return 1;
129        }
130
131        return 0;
132}
133
134int casetdesc(struct dvbdev* node, struct ca_descr *descr)
135{
136        if(node == NULL)
137        {
138                err("NULL detect");
139                return 1;
140        }
141
142        debug(200, "CA_SET_DESCR");
143        if(ioctl(node->fd, CA_SET_DESCR, descr) < 0)
144        {
145                perr("CA_SET_DESCR");
146                return 1;
147        }
148
149        return 0;
150}
151
152int casetpid(struct dvbdev* node, struct ca_pid *pid)
153{
154        if(node == NULL)
155        {
156                err("NULL detect");
157                return 1;
158        }
159
160        debug(200, "CA_SET_PID");
161        if(ioctl(node->fd, CA_SET_PID, pid) < 0)
162        {
163                perr("CA_SET_PID");
164                return 1;
165        }
166
167        return 0;
168}
169
170int careset(struct dvbdev* node, int slot)
171{
172        if(node == NULL)
173        {
174                err("NULL detect");
175                return 1;
176        }
177
178        debug(200, "CA_RESET");
179        if(ioctl(node->fd, CA_RESET, slot) < 0)
180        {
181                perr("CA_RESET");
182                return 1;
183        }
184
185        return 0;
186}
187
188int cagetslotinfo(struct dvbdev* node, ca_slot_info_t* info)
189{
190        if(node == NULL)
191        {
192                err("NULL detect");
193                return 1;
194        }
195
196        //info.num
197        //info.type
198        //info.flags (1:no, 2:present, 3:ready)
199
200        debug(200, "CA_GET_SLOT_INFO");
201        if(ioctl(node->fd, CA_GET_SLOT_INFO, info) < 0)
202        {
203                perr("CA_GET_SLOT_INFO");
204                return 1;
205        }
206
207        return 0;
208}
209
210//workaround for atemio500 and orf1 with unicam and orf card
211//without this artefakte
212void cainit(int fd)
213{
214        ca_descr_t cadescr;
215        unsigned char buf[8];
216
217        if(fd < 0) return;
218
219        memset(buf, 1, 8);
220        memset(&cadescr, 0, sizeof(cadescr));
221
222        cadescr.index = 0;
223        cadescr.parity = 0;
224        memcpy(cadescr.cw, buf, 8);
225
226        ioctl(fd, CA_SET_DESCR, &cadescr);
227
228        cadescr.parity = 1;
229        ioctl(fd, CA_SET_DESCR, &cadescr);
230}
231
232int cagetdev()
233{
234        int i, y, fd = -1, count = 0;
235        char *buf = NULL, *cadev = NULL;
236
237        cadev = getconfig("cadev", NULL);
238        if(cadev == NULL)
239        {
240                err("NULL detect");
241                return count;
242        }
243
244        buf = malloc(MINMALLOC);
245        if(buf == NULL)
246        {
247                err("no memory");
248                return count;
249        }
250
251        for(i = 0; i < MAXDVBADAPTER; i++)
252        {
253                for(y = 0; y < MAXCADEV; y++)
254                {
255                        sprintf(buf, cadev, i, y);
256                        fd = caopendirect(buf);
257                        if(fd >= 0)
258                        {
259                                cainit(fd);
260                                caclose(NULL, fd);
261                                count++;
262                                adddvbdev(buf, i, y, -1, CADEV, NULL, NULL, 0);
263                        }
264                }
265        }
266
267        free(buf);
268        return count;
269}
270
271#endif
Note: See TracBrowser for help on using the repository browser.