⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvb-cwidx-v4l.diff

📁 VDR softcam plugin 0.9.1
💻 DIFF
字号:
diff -ruN linux/drivers/media/dvb/ttpci/av7110_ca.c linux/drivers/media/dvb/ttpci/av7110_ca.c
--- linux/drivers/media/dvb/ttpci/av7110_ca.c
+++ linux/drivers/media/dvb/ttpci/av7110_ca.c
@@ -35,6 +35,10 @@
 #include <linux/timer.h>
 #include <linux/poll.h>

+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif
+
 #include "av7110.h"
 #include "av7110_hw.h"
 #include "av7110_ca.h"
@@ -287,10 +291,31 @@
        }

        case CA_GET_MSG:
-               break;
+        {
+                ca_pid_t *arg = (ca_pid_t*) parg;
+                u16 buf[4], res[2];
+                buf[0]=0x0745;
+                buf[1]=2;
+                buf[2]=arg->pid >> 16;
+                buf[3]=arg->pid & 0xFFFF;
+                av7110_fw_request(av7110,buf,sizeof(buf),res,2);
+                arg->index=(res[0]<<16) + res[1];
+                break;
+        }

        case CA_SEND_MSG:
-               break;
+        {
+                ca_pid_t *arg = (ca_pid_t*) parg;
+                u16 buf[6], res[2];
+                buf[0]=0x0746;
+                buf[1]=4;
+                buf[2]=arg->pid >> 16;
+                buf[3]=arg->pid & 0xFFFF;
+                buf[4]=arg->index >> 16;
+                buf[5]=arg->index & 0xFFFF;
+                av7110_fw_request(av7110,buf,sizeof(buf),res,2);
+                break;
+        }

        case CA_GET_DESCR_INFO:
        {
@@ -319,6 +344,45 @@
                break;
        }

+        case CA_SET_PID:
+        {
+                int handle;
+                ca_pid_t *pid = (ca_pid_t*) parg;
+
+                if (pid->pid >= 0x1fff)
+                        return -EINVAL;
+                if (pid->index < 0 || pid->index >= 16)
+                        return -EINVAL;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+                if (down_interruptible (&av7110->demux.mutex))
+#else
+                if (mutex_lock_interruptible (&av7110->demux.mutex))
+#endif
+                       return -ERESTARTSYS;
+
+                for(handle=0; handle<32; handle++) {
+                  struct dvb_demux_filter *dvbdmxfilter=av7110->handle2filter[handle];
+                  if(dvbdmxfilter) {
+                    struct dvb_demux_feed *feed=dvbdmxfilter->feed;
+                    if(feed && feed->state==DMX_STATE_GO && feed->pid==pid->pid) {
+                      /* we map the new cmd to CacheError as it's not
+                         implemented anyways, i.e. free. */
+                      av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, CacheError, 1,
+                                  (handle<<8)|pid->index); /* hw handle / cw index*/
+                      break;
+                      }
+                    }
+                  }
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+                up(&av7110->demux.mutex);
+#else
+                mutex_unlock(&av7110->demux.mutex);
+#endif
+                break;
+        }
+
        default:
                return -EINVAL;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -