blob: 4fc6702ae9d7ccc42a6a278184608621244d3b1f [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 Ked869dd72020-07-20 09:00:25 +080017/**
18 * Set the demux's input source.
19 * \param dmx_idx Demux device's index.
20 * \param src The demux's input source.
21 * \retval 0 On success.
22 * \retval -1 On error.
23 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080024int dvb_set_demux_source(int dmx_idx, DVB_DemuxSource_t src)
Gong Ked869dd72020-07-20 09:00:25 +080025{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080026 char node[32];
27 struct stat st;
28 int r;
Gong Ked869dd72020-07-20 09:00:25 +080029
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080030 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Gong Ked869dd72020-07-20 09:00:25 +080031
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080032 r = stat(node, &st);
33 if (r == -1)
34 {
hualing chen123c8332020-09-10 15:47:33 +080035 int fd, source, input;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080036 memset(node, 0, sizeof(node));
37 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
38 fd = open(node, O_WRONLY);
39 if (fd != -1)
40 {
41 switch (src)
42 {
43 case DVB_DEMUX_SOURCE_TS0:
44 source = FRONTEND_TS0;
hualing chen123c8332020-09-10 15:47:33 +080045 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080046 break;
47 case DVB_DEMUX_SOURCE_TS1:
48 source = FRONTEND_TS1;
hualing chen123c8332020-09-10 15:47:33 +080049 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080050 break;
51 case DVB_DEMUX_SOURCE_TS2:
52 source = FRONTEND_TS2;
hualing chen123c8332020-09-10 15:47:33 +080053 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080054 break;
55 case DVB_DEMUX_SOURCE_TS3:
56 source = FRONTEND_TS3;
hualing chen123c8332020-09-10 15:47:33 +080057 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080058 break;
59 case DVB_DEMUX_SOURCE_TS4:
60 source = FRONTEND_TS4;
hualing chen123c8332020-09-10 15:47:33 +080061 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080062 break;
63 case DVB_DEMUX_SOURCE_TS5:
64 source = FRONTEND_TS5;
hualing chen123c8332020-09-10 15:47:33 +080065 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080066 break;
67 case DVB_DEMUX_SOURCE_TS6:
68 source = FRONTEND_TS6;
hualing chen123c8332020-09-10 15:47:33 +080069 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080070 break;
71 case DVB_DEMUX_SOURCE_TS7:
72 source = FRONTEND_TS7;
hualing chen123c8332020-09-10 15:47:33 +080073 input = INPUT_DEMOD;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080074 break;
75 case DVB_DEMUX_SOURCE_DMA0:
76 source = DMA_0;
hualing chen123c8332020-09-10 15:47:33 +080077 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080078 break;
79 case DVB_DEMUX_SOURCE_DMA1:
80 source = DMA_1;
hualing chen123c8332020-09-10 15:47:33 +080081 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080082 break;
83 case DVB_DEMUX_SOURCE_DMA2:
84 source = DMA_2;
hualing chen123c8332020-09-10 15:47:33 +080085 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080086 break;
87 case DVB_DEMUX_SOURCE_DMA3:
88 source = DMA_3;
hualing chen123c8332020-09-10 15:47:33 +080089 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080090 break;
91 case DVB_DEMUX_SOURCE_DMA4:
92 source = DMA_4;
hualing chen123c8332020-09-10 15:47:33 +080093 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080094 break;
95 case DVB_DEMUX_SOURCE_DMA5:
96 source = DMA_5;
hualing chen123c8332020-09-10 15:47:33 +080097 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080098 break;
99 case DVB_DEMUX_SOURCE_DMA6:
100 source = DMA_6;
hualing chen123c8332020-09-10 15:47:33 +0800101 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800102 break;
103 case DVB_DEMUX_SOURCE_DMA7:
104 source = DMA_7;
hualing chen123c8332020-09-10 15:47:33 +0800105 input = INPUT_LOCAL;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800106 break;
hualing chen03fd4942021-07-15 15:56:41 +0800107 case DVB_DEMUX_SECSOURCE_DMA0:
108 source = DMA_0;
109 input = INPUT_LOCAL_SEC;
110 break;
111 case DVB_DEMUX_SECSOURCE_DMA1:
112 source = DMA_1;
113 input = INPUT_LOCAL_SEC;
114 break;
115 case DVB_DEMUX_SECSOURCE_DMA2:
116 source = DMA_2;
117 input = INPUT_LOCAL_SEC;
118 break;
119 case DVB_DEMUX_SECSOURCE_DMA3:
120 source = DMA_3;
121 input = INPUT_LOCAL_SEC;
122 break;
123 case DVB_DEMUX_SECSOURCE_DMA4:
124 source = DMA_4;
125 input = INPUT_LOCAL_SEC;
126 break;
127 case DVB_DEMUX_SECSOURCE_DMA5:
128 source = DMA_5;
129 input = INPUT_LOCAL_SEC;
130 break;
131 case DVB_DEMUX_SECSOURCE_DMA6:
132 source = DMA_6;
133 input = INPUT_LOCAL_SEC;
134 break;
135 case DVB_DEMUX_SECSOURCE_DMA7:
136 source = DMA_7;
137 input = INPUT_LOCAL_SEC;
138 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800139 default:
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800140 assert(0);
141 }
hualing chen123c8332020-09-10 15:47:33 +0800142 if (ioctl(fd, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800143 {
hualing chen123c8332020-09-10 15:47:33 +0800144 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
145 r = -1;
146 }
147 else
148 {
149 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_INPUT:%d dmx_idx:%d", src, input, dmx_idx);
150 r = 0;
151 }
152 if (ioctl(fd, DMX_SET_HW_SOURCE, source) == -1)
153 {
154 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
155 r = -1;
156 }
157 else
158 {
159 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_HW_SOURCE:%d dmx_idx:%d", src, source, dmx_idx);
160 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800161 }
162 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800163 }
164 else
165 {
hualing chen123c8332020-09-10 15:47:33 +0800166 DVR_DEBUG(1, "dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800167 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800168 }
169 else
170 {
171 char *val;
Gong Ked869dd72020-07-20 09:00:25 +0800172
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800173 switch (src)
174 {
175 case DVB_DEMUX_SOURCE_TS0:
176 val = "ts0";
177 break;
178 case DVB_DEMUX_SOURCE_TS1:
179 val = "ts1";
180 break;
181 case DVB_DEMUX_SOURCE_TS2:
182 val = "ts2";
183 break;
184 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800185 case DVB_DEMUX_SOURCE_DMA1:
186 case DVB_DEMUX_SOURCE_DMA2:
187 case DVB_DEMUX_SOURCE_DMA3:
188 case DVB_DEMUX_SOURCE_DMA4:
189 case DVB_DEMUX_SOURCE_DMA5:
190 case DVB_DEMUX_SOURCE_DMA6:
191 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800192 val = "hiu";
193 break;
194 default:
195 assert(0);
196 }
Gong Ked869dd72020-07-20 09:00:25 +0800197
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800198 r = dvr_file_echo(node, val);
199 }
Gong Ked869dd72020-07-20 09:00:25 +0800200
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800201 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800202}
203
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800204/**
205 * Get the demux's input source.
206 * \param dmx_idx Demux device's index.
207 * \param point src that demux's input source.
208 * \retval 0 On success.
209 * \retval -1 On error.
210 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800211int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800212{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800213 char node[32] = {0};
214 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800215 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800216 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800217
218 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
219 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800220 if (r == -1)
221 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800222 int fd, source;
223 memset(node, 0, sizeof(node));
224 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
225 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800226 if (fd != -1)
227 {
228 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
229 {
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;
280 default:
281 assert(0);
282 }
283 }
284 else
285 {
286 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
287 }
288 close(fd);
289 }
290 else
291 {
292 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
293 }
294 }
295 else
296 {
297 r = dvr_file_read(node, buf, sizeof(buf));
298 if (r != -1)
299 {
300 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
301 {
302 sscanf(buf, "ts%d", &source_no);
303 switch (source_no)
304 {
305 case 0:
306 *src = DVB_DEMUX_SOURCE_TS0;
307 break;
308 case 1:
309 *src = DVB_DEMUX_SOURCE_TS1;
310 break;
311 case 2:
312 *src = DVB_DEMUX_SOURCE_TS2;
313 break;
314 default:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800315 DVR_DEBUG(1, "do not support demux source:%s", buf);
316 r = -1;
317 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800318 }
319 }
320 else if (strncmp(buf, "hiu", 3) == 0)
321 {
322 *src = DVB_DEMUX_SOURCE_DMA0;
323 }
324 else
325 {
326 r = -1;
327 }
328 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
329 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800330 }
331
332 return r;
333}
hualing chenf9867402020-09-23 17:06:20 +0800334//check is device platform is used new dmx
335int dvr_check_dmx_isNew(void)
336{
337 char node[32];
338 struct stat st;
339 int r;
340
341 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
342
343 r = stat(node, &st);
344 if (r == -1)
345 {
346 return 1;
347 }
348 return 0;
349}