source: titan/titan/cadev.h @ 40896

Last change on this file since 40896 was 38123, checked in by gost, 8 years ago

mipsel reset ca

File size: 3.5 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(201, "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(201, "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(201, "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(201, "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(201, "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(201, "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(201, "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(201, "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(201, "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
188//workaround for atemio500 and orf1 with unicam and orf card
189//without this artefakte
190void cainit(int fd)
191{
192        ca_descr_t cadescr;
193        unsigned char buf[8];
194
195        if(fd < 0) return;
196
197        memset(buf, 1, 8);
198        memset(&cadescr, 0, sizeof(cadescr));
199
200        cadescr.index = 0;
201        cadescr.parity = 0;
202        memcpy(cadescr.cw, buf, 8);
203
204        ioctl(fd, CA_SET_DESCR, &cadescr);
205
206        cadescr.parity = 1;
207        ioctl(fd, CA_SET_DESCR, &cadescr);
208}
209
210int cagetdev()
211{
212        int i, y, fd = -1, count = 0;
213        char *buf = NULL, *cadev = NULL;
214
215        cadev = getconfig("cadev", NULL);
216        if(cadev == NULL)
217        {
218                err("NULL detect");
219                return count;
220        }
221
222        buf = malloc(MINMALLOC);
223        if(buf == NULL)
224        {
225                err("no memory");
226                return count;
227        }
228
229        for(i = 0; i < MAXDVBADAPTER; i++)
230        {
231                for(y = 0; y < MAXCADEV; y++)
232                {
233                        sprintf(buf, cadev, i, y);
234                        fd = caopendirect(buf);
235                        if(fd >= 0)
236                        {
237#ifndef MIPSEL
238                                cainit(fd);
239#endif
240                                caclose(NULL, fd);
241                                count++;
242                                adddvbdev(buf, i, y, -1, CADEV, NULL, NULL, NULL, 0);
243                        }
244                }
245        }
246
247        free(buf);
248        return count;
249}
250
251#endif
Note: See TracBrowser for help on using the repository browser.