All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pauli Borodulin <pauli@borodulin.fi>
To: linux-dvb@linuxtv.org
Subject: [linux-dvb] Mantis VP-2033 remote control patch ported for Manu's Mantis tree
Date: Mon, 03 Mar 2008 23:45:24 +0200	[thread overview]
Message-ID: <47CC7174.20404@borodulin.fi> (raw)

[-- 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

                 reply	other threads:[~2008-03-03 21:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47CC7174.20404@borodulin.fi \
    --to=pauli@borodulin.fi \
    --cc=linux-dvb@linuxtv.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.