📄 dvb-cwidx-v4l.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 + -