blob: ac131f3192bcafd8181059fc543a76603cbda803 [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 {
wentao.maa210e5e2022-10-12 16:10:03 +080043 DVB_DemuxSource_t src = DVB_DEMUX_SOURCE_TS0;
Gong Keb1771942021-11-27 10:42:56 +080044
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};
Wentao MA4d85ff32022-09-23 11:36:18 +080072 int r = 0;
Gong Ked869dd72020-07-20 09:00:25 +080073
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080074 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Wentao MAb2070812022-09-02 13:10:03 +080075 snprintf(node2, sizeof(node2), "/dev/dvb0.demux%d", dmx_idx);
Gong Ked869dd72020-07-20 09:00:25 +080076
wentao.maa210e5e2022-10-12 16:10:03 +080077 int fd = open(node, O_RDONLY);
Wentao MAb2070812022-09-02 13:10:03 +080078 if (fd == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080079 {
wentao.maa210e5e2022-10-12 16:10:03 +080080 int source = 0;
81 int input = 0;
82 int fd2 = open(node2, O_WRONLY);
Wentao MAb2070812022-09-02 13:10:03 +080083 if (fd2 != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080084 {
wentao.maa210e5e2022-10-12 16:10:03 +080085 if (src <= DVB_DEMUX_SOURCE_TS7) {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080086 source = FRONTEND_TS0 + src - DVB_DEMUX_SOURCE_TS0;
hualing chen123c8332020-09-10 15:47:33 +080087 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080088 } else if (src >= DVB_DEMUX_SOURCE_DMA0 &&
89 src <= DVB_DEMUX_SOURCE_DMA7) {
90 source = DMA_0 + src - DVB_DEMUX_SOURCE_DMA0;
91 input = INPUT_LOCAL;
92 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0 &&
93 src <= DVB_DEMUX_SECSOURCE_DMA7) {
94 source = DMA_0 + src - DVB_DEMUX_SECSOURCE_DMA0;
95 input = INPUT_LOCAL_SEC;
96 } else if (src >= DVB_DEMUX_SOURCE_DMA0_1 &&
97 src <= DVB_DEMUX_SOURCE_DMA7_1) {
98 source = DMA_0_1 + src - DVB_DEMUX_SOURCE_DMA0_1;
99 input = INPUT_LOCAL;
100 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0_1 &&
101 src <= DVB_DEMUX_SECSOURCE_DMA7_1) {
102 source = DMA_0_1 + src - DVB_DEMUX_SECSOURCE_DMA0_1;
103 input = INPUT_LOCAL_SEC;
104 } else if (src >= DVB_DEMUX_SOURCE_TS0_1 &&
105 src <= DVB_DEMUX_SOURCE_TS7_1) {
106 source = FRONTEND_TS0_1 + src - DVB_DEMUX_SOURCE_TS0_1;
hualing chen123c8332020-09-10 15:47:33 +0800107 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800108 } else {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800109 assert(0);
110 }
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800111
Wentao MAb2070812022-09-02 13:10:03 +0800112 if (ioctl(fd2, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800113 {
Wentao MA96f68962022-06-15 19:45:35 +0800114 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800115 r = -1;
hualing chen123c8332020-09-10 15:47:33 +0800116 }
117 else
118 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800119 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 +0800120 r = 0;
hualing chen123c8332020-09-10 15:47:33 +0800121 }
Wentao MAb2070812022-09-02 13:10:03 +0800122 if (ioctl(fd2, DMX_SET_HW_SOURCE, source) == -1)
hualing chen123c8332020-09-10 15:47:33 +0800123 {
Wentao MA96f68962022-06-15 19:45:35 +0800124 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
hualing chen123c8332020-09-10 15:47:33 +0800125 r = -1;
126 }
127 else
128 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800129 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 +0800130 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800131 }
Wentao MAb2070812022-09-02 13:10:03 +0800132 close(fd2);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800133 }
134 else
135 {
Wentao MAb2070812022-09-02 13:10:03 +0800136 DVR_ERROR("dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800137 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800138 }
139 else
140 {
wentao.maa210e5e2022-10-12 16:10:03 +0800141 char *val = NULL;
Gong Ked869dd72020-07-20 09:00:25 +0800142
Wentao MAb2070812022-09-02 13:10:03 +0800143 close(fd);
144
Gong Keb1771942021-11-27 10:42:56 +0800145 if (ciplus_enable)
146 {
147 char buf[32];
148 int i, out;
149
150 out = 0;
151
152 for (i = 0; i < 3; i ++)
153 {
wentao.maa210e5e2022-10-12 16:10:03 +0800154 DVB_DemuxSource_t dmx_src = DVB_DEMUX_SOURCE_TS0;
Gong Keb1771942021-11-27 10:42:56 +0800155
156 if (i == dmx_idx)
157 dmx_src = src;
158 else
159 dvb_get_demux_source(i, &dmx_src);
160 if (dmx_src != DVB_DEMUX_SOURCE_DMA0)
161 out |= 1 << i;
162 }
163
164 snprintf(buf, sizeof(buf), "%d", out);
165 dvr_file_echo("/sys/class/dmx/ciplus_output_ctrl", buf);
166 }
167
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800168 switch (src)
169 {
170 case DVB_DEMUX_SOURCE_TS0:
shenghui.geng96791f02023-04-13 10:11:55 +0800171 case DVB_DEMUX_SOURCE_TS0_1:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800172 val = "ts0";
173 break;
174 case DVB_DEMUX_SOURCE_TS1:
shenghui.geng96791f02023-04-13 10:11:55 +0800175 case DVB_DEMUX_SOURCE_TS1_1:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800176 val = "ts1";
177 break;
178 case DVB_DEMUX_SOURCE_TS2:
shenghui.geng96791f02023-04-13 10:11:55 +0800179 case DVB_DEMUX_SOURCE_TS2_1:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800180 val = "ts2";
181 break;
182 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800183 case DVB_DEMUX_SOURCE_DMA1:
184 case DVB_DEMUX_SOURCE_DMA2:
185 case DVB_DEMUX_SOURCE_DMA3:
186 case DVB_DEMUX_SOURCE_DMA4:
187 case DVB_DEMUX_SOURCE_DMA5:
188 case DVB_DEMUX_SOURCE_DMA6:
189 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800190 val = "hiu";
191 break;
192 default:
193 assert(0);
194 }
Gong Ked869dd72020-07-20 09:00:25 +0800195
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800196 r = dvr_file_echo(node, val);
197 }
Gong Ked869dd72020-07-20 09:00:25 +0800198
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800199 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800200}
201
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800202/**
203 * Get the demux's input source.
204 * \param dmx_idx Demux device's index.
205 * \param point src that demux's input source.
206 * \retval 0 On success.
207 * \retval -1 On error.
208 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800209int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800210{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800211 char node[32] = {0};
Wentao MAb2070812022-09-02 13:10:03 +0800212 char node2[20] = {0};
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800213 char buf[32] = {0};
Wentao MA4d85ff32022-09-23 11:36:18 +0800214 int r = 0;
215 int source_no = 0;
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
wentao.maa210e5e2022-10-12 16:10:03 +0800220 int fd = open(node, O_RDONLY);
Wentao MAb2070812022-09-02 13:10:03 +0800221 if (fd == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800222 {
Wentao MAb2070812022-09-02 13:10:03 +0800223 int source;
wentao.maa210e5e2022-10-12 16:10:03 +0800224 int fd2 = open(node2, O_RDONLY);
Wentao MAb2070812022-09-02 13:10:03 +0800225 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}
Yahui Hana1787d42023-08-01 15:04:59 +0800374
375//check if demux driver ts_clone enabled
376int dvr_ts_clone_enable(void)
377{
378 char node[32] = "/sys/class/dmx/ts_clone";
379 char buf[32] = {0};
380 int ts_clone_enable = 0;
381 int r;
382
383 r = dvr_file_read(node, buf, sizeof(buf));
384 if (r != -1)
385 {
386 sscanf(buf, "ts clone %d", &ts_clone_enable);
387 return ts_clone_enable;
388 }
389
390 return 0;
391}