blob: cb34e0f0b0897f5a12ed373a26dcb53f9efa89a2 [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;
107 default:
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800108 assert(0);
109 }
hualing chen123c8332020-09-10 15:47:33 +0800110 if (ioctl(fd, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800111 {
hualing chen123c8332020-09-10 15:47:33 +0800112 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
113 r = -1;
114 }
115 else
116 {
117 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_INPUT:%d dmx_idx:%d", src, input, dmx_idx);
118 r = 0;
119 }
120 if (ioctl(fd, DMX_SET_HW_SOURCE, source) == -1)
121 {
122 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
123 r = -1;
124 }
125 else
126 {
127 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_HW_SOURCE:%d dmx_idx:%d", src, source, dmx_idx);
128 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800129 }
130 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800131 }
132 else
133 {
hualing chen123c8332020-09-10 15:47:33 +0800134 DVR_DEBUG(1, "dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800135 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800136 }
137 else
138 {
139 char *val;
Gong Ked869dd72020-07-20 09:00:25 +0800140
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800141 switch (src)
142 {
143 case DVB_DEMUX_SOURCE_TS0:
144 val = "ts0";
145 break;
146 case DVB_DEMUX_SOURCE_TS1:
147 val = "ts1";
148 break;
149 case DVB_DEMUX_SOURCE_TS2:
150 val = "ts2";
151 break;
152 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800153 case DVB_DEMUX_SOURCE_DMA1:
154 case DVB_DEMUX_SOURCE_DMA2:
155 case DVB_DEMUX_SOURCE_DMA3:
156 case DVB_DEMUX_SOURCE_DMA4:
157 case DVB_DEMUX_SOURCE_DMA5:
158 case DVB_DEMUX_SOURCE_DMA6:
159 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800160 val = "hiu";
161 break;
162 default:
163 assert(0);
164 }
Gong Ked869dd72020-07-20 09:00:25 +0800165
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800166 r = dvr_file_echo(node, val);
167 }
Gong Ked869dd72020-07-20 09:00:25 +0800168
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800169 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800170}
171
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800172/**
173 * Get the demux's input source.
174 * \param dmx_idx Demux device's index.
175 * \param point src that demux's input source.
176 * \retval 0 On success.
177 * \retval -1 On error.
178 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800179int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800180{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800181 char node[32] = {0};
182 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800183 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800184 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800185
186 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
187 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800188 if (r == -1)
189 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800190 int fd, source;
191 memset(node, 0, sizeof(node));
192 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
193 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800194 if (fd != -1)
195 {
196 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
197 {
198 switch (source)
199 {
200 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800201 *src = DVB_DEMUX_SOURCE_TS0;
202 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800203 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800204 *src = DVB_DEMUX_SOURCE_TS1;
205 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800206 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800207 *src = DVB_DEMUX_SOURCE_TS2;
208 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800209 case FRONTEND_TS3:
210 *src = DVB_DEMUX_SOURCE_TS3;
211 break;
212 case FRONTEND_TS4:
213 *src = DVB_DEMUX_SOURCE_TS4;
214 break;
215 case FRONTEND_TS5:
216 *src = DVB_DEMUX_SOURCE_TS5;
217 break;
218 case FRONTEND_TS6:
219 *src = DVB_DEMUX_SOURCE_TS6;
220 break;
221 case FRONTEND_TS7:
222 *src = DVB_DEMUX_SOURCE_TS7;
223 break;
224 case DMA_0:
225 *src = DVB_DEMUX_SOURCE_DMA0;
226 break;
227 case DMA_1:
228 *src = DVB_DEMUX_SOURCE_DMA1;
229 break;
230 case DMA_2:
231 *src = DVB_DEMUX_SOURCE_DMA2;
232 break;
233 case DMA_3:
234 *src = DVB_DEMUX_SOURCE_DMA3;
235 break;
236 case DMA_4:
237 *src = DVB_DEMUX_SOURCE_DMA4;
238 break;
239 case DMA_5:
240 *src = DVB_DEMUX_SOURCE_DMA5;
241 break;
242 case DMA_6:
243 *src = DVB_DEMUX_SOURCE_DMA6;
244 break;
245 case DMA_7:
246 *src = DVB_DEMUX_SOURCE_DMA7;
247 break;
248 default:
249 assert(0);
250 }
251 }
252 else
253 {
254 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
255 }
256 close(fd);
257 }
258 else
259 {
260 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
261 }
262 }
263 else
264 {
265 r = dvr_file_read(node, buf, sizeof(buf));
266 if (r != -1)
267 {
268 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
269 {
270 sscanf(buf, "ts%d", &source_no);
271 switch (source_no)
272 {
273 case 0:
274 *src = DVB_DEMUX_SOURCE_TS0;
275 break;
276 case 1:
277 *src = DVB_DEMUX_SOURCE_TS1;
278 break;
279 case 2:
280 *src = DVB_DEMUX_SOURCE_TS2;
281 break;
282 default:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800283 DVR_DEBUG(1, "do not support demux source:%s", buf);
284 r = -1;
285 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800286 }
287 }
288 else if (strncmp(buf, "hiu", 3) == 0)
289 {
290 *src = DVB_DEMUX_SOURCE_DMA0;
291 }
292 else
293 {
294 r = -1;
295 }
296 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
297 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800298 }
299
300 return r;
301}
hualing chenf9867402020-09-23 17:06:20 +0800302//check is device platform is used new dmx
303int dvr_check_dmx_isNew(void)
304{
305 char node[32];
306 struct stat st;
307 int r;
308
309 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
310
311 r = stat(node, &st);
312 if (r == -1)
313 {
314 return 1;
315 }
316 return 0;
317}