blob: 6e638b8ab6c640ae85cc5253d85b0eedde72c7ba [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;
Wentao MA4d85ff32022-09-23 11:36:18 +080074 int r = 0;
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};
Wentao MA4d85ff32022-09-23 11:36:18 +0800215 int r = 0;
216 int source_no = 0;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800217
218 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Wentao MAb2070812022-09-02 13:10:03 +0800219 snprintf(node2, sizeof(node2), "/dev/dvb0.demux%d", dmx_idx);
220
221 fd = open(node, O_RDONLY);
222 if (fd == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800223 {
Wentao MAb2070812022-09-02 13:10:03 +0800224 int source;
225 fd2 = open(node2, O_RDONLY);
226 if (fd2 != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800227 {
Wentao MAb2070812022-09-02 13:10:03 +0800228 if (ioctl(fd2, DMX_GET_HW_SOURCE, &source) != -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800229 {
230 switch (source)
231 {
232 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800233 *src = DVB_DEMUX_SOURCE_TS0;
234 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800235 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800236 *src = DVB_DEMUX_SOURCE_TS1;
237 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800238 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800239 *src = DVB_DEMUX_SOURCE_TS2;
240 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800241 case FRONTEND_TS3:
242 *src = DVB_DEMUX_SOURCE_TS3;
243 break;
244 case FRONTEND_TS4:
245 *src = DVB_DEMUX_SOURCE_TS4;
246 break;
247 case FRONTEND_TS5:
248 *src = DVB_DEMUX_SOURCE_TS5;
249 break;
250 case FRONTEND_TS6:
251 *src = DVB_DEMUX_SOURCE_TS6;
252 break;
253 case FRONTEND_TS7:
254 *src = DVB_DEMUX_SOURCE_TS7;
255 break;
256 case DMA_0:
257 *src = DVB_DEMUX_SOURCE_DMA0;
258 break;
259 case DMA_1:
260 *src = DVB_DEMUX_SOURCE_DMA1;
261 break;
262 case DMA_2:
263 *src = DVB_DEMUX_SOURCE_DMA2;
264 break;
265 case DMA_3:
266 *src = DVB_DEMUX_SOURCE_DMA3;
267 break;
268 case DMA_4:
269 *src = DVB_DEMUX_SOURCE_DMA4;
270 break;
271 case DMA_5:
272 *src = DVB_DEMUX_SOURCE_DMA5;
273 break;
274 case DMA_6:
275 *src = DVB_DEMUX_SOURCE_DMA6;
276 break;
277 case DMA_7:
278 *src = DVB_DEMUX_SOURCE_DMA7;
279 break;
chen.chen21cf8e2b2022-03-17 18:13:37 +0800280 case FRONTEND_TS0_1:
281 *src = DVB_DEMUX_SOURCE_TS0_1;
282 break;
283 case FRONTEND_TS1_1:
284 *src = DVB_DEMUX_SOURCE_TS1_1;
285 break;
286 case FRONTEND_TS2_1:
287 *src = DVB_DEMUX_SOURCE_TS2_1;
288 break;
289 case FRONTEND_TS3_1:
290 *src = DVB_DEMUX_SOURCE_TS3_1;
291 break;
292 case FRONTEND_TS4_1:
293 *src = DVB_DEMUX_SOURCE_TS4_1;
294 break;
295 case FRONTEND_TS5_1:
296 *src = DVB_DEMUX_SOURCE_TS5_1;
297 break;
298 case FRONTEND_TS6_1:
299 *src = DVB_DEMUX_SOURCE_TS6_1;
300 break;
301 case FRONTEND_TS7_1:
302 *src = DVB_DEMUX_SOURCE_TS7_1;
303 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800304 default:
305 assert(0);
306 }
307 }
308 else
309 {
Wentao MAb2070812022-09-02 13:10:03 +0800310 DVR_ERROR("ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800311 }
Wentao MAb2070812022-09-02 13:10:03 +0800312 close(fd2);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800313 }
314 else
315 {
Wentao MAb2070812022-09-02 13:10:03 +0800316 DVR_ERROR("opening \"%s\" failed with errno:%d", node2, errno);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800317 }
318 }
319 else
320 {
Wentao MAb2070812022-09-02 13:10:03 +0800321 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800322 r = dvr_file_read(node, buf, sizeof(buf));
323 if (r != -1)
324 {
325 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
326 {
327 sscanf(buf, "ts%d", &source_no);
328 switch (source_no)
329 {
330 case 0:
331 *src = DVB_DEMUX_SOURCE_TS0;
332 break;
333 case 1:
334 *src = DVB_DEMUX_SOURCE_TS1;
335 break;
336 case 2:
337 *src = DVB_DEMUX_SOURCE_TS2;
338 break;
339 default:
Wentao MA96f68962022-06-15 19:45:35 +0800340 DVR_INFO("do not support demux source:%s", buf);
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800341 r = -1;
342 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800343 }
344 }
345 else if (strncmp(buf, "hiu", 3) == 0)
346 {
347 *src = DVB_DEMUX_SOURCE_DMA0;
348 }
349 else
350 {
351 r = -1;
352 }
Wentao MA96f68962022-06-15 19:45:35 +0800353 DVR_INFO("dvb_get_demux_source \"%s\" :%s", node, buf);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800354 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800355 }
356
357 return r;
358}
hualing chenf9867402020-09-23 17:06:20 +0800359//check is device platform is used new dmx
360int dvr_check_dmx_isNew(void)
361{
362 char node[32];
363 struct stat st;
364 int r;
365
366 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
367
368 r = stat(node, &st);
369 if (r == -1)
370 {
371 return 1;
372 }
373 return 0;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800374}