dvb_utils: Portting dmx driver interface that set/get demux source for SC2. [1/1]
PD#SWPL-29995
Problem:
For SC2 , have no interface to get and set demux source.
Solution:
Portting dmx driver interface that set/get demux source for SC2
Verify:
s905x4.
Change-Id: Ic593d636dbfe172453472ecb58f9583b9996c973
Signed-off-by: Chuanzhi Wang <chuanzhi.wang@amlogic.com>
diff --git a/src/dvb_utils.c b/src/dvb_utils.c
index 96add39..8c6b9d8 100644
--- a/src/dvb_utils.c
+++ b/src/dvb_utils.c
@@ -5,12 +5,15 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <fcntl.h>
#include <assert.h>
#include "dvr_types.h"
#include "dvb_utils.h"
#include "dvr_utils.h"
+#include <dmx.h>
+
/**
* Set the demux's input source.
* \param dmx_idx Demux device's index.
@@ -26,9 +29,72 @@
snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
- r = stat(node, &st);
- if (r == -1) {
- DVR_DEBUG(1, "cannot find \"%s\"", node);
+ r = stat(node, &st);
+ if (r == -1) {
+ int fd, source;
+ memset(node, 0, sizeof(node));
+ snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
+ fd = open(node, O_WRONLY);
+ if (fd != -1) {
+ switch (src) {
+ case DVB_DEMUX_SOURCE_TS0:
+ source = FRONTEND_TS0;
+ break;
+ case DVB_DEMUX_SOURCE_TS1:
+ source = FRONTEND_TS1;
+ break;
+ case DVB_DEMUX_SOURCE_TS2:
+ source = FRONTEND_TS2;
+ break;
+ case DVB_DEMUX_SOURCE_TS3:
+ source = FRONTEND_TS3;
+ break;
+ case DVB_DEMUX_SOURCE_TS4:
+ source = FRONTEND_TS4;
+ break;
+ case DVB_DEMUX_SOURCE_TS5:
+ source = FRONTEND_TS5;
+ break;
+ case DVB_DEMUX_SOURCE_TS6:
+ source = FRONTEND_TS6;
+ break;
+ case DVB_DEMUX_SOURCE_TS7:
+ source = FRONTEND_TS7;
+ break;
+ case DVB_DEMUX_SOURCE_DMA0:
+ source = DMA_0;
+ break;
+ case DVB_DEMUX_SOURCE_DMA1:
+ source = DMA_1;
+ break;
+ case DVB_DEMUX_SOURCE_DMA2:
+ source = DMA_2;
+ break;
+ case DVB_DEMUX_SOURCE_DMA3:
+ source = DMA_3;
+ break;
+ case DVB_DEMUX_SOURCE_DMA4:
+ source = DMA_4;
+ break;
+ case DVB_DEMUX_SOURCE_DMA5:
+ source = DMA_5;
+ break;
+ case DVB_DEMUX_SOURCE_DMA6:
+ source = DMA_6;
+ break;
+ case DVB_DEMUX_SOURCE_DMA7:
+ source = DMA_7;
+ break;
+ default:
+ assert(0);
+ }
+ if (ioctl(fd, DMX_SET_HW_SOURCE, &source) == -1) {
+ DVR_DEBUG(1, "ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
+ }
+ close(fd);
+ }else {
+ DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
+ }
} else {
char *val;
@@ -72,7 +138,70 @@
snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
r = stat(node, &st);
if (r == -1) {
- DVR_DEBUG(1, "cannot find \"%s\"", node);
+ int fd, source;
+ memset(node, 0, sizeof(node));
+ snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
+ fd = open(node, O_RDONLY);
+ if (fd != -1) {
+ if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1) {
+ switch (source) {
+ case FRONTEND_TS0:
+ *src = DVB_DEMUX_SOURCE_TS0;
+ break;
+ case FRONTEND_TS1:
+ *src = DVB_DEMUX_SOURCE_TS1;
+ break;
+ case FRONTEND_TS2:
+ *src = DVB_DEMUX_SOURCE_TS2;
+ break;
+ case FRONTEND_TS3:
+ *src = DVB_DEMUX_SOURCE_TS3;
+ break;
+ case FRONTEND_TS4:
+ *src = DVB_DEMUX_SOURCE_TS4;
+ break;
+ case FRONTEND_TS5:
+ *src = DVB_DEMUX_SOURCE_TS5;
+ break;
+ case FRONTEND_TS6:
+ *src = DVB_DEMUX_SOURCE_TS6;
+ break;
+ case FRONTEND_TS7:
+ *src = DVB_DEMUX_SOURCE_TS7;
+ break;
+ case DMA_0:
+ *src = DVB_DEMUX_SOURCE_DMA0;
+ break;
+ case DMA_1:
+ *src = DVB_DEMUX_SOURCE_DMA1;
+ break;
+ case DMA_2:
+ *src = DVB_DEMUX_SOURCE_DMA2;
+ break;
+ case DMA_3:
+ *src = DVB_DEMUX_SOURCE_DMA3;
+ break;
+ case DMA_4:
+ *src = DVB_DEMUX_SOURCE_DMA4;
+ break;
+ case DMA_5:
+ *src = DVB_DEMUX_SOURCE_DMA5;
+ break;
+ case DMA_6:
+ *src = DVB_DEMUX_SOURCE_DMA6;
+ break;
+ case DMA_7:
+ *src = DVB_DEMUX_SOURCE_DMA7;
+ break;
+ default:
+ assert(0);
+ }
+ }else {
+ DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
+ }
+ }else {
+ DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
+ }
} else {
r = dvr_file_read(node, buf, sizeof(buf));
if (r != -1) {