blob: acc524c68bf774c7d3a3bc01a9e626c760b90136 [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 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080035 int fd, source, input = 0;
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 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080041 if (src >= DVB_DEMUX_SOURCE_TS0 &&
42 src <= DVB_DEMUX_SOURCE_TS7) {
43 source = FRONTEND_TS0 + src - DVB_DEMUX_SOURCE_TS0;
hualing chen123c8332020-09-10 15:47:33 +080044 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080045 } else if (src >= DVB_DEMUX_SOURCE_DMA0 &&
46 src <= DVB_DEMUX_SOURCE_DMA7) {
47 source = DMA_0 + src - DVB_DEMUX_SOURCE_DMA0;
48 input = INPUT_LOCAL;
49 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0 &&
50 src <= DVB_DEMUX_SECSOURCE_DMA7) {
51 source = DMA_0 + src - DVB_DEMUX_SECSOURCE_DMA0;
52 input = INPUT_LOCAL_SEC;
53 } else if (src >= DVB_DEMUX_SOURCE_DMA0_1 &&
54 src <= DVB_DEMUX_SOURCE_DMA7_1) {
55 source = DMA_0_1 + src - DVB_DEMUX_SOURCE_DMA0_1;
56 input = INPUT_LOCAL;
57 } else if (src >= DVB_DEMUX_SECSOURCE_DMA0_1 &&
58 src <= DVB_DEMUX_SECSOURCE_DMA7_1) {
59 source = DMA_0_1 + src - DVB_DEMUX_SECSOURCE_DMA0_1;
60 input = INPUT_LOCAL_SEC;
61 } else if (src >= DVB_DEMUX_SOURCE_TS0_1 &&
62 src <= DVB_DEMUX_SOURCE_TS7_1) {
63 source = FRONTEND_TS0_1 + src - DVB_DEMUX_SOURCE_TS0_1;
hualing chen123c8332020-09-10 15:47:33 +080064 input = INPUT_DEMOD;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080065 } else {
Chuanzhi Wang670fc042020-08-12 11:11:04 +080066 assert(0);
67 }
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080068
hualing chen123c8332020-09-10 15:47:33 +080069 if (ioctl(fd, DMX_SET_INPUT, input) == -1)
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080070 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080071 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_INPUT:%d error:%d", input, errno);
72 r = -1;
hualing chen123c8332020-09-10 15:47:33 +080073 }
74 else
75 {
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +080076 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_INPUT:%d dmx_idx:%d", src, input, dmx_idx);
77 r = 0;
hualing chen123c8332020-09-10 15:47:33 +080078 }
79 if (ioctl(fd, DMX_SET_HW_SOURCE, source) == -1)
80 {
81 DVR_DEBUG(1, "dvb_set_demux_source ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
82 r = -1;
83 }
84 else
85 {
86 DVR_DEBUG(1, "dvb_set_demux_source ioctl sucesss src:%d DMX_SET_HW_SOURCE:%d dmx_idx:%d", src, source, dmx_idx);
87 r = 0;
Chuanzhi Wang670fc042020-08-12 11:11:04 +080088 }
89 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080090 }
91 else
92 {
hualing chen123c8332020-09-10 15:47:33 +080093 DVR_DEBUG(1, "dvb_set_demux_source open \"%s\" failed, error:%d", node, errno);
Chuanzhi Wang670fc042020-08-12 11:11:04 +080094 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080095 }
96 else
97 {
98 char *val;
Gong Ked869dd72020-07-20 09:00:25 +080099
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800100 switch (src)
101 {
102 case DVB_DEMUX_SOURCE_TS0:
103 val = "ts0";
104 break;
105 case DVB_DEMUX_SOURCE_TS1:
106 val = "ts1";
107 break;
108 case DVB_DEMUX_SOURCE_TS2:
109 val = "ts2";
110 break;
111 case DVB_DEMUX_SOURCE_DMA0:
Chuanzhi Wanga18d8902020-11-18 14:27:43 +0800112 case DVB_DEMUX_SOURCE_DMA1:
113 case DVB_DEMUX_SOURCE_DMA2:
114 case DVB_DEMUX_SOURCE_DMA3:
115 case DVB_DEMUX_SOURCE_DMA4:
116 case DVB_DEMUX_SOURCE_DMA5:
117 case DVB_DEMUX_SOURCE_DMA6:
118 case DVB_DEMUX_SOURCE_DMA7:
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800119 val = "hiu";
120 break;
121 default:
122 assert(0);
123 }
Gong Ked869dd72020-07-20 09:00:25 +0800124
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800125 r = dvr_file_echo(node, val);
126 }
Gong Ked869dd72020-07-20 09:00:25 +0800127
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800128 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800129}
130
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800131/**
132 * Get the demux's input source.
133 * \param dmx_idx Demux device's index.
134 * \param point src that demux's input source.
135 * \retval 0 On success.
136 * \retval -1 On error.
137 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800138int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800139{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800140 char node[32] = {0};
141 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800142 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800143 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800144
145 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
146 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800147 if (r == -1)
148 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800149 int fd, source;
150 memset(node, 0, sizeof(node));
151 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
152 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800153 if (fd != -1)
154 {
155 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
156 {
157 switch (source)
158 {
159 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800160 *src = DVB_DEMUX_SOURCE_TS0;
161 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800162 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800163 *src = DVB_DEMUX_SOURCE_TS1;
164 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800165 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800166 *src = DVB_DEMUX_SOURCE_TS2;
167 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800168 case FRONTEND_TS3:
169 *src = DVB_DEMUX_SOURCE_TS3;
170 break;
171 case FRONTEND_TS4:
172 *src = DVB_DEMUX_SOURCE_TS4;
173 break;
174 case FRONTEND_TS5:
175 *src = DVB_DEMUX_SOURCE_TS5;
176 break;
177 case FRONTEND_TS6:
178 *src = DVB_DEMUX_SOURCE_TS6;
179 break;
180 case FRONTEND_TS7:
181 *src = DVB_DEMUX_SOURCE_TS7;
182 break;
183 case DMA_0:
184 *src = DVB_DEMUX_SOURCE_DMA0;
185 break;
186 case DMA_1:
187 *src = DVB_DEMUX_SOURCE_DMA1;
188 break;
189 case DMA_2:
190 *src = DVB_DEMUX_SOURCE_DMA2;
191 break;
192 case DMA_3:
193 *src = DVB_DEMUX_SOURCE_DMA3;
194 break;
195 case DMA_4:
196 *src = DVB_DEMUX_SOURCE_DMA4;
197 break;
198 case DMA_5:
199 *src = DVB_DEMUX_SOURCE_DMA5;
200 break;
201 case DMA_6:
202 *src = DVB_DEMUX_SOURCE_DMA6;
203 break;
204 case DMA_7:
205 *src = DVB_DEMUX_SOURCE_DMA7;
206 break;
207 default:
208 assert(0);
209 }
210 }
211 else
212 {
213 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
214 }
215 close(fd);
216 }
217 else
218 {
219 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
220 }
221 }
222 else
223 {
224 r = dvr_file_read(node, buf, sizeof(buf));
225 if (r != -1)
226 {
227 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
228 {
229 sscanf(buf, "ts%d", &source_no);
230 switch (source_no)
231 {
232 case 0:
233 *src = DVB_DEMUX_SOURCE_TS0;
234 break;
235 case 1:
236 *src = DVB_DEMUX_SOURCE_TS1;
237 break;
238 case 2:
239 *src = DVB_DEMUX_SOURCE_TS2;
240 break;
241 default:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800242 DVR_DEBUG(1, "do not support demux source:%s", buf);
243 r = -1;
244 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800245 }
246 }
247 else if (strncmp(buf, "hiu", 3) == 0)
248 {
249 *src = DVB_DEMUX_SOURCE_DMA0;
250 }
251 else
252 {
253 r = -1;
254 }
255 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
256 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800257 }
258
259 return r;
260}
hualing chenf9867402020-09-23 17:06:20 +0800261//check is device platform is used new dmx
262int dvr_check_dmx_isNew(void)
263{
264 char node[32];
265 struct stat st;
266 int r;
267
268 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", 0);
269
270 r = stat(node, &st);
271 if (r == -1)
272 {
273 return 1;
274 }
275 return 0;
Chuangcheng Pengaaa4a982021-11-01 13:31:47 +0800276}