blob: aecf126a33e5da0eb18b42471de47a36e70f59bd [file] [log] [blame]
Gong Ked869dd72020-07-20 09:00:25 +08001#include <stddef.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <unistd.h>
Chuanzhi Wang670fc042020-08-12 11:11:04 +08008#include <fcntl.h>
Gong Ked869dd72020-07-20 09:00:25 +08009#include <assert.h>
10
11#include "dvr_types.h"
12#include "dvb_utils.h"
13#include "dvr_utils.h"
14
Chuanzhi Wang670fc042020-08-12 11:11:04 +080015#include <dmx.h>
16
Gong Keb1771942021-11-27 10:42:56 +080017static int ciplus_enable = 0;
18
19/**
20 * Enable/disable CIplus mode.
21 * \param enable Enable/disable.
22 * \retval 0 On success.
23 * \retval -1 On error.
24 */
25int dvb_enable_ciplus(int enable)
26{
27 int out;
28 char buf[32];
29
30 ciplus_enable = enable;
31
32 if (dvr_check_dmx_isNew())
33 return 0;
34
35 if (enable)
36 {
37 int i;
38
39 out = 0;
40
41 for (i = 0; i < 3; i ++)
42 {
43 DVB_DemuxSource_t src;
44
45 dvb_get_demux_source(i, &src);
46 if (src != DVB_DEMUX_SOURCE_DMA0)
47 out |= 1 << i;
48 }
49 }
50 else
51 {
52 out = 8;
53 }
54
55 snprintf(buf, sizeof(buf), "%d", out);
56 dvr_file_echo("/sys/class/dmx/ciplus_output_ctrl", buf);
57
58 return 0;
59}
60
Gong Ked869dd72020-07-20 09:00:25 +080061/**
62 * Set the demux's input source.
63 * \param dmx_idx Demux device's index.
64 * \param src The demux's input source.
65 * \retval 0 On success.
66 * \retval -1 On error.
67 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080068int dvb_set_demux_source(int dmx_idx, DVB_DemuxSource_t src)
Gong Ked869dd72020-07-20 09:00:25 +080069{
Wentao MAb2070812022-09-02 13:10:03 +080070 char node[32] = {0};
71 char node2[20] = {0};
72 int fd = -1;
73 int fd2 = -1;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080074 int r;
Gong Ked869dd72020-07-20 09:00:25 +080075
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080076 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Wentao MAb2070812022-09-02 13:10:03 +080077 snprintf(node2, sizeof(node2), "/dev/dvb0.demux%d", dmx_idx);
Gong Ked869dd72020-07-20 09:00:25 +080078
Wentao MAb2070812022-09-02 13:10:03 +080079 fd = open(node, O_RDONLY);
80 if (fd == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080081 {
Wentao MAb2070812022-09-02 13:10:03 +080082 int source, input = 0;
83 fd2 = open(node2, O_WRONLY);
84 if (fd2 != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080085 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080086 if (src >= DVB_DEMUX_SOURCE_TS0 &&
87 src <= DVB_DEMUX_SOURCE_TS7) {
88 source = FRONTEND_TS0 + src - DVB_DEMUX_SOURCE_TS0;
hualing chen123c8332020-09-10 15:47:33 +080089 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080090 } else if (src >= DVB_DEMUX_SOURCE_DMA0 &&
91 src <= DVB_DEMUX_SOURCE_DMA7) {
92 source = DMA_0 + src - DVB_DEMUX_SOURCE_DMA0;
93 input = INPUT_LOCAL;
94 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0 &&
95 src <= DVB_DEMUX_SECSOURCE_DMA7) {
96 source = DMA_0 + src - DVB_DEMUX_SECSOURCE_DMA0;
97 input = INPUT_LOCAL_SEC;
98 } else if (src >= DVB_DEMUX_SOURCE_DMA0_1 &&
99 src <= DVB_DEMUX_SOURCE_DMA7_1) {
100 source = DMA_0_1 + src - DVB_DEMUX_SOURCE_DMA0_1;
101 input = INPUT_LOCAL;
102 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0_1 &&
103 src <= DVB_DEMUX_SECSOURCE_DMA7_1) {
104 source = DMA_0_1 + src - DVB_DEMUX_SECSOURCE_DMA0_1;
105 input = INPUT_LOCAL_SEC;
106 } else if (src >= DVB_DEMUX_SOURCE_TS0_1 &&
107 src <= DVB_DEMUX_SOURCE_TS7_1) {
108 source = FRONTEND_TS0_1 + src - DVB_DEMUX_SOURCE_TS0_1;
hualing chen123c8332020-09-10 15:47:33 +0800109 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800110 } else {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800111 assert(0);
112 }
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800113
Wentao MAb2070812022-09-02 13:10:03 +0800114 if (ioctl(fd2, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800115 {
Wentao MA96f68962022-06-15 19:45:35 +0800116 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800117 r = -1;
hualing chen123c8332020-09-10 15:47:33 +0800118 }
119 else
120 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800121 DVR_INFO("dvb_set_demux_source ioctl succeeded src:%d DMX_SET_INPUT:%d dmx_idx:%d", src, input, dmx_idx);
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800122 r = 0;
hualing chen123c8332020-09-10 15:47:33 +0800123 }
Wentao MAb2070812022-09-02 13:10:03 +0800124 if (ioctl(fd2, DMX_SET_HW_SOURCE, source) == -1)
hualing chen123c8332020-09-10 15:47:33 +0800125 {
Wentao MA96f68962022-06-15 19:45:35 +0800126 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
hualing chen123c8332020-09-10 15:47:33 +0800127 r = -1;
128 }
129 else
130 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800131 DVR_INFO("dvb_set_demux_source ioctl succeeded src:%d DMX_SET_HW_SOURCE:%d dmx_idx:%d", src, source, dmx_idx);
hualing chen123c8332020-09-10 15:47:33 +0800132 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800133 }
Wentao MAb2070812022-09-02 13:10:03 +0800134 close(fd2);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800135 }
136 else
137 {
Wentao MAb2070812022-09-02 13:10:03 +0800138 DVR_ERROR("dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800139 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800140 }
141 else
142 {
143 char *val;
Gong Ked869dd72020-07-20 09:00:25 +0800144
Wentao MAb2070812022-09-02 13:10:03 +0800145 close(fd);
146
Gong Keb1771942021-11-27 10:42:56 +0800147 if (ciplus_enable)
148 {
149 char buf[32];
150 int i, out;
151
152 out = 0;
153
154 for (i = 0; i < 3; i ++)
155 {
156 DVB_DemuxSource_t dmx_src;
157
158 if (i == dmx_idx)
159 dmx_src = src;
160 else
161 dvb_get_demux_source(i, &dmx_src);
162 if (dmx_src != DVB_DEMUX_SOURCE_DMA0)
163 out |= 1 << i;
164 }
165
166 snprintf(buf, sizeof(buf), "%d", out);
167 dvr_file_echo("/sys/class/dmx/ciplus_output_ctrl", buf);
168 }
169
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800170 switch (src)
171 {
172 case DVB_DEMUX_SOURCE_TS0:
173 val = "ts0";
174 break;
175 case DVB_DEMUX_SOURCE_TS1:
176 val = "ts1";
177 break;
178 case DVB_DEMUX_SOURCE_TS2:
179 val = "ts2";
180 break;
181 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800182 case DVB_DEMUX_SOURCE_DMA1:
183 case DVB_DEMUX_SOURCE_DMA2:
184 case DVB_DEMUX_SOURCE_DMA3:
185 case DVB_DEMUX_SOURCE_DMA4:
186 case DVB_DEMUX_SOURCE_DMA5:
187 case DVB_DEMUX_SOURCE_DMA6:
188 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800189 val = "hiu";
190 break;
191 default:
192 assert(0);
193 }
Gong Ked869dd72020-07-20 09:00:25 +0800194
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800195 r = dvr_file_echo(node, val);
196 }
Gong Ked869dd72020-07-20 09:00:25 +0800197
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800198 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800199}
200
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800201/**
202 * Get the demux's input source.
203 * \param dmx_idx Demux device's index.
204 * \param point src that demux's input source.
205 * \retval 0 On success.
206 * \retval -1 On error.
207 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800208int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800209{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800210 char node[32] = {0};
Wentao MAb2070812022-09-02 13:10:03 +0800211 char node2[20] = {0};
212 int fd = -1;
213 int fd2 = -1;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800214 char buf[32] = {0};
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800215 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800216
217 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Wentao MAb2070812022-09-02 13:10:03 +0800218 snprintf(node2, sizeof(node2), "/dev/dvb0.demux%d", dmx_idx);
219
220 fd = open(node, O_RDONLY);
221 if (fd == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800222 {
Wentao MAb2070812022-09-02 13:10:03 +0800223 int source;
224 fd2 = open(node2, O_RDONLY);
225 if (fd2 != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800226 {
Wentao MAb2070812022-09-02 13:10:03 +0800227 if (ioctl(fd2, DMX_GET_HW_SOURCE, &source) != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800228 {
229 switch (source)
230 {
231 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800232 *src = DVB_DEMUX_SOURCE_TS0;
233 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800234 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800235 *src = DVB_DEMUX_SOURCE_TS1;
236 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800237 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800238 *src = DVB_DEMUX_SOURCE_TS2;
239 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800240 case FRONTEND_TS3:
241 *src = DVB_DEMUX_SOURCE_TS3;
242 break;
243 case FRONTEND_TS4:
244 *src = DVB_DEMUX_SOURCE_TS4;
245 break;
246 case FRONTEND_TS5:
247 *src = DVB_DEMUX_SOURCE_TS5;
248 break;
249 case FRONTEND_TS6:
250 *src = DVB_DEMUX_SOURCE_TS6;
251 break;
252 case FRONTEND_TS7:
253 *src = DVB_DEMUX_SOURCE_TS7;
254 break;
255 case DMA_0:
256 *src = DVB_DEMUX_SOURCE_DMA0;
257 break;
258 case DMA_1:
259 *src = DVB_DEMUX_SOURCE_DMA1;
260 break;
261 case DMA_2:
262 *src = DVB_DEMUX_SOURCE_DMA2;
263 break;
264 case DMA_3:
265 *src = DVB_DEMUX_SOURCE_DMA3;
266 break;
267 case DMA_4:
268 *src = DVB_DEMUX_SOURCE_DMA4;
269 break;
270 case DMA_5:
271 *src = DVB_DEMUX_SOURCE_DMA5;
272 break;
273 case DMA_6:
274 *src = DVB_DEMUX_SOURCE_DMA6;
275 break;
276 case DMA_7:
277 *src = DVB_DEMUX_SOURCE_DMA7;
278 break;
chen.chen21cf8e2b2022-03-17 18:13:37 +0800279 case FRONTEND_TS0_1:
280 *src = DVB_DEMUX_SOURCE_TS0_1;
281 break;
282 case FRONTEND_TS1_1:
283 *src = DVB_DEMUX_SOURCE_TS1_1;
284 break;
285 case FRONTEND_TS2_1:
286 *src = DVB_DEMUX_SOURCE_TS2_1;
287 break;
288 case FRONTEND_TS3_1:
289 *src = DVB_DEMUX_SOURCE_TS3_1;
290 break;
291 case FRONTEND_TS4_1:
292 *src = DVB_DEMUX_SOURCE_TS4_1;
293 break;
294 case FRONTEND_TS5_1:
295 *src = DVB_DEMUX_SOURCE_TS5_1;
296 break;
297 case FRONTEND_TS6_1:
298 *src = DVB_DEMUX_SOURCE_TS6_1;
299 break;
300 case FRONTEND_TS7_1:
301 *src = DVB_DEMUX_SOURCE_TS7_1;
302 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800303 default:
304 assert(0);
305 }
306 }
307 else
308 {
Wentao MAb2070812022-09-02 13:10:03 +0800309 DVR_ERROR("ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800310 }
Wentao MAb2070812022-09-02 13:10:03 +0800311 close(fd2);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800312 }
313 else
314 {
Wentao MAb2070812022-09-02 13:10:03 +0800315 DVR_ERROR("opening \"%s\" failed with errno:%d", node2, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800316 }
317 }
318 else
319 {
Wentao MAb2070812022-09-02 13:10:03 +0800320 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800321 r = dvr_file_read(node, buf, sizeof(buf));
322 if (r != -1)
323 {
324 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
325 {
326 sscanf(buf, "ts%d", &source_no);
327 switch (source_no)
328 {
329 case 0:
330 *src = DVB_DEMUX_SOURCE_TS0;
331 break;
332 case 1:
333 *src = DVB_DEMUX_SOURCE_TS1;
334 break;
335 case 2:
336 *src = DVB_DEMUX_SOURCE_TS2;
337 break;
338 default:
Wentao MA96f68962022-06-15 19:45:35 +0800339 DVR_INFO("do not support demux source:%s", buf);
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800340 r = -1;
341 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800342 }
343 }
344 else if (strncmp(buf, "hiu", 3) == 0)
345 {
346 *src = DVB_DEMUX_SOURCE_DMA0;
347 }
348 else
349 {
350 r = -1;
351 }
Wentao MA96f68962022-06-15 19:45:35 +0800352 DVR_INFO("dvb_get_demux_source \"%s\" :%s", node, buf);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800353 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800354 }
355
356 return r;
357}
hualing chenf9867402020-09-23 17:06:20 +0800358//check is device platform is used new dmx
359int dvr_check_dmx_isNew(void)
360{
361 char node[32];
362 struct stat st;
363 int r;
364
365 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
366
367 r = stat(node, &st);
368 if (r == -1)
369 {
370 return 1;
371 }
372 return 0;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800373}