blob: 7bbc84f33a1303f36a212543378e8982364c367d [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{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080070 char node[32];
71 struct stat st;
72 int r;
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);
Gong Ked869dd72020-07-20 09:00:25 +080075
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080076 r = stat(node, &st);
77 if (r == -1)
78 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080079 int fd, source, input = 0;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080080 memset(node, 0, sizeof(node));
81 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
82 fd = open(node, O_WRONLY);
83 if (fd != -1)
84 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080085 if (src >= DVB_DEMUX_SOURCE_TS0 &&
86 src <= DVB_DEMUX_SOURCE_TS7) {
87 source = FRONTEND_TS0 + src - DVB_DEMUX_SOURCE_TS0;
hualing chen123c8332020-09-10 15:47:33 +080088 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080089 } else if (src >= DVB_DEMUX_SOURCE_DMA0 &&
90 src <= DVB_DEMUX_SOURCE_DMA7) {
91 source = DMA_0 + src - DVB_DEMUX_SOURCE_DMA0;
92 input = INPUT_LOCAL;
93 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0 &&
94 src <= DVB_DEMUX_SECSOURCE_DMA7) {
95 source = DMA_0 + src - DVB_DEMUX_SECSOURCE_DMA0;
96 input = INPUT_LOCAL_SEC;
97 } else if (src >= DVB_DEMUX_SOURCE_DMA0_1 &&
98 src <= DVB_DEMUX_SOURCE_DMA7_1) {
99 source = DMA_0_1 + src - DVB_DEMUX_SOURCE_DMA0_1;
100 input = INPUT_LOCAL;
101 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0_1 &&
102 src <= DVB_DEMUX_SECSOURCE_DMA7_1) {
103 source = DMA_0_1 + src - DVB_DEMUX_SECSOURCE_DMA0_1;
104 input = INPUT_LOCAL_SEC;
105 } else if (src >= DVB_DEMUX_SOURCE_TS0_1 &&
106 src <= DVB_DEMUX_SOURCE_TS7_1) {
107 source = FRONTEND_TS0_1 + src - DVB_DEMUX_SOURCE_TS0_1;
hualing chen123c8332020-09-10 15:47:33 +0800108 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800109 } else {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800110 assert(0);
111 }
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800112
hualing chen123c8332020-09-10 15:47:33 +0800113 if (ioctl(fd, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800114 {
Wentao MA96f68962022-06-15 19:45:35 +0800115 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800116 r = -1;
hualing chen123c8332020-09-10 15:47:33 +0800117 }
118 else
119 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800120 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 +0800121 r = 0;
hualing chen123c8332020-09-10 15:47:33 +0800122 }
123 if (ioctl(fd, DMX_SET_HW_SOURCE, source) == -1)
124 {
Wentao MA96f68962022-06-15 19:45:35 +0800125 DVR_INFO("dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
hualing chen123c8332020-09-10 15:47:33 +0800126 r = -1;
127 }
128 else
129 {
Wentao MAe8ba5172022-08-09 11:18:17 +0800130 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 +0800131 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800132 }
133 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800134 }
135 else
136 {
Wentao MA96f68962022-06-15 19:45:35 +0800137 DVR_INFO("dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800138 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800139 }
140 else
141 {
142 char *val;
Gong Ked869dd72020-07-20 09:00:25 +0800143
Gong Keb1771942021-11-27 10:42:56 +0800144 if (ciplus_enable)
145 {
146 char buf[32];
147 int i, out;
148
149 out = 0;
150
151 for (i = 0; i < 3; i ++)
152 {
153 DVB_DemuxSource_t dmx_src;
154
155 if (i == dmx_idx)
156 dmx_src = src;
157 else
158 dvb_get_demux_source(i, &dmx_src);
159 if (dmx_src != DVB_DEMUX_SOURCE_DMA0)
160 out |= 1 << i;
161 }
162
163 snprintf(buf, sizeof(buf), "%d", out);
164 dvr_file_echo("/sys/class/dmx/ciplus_output_ctrl", buf);
165 }
166
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800167 switch (src)
168 {
169 case DVB_DEMUX_SOURCE_TS0:
170 val = "ts0";
171 break;
172 case DVB_DEMUX_SOURCE_TS1:
173 val = "ts1";
174 break;
175 case DVB_DEMUX_SOURCE_TS2:
176 val = "ts2";
177 break;
178 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800179 case DVB_DEMUX_SOURCE_DMA1:
180 case DVB_DEMUX_SOURCE_DMA2:
181 case DVB_DEMUX_SOURCE_DMA3:
182 case DVB_DEMUX_SOURCE_DMA4:
183 case DVB_DEMUX_SOURCE_DMA5:
184 case DVB_DEMUX_SOURCE_DMA6:
185 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800186 val = "hiu";
187 break;
188 default:
189 assert(0);
190 }
Gong Ked869dd72020-07-20 09:00:25 +0800191
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800192 r = dvr_file_echo(node, val);
193 }
Gong Ked869dd72020-07-20 09:00:25 +0800194
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800195 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800196}
197
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800198/**
199 * Get the demux's input source.
200 * \param dmx_idx Demux device's index.
201 * \param point src that demux's input source.
202 * \retval 0 On success.
203 * \retval -1 On error.
204 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800205int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800206{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800207 char node[32] = {0};
208 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800209 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800210 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800211
212 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
213 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800214 if (r == -1)
215 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800216 int fd, source;
217 memset(node, 0, sizeof(node));
218 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
219 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800220 if (fd != -1)
221 {
222 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
223 {
224 switch (source)
225 {
226 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800227 *src = DVB_DEMUX_SOURCE_TS0;
228 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800229 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800230 *src = DVB_DEMUX_SOURCE_TS1;
231 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800232 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800233 *src = DVB_DEMUX_SOURCE_TS2;
234 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800235 case FRONTEND_TS3:
236 *src = DVB_DEMUX_SOURCE_TS3;
237 break;
238 case FRONTEND_TS4:
239 *src = DVB_DEMUX_SOURCE_TS4;
240 break;
241 case FRONTEND_TS5:
242 *src = DVB_DEMUX_SOURCE_TS5;
243 break;
244 case FRONTEND_TS6:
245 *src = DVB_DEMUX_SOURCE_TS6;
246 break;
247 case FRONTEND_TS7:
248 *src = DVB_DEMUX_SOURCE_TS7;
249 break;
250 case DMA_0:
251 *src = DVB_DEMUX_SOURCE_DMA0;
252 break;
253 case DMA_1:
254 *src = DVB_DEMUX_SOURCE_DMA1;
255 break;
256 case DMA_2:
257 *src = DVB_DEMUX_SOURCE_DMA2;
258 break;
259 case DMA_3:
260 *src = DVB_DEMUX_SOURCE_DMA3;
261 break;
262 case DMA_4:
263 *src = DVB_DEMUX_SOURCE_DMA4;
264 break;
265 case DMA_5:
266 *src = DVB_DEMUX_SOURCE_DMA5;
267 break;
268 case DMA_6:
269 *src = DVB_DEMUX_SOURCE_DMA6;
270 break;
271 case DMA_7:
272 *src = DVB_DEMUX_SOURCE_DMA7;
273 break;
chen.chen21cf8e2b2022-03-17 18:13:37 +0800274 case FRONTEND_TS0_1:
275 *src = DVB_DEMUX_SOURCE_TS0_1;
276 break;
277 case FRONTEND_TS1_1:
278 *src = DVB_DEMUX_SOURCE_TS1_1;
279 break;
280 case FRONTEND_TS2_1:
281 *src = DVB_DEMUX_SOURCE_TS2_1;
282 break;
283 case FRONTEND_TS3_1:
284 *src = DVB_DEMUX_SOURCE_TS3_1;
285 break;
286 case FRONTEND_TS4_1:
287 *src = DVB_DEMUX_SOURCE_TS4_1;
288 break;
289 case FRONTEND_TS5_1:
290 *src = DVB_DEMUX_SOURCE_TS5_1;
291 break;
292 case FRONTEND_TS6_1:
293 *src = DVB_DEMUX_SOURCE_TS6_1;
294 break;
295 case FRONTEND_TS7_1:
296 *src = DVB_DEMUX_SOURCE_TS7_1;
297 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800298 default:
299 assert(0);
300 }
301 }
302 else
303 {
Wentao MA96f68962022-06-15 19:45:35 +0800304 DVR_INFO("ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800305 }
306 close(fd);
307 }
308 else
309 {
Wentao MA96f68962022-06-15 19:45:35 +0800310 DVR_INFO("open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800311 }
312 }
313 else
314 {
315 r = dvr_file_read(node, buf, sizeof(buf));
316 if (r != -1)
317 {
318 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
319 {
320 sscanf(buf, "ts%d", &source_no);
321 switch (source_no)
322 {
323 case 0:
324 *src = DVB_DEMUX_SOURCE_TS0;
325 break;
326 case 1:
327 *src = DVB_DEMUX_SOURCE_TS1;
328 break;
329 case 2:
330 *src = DVB_DEMUX_SOURCE_TS2;
331 break;
332 default:
Wentao MA96f68962022-06-15 19:45:35 +0800333 DVR_INFO("do not support demux source:%s", buf);
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800334 r = -1;
335 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800336 }
337 }
338 else if (strncmp(buf, "hiu", 3) == 0)
339 {
340 *src = DVB_DEMUX_SOURCE_DMA0;
341 }
342 else
343 {
344 r = -1;
345 }
Wentao MA96f68962022-06-15 19:45:35 +0800346 DVR_INFO("dvb_get_demux_source \"%s\" :%s", node, buf);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800347 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800348 }
349
350 return r;
351}
hualing chenf9867402020-09-23 17:06:20 +0800352//check is device platform is used new dmx
353int dvr_check_dmx_isNew(void)
354{
355 char node[32];
356 struct stat st;
357 int r;
358
359 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
360
361 r = stat(node, &st);
362 if (r == -1)
363 {
364 return 1;
365 }
366 return 0;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800367}