blob: 265a804a996d289aeb012324ba7ddaace52a44ce [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:
153 val = "hiu";
154 break;
155 default:
156 assert(0);
157 }
Gong Ked869dd72020-07-20 09:00:25 +0800158
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800159 r = dvr_file_echo(node, val);
160 }
Gong Ked869dd72020-07-20 09:00:25 +0800161
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800162 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800163}
164
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800165/**
166 * Get the demux's input source.
167 * \param dmx_idx Demux device's index.
168 * \param point src that demux's input source.
169 * \retval 0 On success.
170 * \retval -1 On error.
171 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800172int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800173{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800174 char node[32] = {0};
175 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800176 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800177 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800178
179 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
180 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800181 if (r == -1)
182 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800183 int fd, source;
184 memset(node, 0, sizeof(node));
185 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
186 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800187 if (fd != -1)
188 {
189 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
190 {
191 switch (source)
192 {
193 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800194 *src = DVB_DEMUX_SOURCE_TS0;
195 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800196 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800197 *src = DVB_DEMUX_SOURCE_TS1;
198 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800199 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800200 *src = DVB_DEMUX_SOURCE_TS2;
201 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800202 case FRONTEND_TS3:
203 *src = DVB_DEMUX_SOURCE_TS3;
204 break;
205 case FRONTEND_TS4:
206 *src = DVB_DEMUX_SOURCE_TS4;
207 break;
208 case FRONTEND_TS5:
209 *src = DVB_DEMUX_SOURCE_TS5;
210 break;
211 case FRONTEND_TS6:
212 *src = DVB_DEMUX_SOURCE_TS6;
213 break;
214 case FRONTEND_TS7:
215 *src = DVB_DEMUX_SOURCE_TS7;
216 break;
217 case DMA_0:
218 *src = DVB_DEMUX_SOURCE_DMA0;
219 break;
220 case DMA_1:
221 *src = DVB_DEMUX_SOURCE_DMA1;
222 break;
223 case DMA_2:
224 *src = DVB_DEMUX_SOURCE_DMA2;
225 break;
226 case DMA_3:
227 *src = DVB_DEMUX_SOURCE_DMA3;
228 break;
229 case DMA_4:
230 *src = DVB_DEMUX_SOURCE_DMA4;
231 break;
232 case DMA_5:
233 *src = DVB_DEMUX_SOURCE_DMA5;
234 break;
235 case DMA_6:
236 *src = DVB_DEMUX_SOURCE_DMA6;
237 break;
238 case DMA_7:
239 *src = DVB_DEMUX_SOURCE_DMA7;
240 break;
241 default:
242 assert(0);
243 }
244 }
245 else
246 {
247 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
248 }
249 close(fd);
250 }
251 else
252 {
253 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
254 }
255 }
256 else
257 {
258 r = dvr_file_read(node, buf, sizeof(buf));
259 if (r != -1)
260 {
261 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
262 {
263 sscanf(buf, "ts%d", &source_no);
264 switch (source_no)
265 {
266 case 0:
267 *src = DVB_DEMUX_SOURCE_TS0;
268 break;
269 case 1:
270 *src = DVB_DEMUX_SOURCE_TS1;
271 break;
272 case 2:
273 *src = DVB_DEMUX_SOURCE_TS2;
274 break;
275 default:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800276 DVR_DEBUG(1, "do not support demux source:%s", buf);
277 r = -1;
278 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800279 }
280 }
281 else if (strncmp(buf, "hiu", 3) == 0)
282 {
283 *src = DVB_DEMUX_SOURCE_DMA0;
284 }
285 else
286 {
287 r = -1;
288 }
289 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
290 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800291 }
292
293 return r;
294}
hualing chenf9867402020-09-23 17:06:20 +0800295//check is device platform is used new dmx
296int dvr_check_dmx_isNew(void)
297{
298 char node[32];
299 struct stat st;
300 int r;
301
302 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
303
304 r = stat(node, &st);
305 if (r == -1)
306 {
307 return 1;
308 }
309 return 0;
310}