* [linux-dvb] Mantis VP-2033 remote control patch ported for Manu's Mantis tree
@ 2008-03-03 21:45 Pauli Borodulin
0 siblings, 0 replies; only message in thread
From: Pauli Borodulin @ 2008-03-03 21:45 UTC (permalink / raw)
To: linux-dvb
[-- Attachment #1: Type: text/plain, Size: 1430 bytes --]
Heya!
Kristian Slavov posted a patch[1] to enable remote controller support on
Mantis VP-2033 for almost a year ago. Since then, I have not seen any
new versions of this patch, but since Manu's current Mantis driver[2]
works pretty well and I have such card, I decided to port the old patch
for the current tree. The patch is attached.
I modified the original patch a bit: The ir keymap is now contained in
the Mantis driver instead of media/common/ir-keymaps.c, because I saw no
point in putting it under common. This may well be incorrect... :)
I have tested the patch using Manu's tree from 2008-02-27, Linux
2.6.24.3, VDR 1.5.17 and vdr-remote 0.4.0. Here's some tips to get it
working:
1. Get a snapshot of Manu's tree from http://www.jusst.de/hg/mantis/
2. Extract the tree and apply the patch:
tar jfx mantis-a9ecd19a37c9.tar.bz2
cd mantis-a9ecd19a37c9
patch -p1 < mantis-rc.patch
3. Compile, install and so on...
make
make install
...
The remote control will be visible through /dev/input/eventX. If you are
not sure which one is it, try "cat /dev/input/eventX" for each, press
some rc buttons and see if you get some (probably binary) output. To use
the remote control with VDR you will need something like vdr-remote[3].
Have fun!
[1] http://www.linuxtv.org/pipermail/linux-dvb/2007-April/017279.html
[2] http://www.jusst.de/hg/mantis/
[3] http://www.escape-edv.de/endriss/vdr/
Regards,
Pauli Borodulin
[-- Attachment #2: mantis-rc.patch --]
[-- Type: text/plain, Size: 9965 bytes --]
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/Makefile mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/Makefile
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/Makefile 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/Makefile 2008-03-03 22:51:47.000000000 +0200
@@ -8,7 +8,8 @@
mantis_vp1041.o \
mantis_vp2033.o \
mantis_vp2040.o \
- mantis_vp3030.o
+ mantis_vp3030.o \
+ mantis_rc.o
obj-$(CONFIG_DVB_MANTIS) += mantis.o
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_common.h mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_common.h
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_common.h 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_common.h 2008-03-03 21:46:11.000000000 +0200
@@ -26,6 +26,8 @@
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/mutex.h>
+#include <linux/input.h>
+#include <media/ir-common.h>
#include "dvbdev.h"
#include "dvb_demux.h"
@@ -72,8 +74,23 @@
char *model_name;
char *dev_type;
u32 ts_size;
+ IR_KEYTAB_TYPE *ir_codes;
};
+struct mantis_ir {
+ struct input_dev *rc_dev;
+ char rc_name[80];
+ char rc_phys[80];
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+ struct work_struct rc_query_work;
+#else
+ struct delayed_work rc_query_work;
+#endif
+ u32 ir_last_code;
+ struct ir_input_state ir;
+};
+
+
struct mantis_pci {
/* PCI stuff */
u16 vendor_id;
@@ -134,6 +151,9 @@
/* A12 A13 A14 */
int gpio_status;
+
+ /* RC */
+ struct mantis_ir ir;
};
extern unsigned int verbose;
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_core.c mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_core.c
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_core.c 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_core.c 2008-03-03 21:41:30.000000000 +0200
@@ -163,6 +163,10 @@
dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed");
return err;
}
+ if ((err = mantis_rc_init(mantis)) < 0) {
+ dprintk(verbose, MANTIS_DEBUG, 1, "mantis RC init failed");
+ return err;
+ }
return 0;
}
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_core.h mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_core.h
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_core.h 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_core.h 2008-03-03 21:38:39.000000000 +0200
@@ -53,6 +53,8 @@
extern int mantis_i2c_exit(struct mantis_pci *mantis);
extern int mantis_core_init(struct mantis_pci *mantis);
extern int mantis_core_exit(struct mantis_pci *mantis);
+extern int mantis_rc_init(struct mantis_pci *mantis);
+extern int mantis_rc_exit(struct mantis_pci *mantis);
//extern void mantis_fe_powerup(struct mantis_pci *mantis);
//extern void mantis_fe_powerdown(struct mantis_pci *mantis);
//extern void mantis_fe_reset(struct dvb_frontend *fe);
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_pci.c mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_pci.c
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_pci.c 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_pci.c 2008-03-03 21:59:26.000000000 +0200
@@ -82,6 +82,7 @@
dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
}
if (stat & MANTIS_INT_IRQ1) {
+ mantis->ir.ir_last_code = mmread(0xe8);
dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
}
if (stat & MANTIS_INT_OCERR) {
@@ -245,6 +246,7 @@
dprintk(verbose, MANTIS_ERROR, 1, "Aeio, Mantis NULL ptr");
return;
}
+ mantis_rc_exit(mantis);
mantis_core_exit(mantis);
dprintk(verbose, MANTIS_ERROR, 1, "Removing -->Mantis irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p",
pdev->irq, mantis->latency, mantis->mantis_addr,
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.c mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_rc.c
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.c 1970-01-01 02:00:00.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_rc.c 2008-03-03 22:12:18.000000000 +0200
@@ -0,0 +1,154 @@
+#include <linux/bitops.h>
+#include "mantis_common.h"
+#include "mantis_core.h"
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "dvb_demux.h"
+#include "dvb_frontend.h"
+#include "mantis_vp1033.h"
+#include "mantis_vp1034.h"
+#include "mantis_vp2033.h"
+#include "mantis_vp3030.h"
+
+#define POLL_FREQ (HZ/10)
+
+/* Twinhan CAB-CI 2033 */
+IR_KEYTAB_TYPE ir_codes_mantis_vp2033[IR_KEYTAB_SIZE] = {
+ [ 0x29 ] = KEY_POWER,
+ [ 0x28 ] = KEY_FAVORITES,
+ [ 0x30 ] = KEY_TEXT,
+ [ 0x17 ] = KEY_INFO, // Preview
+ [ 0x23 ] = KEY_EPG,
+ [ 0x3b ] = KEY_F22, // Record List
+
+ [ 0x3c ] = KEY_1,
+ [ 0x3e ] = KEY_2,
+ [ 0x39 ] = KEY_3,
+ [ 0x36 ] = KEY_4,
+ [ 0x22 ] = KEY_5,
+ [ 0x20 ] = KEY_6,
+ [ 0x32 ] = KEY_7,
+ [ 0x26 ] = KEY_8,
+ [ 0x24 ] = KEY_9,
+ [ 0x2a ] = KEY_0,
+
+ [ 0x33 ] = KEY_CANCEL,
+ [ 0x2c ] = KEY_BACK,
+ [ 0x15 ] = KEY_CLEAR,
+ [ 0x3f ] = KEY_TAB,
+ [ 0x10 ] = KEY_ENTER,
+ [ 0x14 ] = KEY_UP,
+ [ 0x0d ] = KEY_RIGHT,
+ [ 0x0e ] = KEY_DOWN,
+ [ 0x11 ] = KEY_LEFT,
+
+ [ 0x21 ] = KEY_VOLUMEUP,
+ [ 0x35 ] = KEY_VOLUMEDOWN,
+ [ 0x3d ] = KEY_CHANNELDOWN,
+ [ 0x3a ] = KEY_CHANNELUP,
+ [ 0x2e ] = KEY_RECORD,
+ [ 0x2b ] = KEY_PLAY,
+ [ 0x13 ] = KEY_PAUSE,
+ [ 0x25 ] = KEY_STOP,
+
+ [ 0x1f ] = KEY_REWIND,
+ [ 0x2d ] = KEY_FASTFORWARD,
+ [ 0x1e ] = KEY_PREVIOUS, // Replay |<
+ [ 0x1d ] = KEY_NEXT, // Skip >|
+
+ [ 0x0b ] = KEY_CAMERA, // Capture
+ [ 0x0f ] = KEY_LANGUAGE, // SAP
+ [ 0x18 ] = KEY_MODE, // PIP
+ [ 0x12 ] = KEY_ZOOM, // Full screen,
+ [ 0x1c ] = KEY_SUBTITLE,
+ [ 0x2f ] = KEY_MUTE,
+ [ 0x16 ] = KEY_F20, // L/R,
+ [ 0x38 ] = KEY_F21, // Hibernate,
+
+ [ 0x37 ] = KEY_SWITCHVIDEOMODE, // A/V
+ [ 0x31 ] = KEY_AGAIN, // Recall,
+ [ 0x1a ] = KEY_KPPLUS, // Zoom+,
+ [ 0x19 ] = KEY_KPMINUS, // Zoom-,
+ [ 0x27 ] = KEY_RED,
+ [ 0x0C ] = KEY_GREEN,
+ [ 0x01 ] = KEY_YELLOW,
+ [ 0x00 ] = KEY_BLUE,
+};
+
+void mantis_query_rc(struct work_struct *work)
+{
+ struct mantis_pci *mantis =
+ container_of(work, struct mantis_pci, ir.rc_query_work.work);
+ struct ir_input_state *ir = &mantis->ir.ir;
+
+ u32 lastkey = mantis->ir.ir_last_code;
+
+ if (lastkey != -1) {
+ ir_input_keydown(mantis->ir.rc_dev, ir, lastkey, 0);
+ mantis->ir.ir_last_code = -1;
+ } else {
+ ir_input_nokey(mantis->ir.rc_dev, ir);
+ }
+ schedule_delayed_work(&mantis->ir.rc_query_work, POLL_FREQ);
+}
+
+int mantis_rc_init(struct mantis_pci *mantis)
+{
+ struct input_dev *rc_dev;
+ struct mantis_ir *mir = &mantis->ir;
+ struct ir_input_state *ir = &mir->ir;
+ int err;
+
+ if (!mantis->hwconfig->ir_codes) {
+ dprintk(verbose, MANTIS_DEBUG, 1, "No RC codes available");
+ return 0;
+ }
+
+ mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK);
+
+ rc_dev = input_allocate_device();
+ if (!rc_dev) {
+ dprintk(verbose, MANTIS_ERROR, 1, "dvb_rc_init failed");
+ return -ENOENT;
+ }
+
+ mir->rc_dev = rc_dev;
+
+ snprintf(mir->rc_name, sizeof(mir->rc_name),
+ "Mantis %s IR Receiver", mantis->hwconfig->model_name);
+ snprintf(mir->rc_phys, sizeof(mir->rc_phys),
+ "pci-%s/ir0", pci_name(mantis->pdev));
+
+ rc_dev->name = mir->rc_name;
+ rc_dev->phys = mir->rc_phys;
+
+ ir_input_init(rc_dev, ir, IR_TYPE_OTHER, mantis->hwconfig->ir_codes);
+
+ rc_dev->id.bustype = BUS_PCI;
+ rc_dev->id.vendor = mantis->vendor_id;
+ rc_dev->id.product = mantis->device_id;
+ rc_dev->id.version = 1;
+ rc_dev->cdev.dev = &mantis->pdev->dev;
+
+ INIT_DELAYED_WORK(&mir->rc_query_work, mantis_query_rc);
+
+ err = input_register_device(rc_dev);
+ if (err) {
+ dprintk(verbose, MANTIS_ERROR, 1, "rc registering failed");
+ return -ENOENT;
+ }
+
+ schedule_delayed_work(&mir->rc_query_work, POLL_FREQ);
+ return 0;
+}
+
+int mantis_rc_exit(struct mantis_pci *mantis)
+{
+ mmwrite(mmread(MANTIS_INT_MASK) & (~MANTIS_INT_IRQ1), MANTIS_INT_MASK);
+
+ cancel_delayed_work(&mantis->ir.rc_query_work);
+ input_unregister_device(mantis->ir.rc_dev);
+ dprintk(verbose, MANTIS_DEBUG, 1, "RC unregistered");
+ return 0;
+}
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.h mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_rc.h
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_rc.h 1970-01-01 02:00:00.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_rc.h 2008-03-03 22:11:27.000000000 +0200
@@ -0,0 +1 @@
+extern IR_KEYTAB_TYPE ir_codes_mantis_vp2033[IR_KEYTAB_SIZE];
diff -urN mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2033.c mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_vp2033.c
--- mantis-a9ecd19a37c9.ORIG/linux/drivers/media/dvb/mantis/mantis_vp2033.c 2008-02-24 01:38:51.000000000 +0200
+++ mantis-a9ecd19a37c9/linux/drivers/media/dvb/mantis/mantis_vp2033.c 2008-03-03 22:11:08.000000000 +0200
@@ -20,6 +20,7 @@
#include "mantis_common.h"
#include "mantis_vp2033.h"
+#include "mantis_rc.h"
#define MANTIS_MODEL_NAME "VP-2033"
#define MANTIS_DEV_TYPE "DVB-C"
@@ -28,6 +29,7 @@
.model_name = MANTIS_MODEL_NAME,
.dev_type = MANTIS_DEV_TYPE,
.ts_size = MANTIS_TS_204,
+ .ir_codes = ir_codes_mantis_vp2033,
};
struct tda1002x_config philips_cu1216_config = {
[-- Attachment #3: Type: text/plain, Size: 150 bytes --]
_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2008-03-03 21:45 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-03 21:45 [linux-dvb] Mantis VP-2033 remote control patch ported for Manu's Mantis tree Pauli Borodulin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.