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) {