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
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 = {
_______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb