All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Stezenbach <js@linuxtv.org>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org
Subject: [DVB patch 44/54] cinergyT2: remote control fixes
Date: Mon, 05 Sep 2005 01:23:43 +0200	[thread overview]
Message-ID: <20050904232333.429481000@abc> (raw)
In-Reply-To: 20050904232259.777473000@abc

[-- Attachment #1: dvb-cinergyT2-ir-rc-fixes.patch --]
[-- Type: text/plain, Size: 7116 bytes --]

IR RC fixes:
- EVIOCSKEYCODE is not supported by this driver, fix potential crash
  when it is used by not setting rc_input_dev->keycodesize
- fix key repeat handling (hopefully)
- reduce default poll internal to 50msec (necessary for key repeat handling)

Signed-off-by: Johannes Stezenbach <js@linuxtv.org>

 drivers/media/dvb/cinergyT2/Kconfig     |    2 
 drivers/media/dvb/cinergyT2/cinergyT2.c |   93 +++++++++++++++++++-------------
 2 files changed, 57 insertions(+), 38 deletions(-)

--- linux-2.6.13-git4.orig/drivers/media/dvb/cinergyT2/Kconfig	2005-09-04 22:03:40.000000000 +0200
+++ linux-2.6.13-git4/drivers/media/dvb/cinergyT2/Kconfig	2005-09-04 22:30:53.000000000 +0200
@@ -77,7 +77,7 @@ config DVB_CINERGYT2_ENABLE_RC_INPUT_DEV
 config DVB_CINERGYT2_RC_QUERY_INTERVAL
 	int "Infrared Remote Controller update interval [milliseconds]"
 	depends on DVB_CINERGYT2_TUNING && DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE
-        default "100"
+        default "50"
 	help
 	  If you have a very fast-repeating remote control you can try lower
 	  values, for normal consumer receivers the default value should be
--- linux-2.6.13-git4.orig/drivers/media/dvb/cinergyT2/cinergyT2.c	2005-09-04 22:27:49.000000000 +0200
+++ linux-2.6.13-git4/drivers/media/dvb/cinergyT2/cinergyT2.c	2005-09-04 22:30:53.000000000 +0200
@@ -35,7 +35,6 @@
 #include "dvb_demux.h"
 #include "dvb_net.h"
 
-
 #ifdef CONFIG_DVB_CINERGYT2_TUNING
 	#define STREAM_URB_COUNT (CONFIG_DVB_CINERGYT2_STREAM_URB_COUNT)
 	#define STREAM_BUF_SIZE (CONFIG_DVB_CINERGYT2_STREAM_BUF_SIZE)
@@ -48,7 +47,7 @@
 	#define STREAM_URB_COUNT (32)
 	#define STREAM_BUF_SIZE (512)	/* bytes */
 	#define ENABLE_RC (1)
-	#define RC_QUERY_INTERVAL (100)	/* milliseconds */
+	#define RC_QUERY_INTERVAL (50)	/* milliseconds */
 	#define QUERY_INTERVAL (333)	/* milliseconds */
 #endif
 
@@ -141,6 +140,8 @@ struct cinergyt2 {
 	struct input_dev rc_input_dev;
 	struct work_struct rc_query_work;
 	int rc_input_event;
+	u32 rc_last_code;
+	unsigned long last_event_jiffies;
 #endif
 };
 
@@ -155,7 +156,7 @@ struct cinergyt2_rc_event {
 	uint32_t value;
 } __attribute__((packed));
 
-static const uint32_t rc_keys [] = {
+static const uint32_t rc_keys[] = {
 	CINERGYT2_RC_EVENT_TYPE_NEC,	0xfe01eb04,	KEY_POWER,
 	CINERGYT2_RC_EVENT_TYPE_NEC,	0xfd02eb04,	KEY_1,
 	CINERGYT2_RC_EVENT_TYPE_NEC,	0xfc03eb04,	KEY_2,
@@ -684,52 +685,68 @@ static struct dvb_device cinergyt2_fe_te
 #ifdef ENABLE_RC
 static void cinergyt2_query_rc (void *data)
 {
-	struct cinergyt2 *cinergyt2 = (struct cinergyt2 *) data;
-	char buf [1] = { CINERGYT2_EP1_GET_RC_EVENTS };
+	struct cinergyt2 *cinergyt2 = data;
+	char buf[1] = { CINERGYT2_EP1_GET_RC_EVENTS };
 	struct cinergyt2_rc_event rc_events[12];
-	int n, len;
+	int n, len, i;
 
 	if (down_interruptible(&cinergyt2->sem))
 		return;
 
 	len = cinergyt2_command(cinergyt2, buf, sizeof(buf),
-			     (char *) rc_events, sizeof(rc_events));
-
-	for (n=0; len>0 && n<(len/sizeof(rc_events[0])); n++) {
-		int i;
+				(char *) rc_events, sizeof(rc_events));
+	if (len < 0)
+		goto out;
+	if (len == 0) {
+		if (time_after(jiffies, cinergyt2->last_event_jiffies +
+			       msecs_to_jiffies(150))) {
+			/* stop key repeat */
+			if (cinergyt2->rc_input_event != KEY_MAX) {
+				dprintk(1, "rc_input_event=%d Up\n", cinergyt2->rc_input_event);
+				input_report_key(&cinergyt2->rc_input_dev,
+						 cinergyt2->rc_input_event, 0);
+				cinergyt2->rc_input_event = KEY_MAX;
+			}
+			cinergyt2->rc_last_code = ~0;
+		}
+		goto out;
+	}
+	cinergyt2->last_event_jiffies = jiffies;
 
-/*		dprintk(1,"rc_events[%d].value = %x, type=%x\n",n,le32_to_cpu(rc_events[n].value),rc_events[n].type);*/
+	for (n = 0; n < (len / sizeof(rc_events[0])); n++) {
+		dprintk(1, "rc_events[%d].value = %x, type=%x\n",
+			n, le32_to_cpu(rc_events[n].value), rc_events[n].type);
 
 		if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC &&
-		    rc_events[n].value == ~0)
-		{
-			/**
-			 * keyrepeat bit. If we would handle this properly
-			 * we would need to emit down events as long the
-			 * keyrepeat goes, a up event if no further
-			 * repeat bits occur. Would need a timer to implement
-			 * and no other driver does this, so we simply
-			 * emit the last key up/down sequence again.
-			 */
+		    rc_events[n].value == ~0) {
+			/* keyrepeat bit -> just repeat last rc_input_event */
 		} else {
 			cinergyt2->rc_input_event = KEY_MAX;
-			for (i=0; i<sizeof(rc_keys)/sizeof(rc_keys[0]); i+=3) {
-				if (rc_keys[i+0] == rc_events[n].type &&
-				    rc_keys[i+1] == le32_to_cpu(rc_events[n].value))
-				{
-					cinergyt2->rc_input_event = rc_keys[i+2];
+			for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3) {
+				if (rc_keys[i + 0] == rc_events[n].type &&
+				    rc_keys[i + 1] == le32_to_cpu(rc_events[n].value)) {
+					cinergyt2->rc_input_event = rc_keys[i + 2];
 					break;
 				}
 			}
 		}
 
 		if (cinergyt2->rc_input_event != KEY_MAX) {
-			input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 1);
-			input_report_key(&cinergyt2->rc_input_dev, cinergyt2->rc_input_event, 0);
-			input_sync(&cinergyt2->rc_input_dev);
+			if (rc_events[n].value == cinergyt2->rc_last_code &&
+			    cinergyt2->rc_last_code != ~0) {
+				/* emit a key-up so the double event is recognized */
+				dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event);
+				input_report_key(&cinergyt2->rc_input_dev,
+						 cinergyt2->rc_input_event, 0);
+			}
+			dprintk(1, "rc_input_event=%d\n", cinergyt2->rc_input_event);
+			input_report_key(&cinergyt2->rc_input_dev,
+					 cinergyt2->rc_input_event, 1);
+			cinergyt2->rc_last_code = rc_events[n].value;
 		}
 	}
 
+out:
 	schedule_delayed_work(&cinergyt2->rc_query_work,
 			      msecs_to_jiffies(RC_QUERY_INTERVAL));
 
@@ -771,7 +788,10 @@ static int cinergyt2_probe (struct usb_i
 		  const struct usb_device_id *id)
 {
 	struct cinergyt2 *cinergyt2;
-	int i, err;
+	int err;
+#ifdef ENABLE_RC
+	int i;
+#endif
 
 	if (!(cinergyt2 = kmalloc (sizeof(struct cinergyt2), GFP_KERNEL))) {
 		dprintk(1, "out of memory?!?\n");
@@ -827,19 +847,18 @@ static int cinergyt2_probe (struct usb_i
 			    DVB_DEVICE_FRONTEND);
 
 #ifdef ENABLE_RC
-	init_input_dev(&cinergyt2->rc_input_dev);
-
-	cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY);
-	cinergyt2->rc_input_dev.keycodesize = sizeof(unsigned char);
-	cinergyt2->rc_input_dev.keycodemax = KEY_MAX;
+	cinergyt2->rc_input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
+	cinergyt2->rc_input_dev.keycodesize = 0;
+	cinergyt2->rc_input_dev.keycodemax = 0;
 	cinergyt2->rc_input_dev.name = DRIVER_NAME " remote control";
 
-	for (i=0; i<sizeof(rc_keys)/sizeof(rc_keys[0]); i+=3)
-		set_bit(rc_keys[i+2], cinergyt2->rc_input_dev.keybit);
+	for (i = 0; i < sizeof(rc_keys) / sizeof(rc_keys[0]); i += 3)
+		set_bit(rc_keys[i + 2], cinergyt2->rc_input_dev.keybit);
 
 	input_register_device(&cinergyt2->rc_input_dev);
 
 	cinergyt2->rc_input_event = KEY_MAX;
+	cinergyt2->rc_last_code = ~0;
 
 	INIT_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc, cinergyt2);
 	schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2);

--


  parent reply	other threads:[~2005-09-04 23:48 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-04 23:22 [DVB patch 00/54] DVB update Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 01/54] email address update Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 02/54] remove version.h dependencies Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 03/54] avoid building empty built-in.o Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 04/54] core: glue code for DMX_GET_CAPS and DMX_SET_SOURCE Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 05/54] core: dvb_demux: fix continuity counter error handling Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 06/54] core: dvb_demux: remove unused cruft Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 07/54] core: dvb_demux: remove unsused descramble callbacks Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 08/54] core: dvb_demux: remove more unused cruft Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 09/54] core: dvb_demux: use INIT_LIST_HEAD Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 10/54] core: dvb_demux formatting fixes Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 11/54] core: CI timeout fix Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 12/54] frontend: mt352: fix signal strength reading Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 13/54] frontend: stv0299: pass i2c bus to pll callback Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 14/54] frontend: s5h1420: fixes Johannes Stezenbach
2005-09-04 23:56   ` Nish Aravamudan
2005-09-05  8:45     ` Andrew de Quincey
2005-09-04 23:23 ` [DVB patch 15/54] frontend: stv0299: support reading both BER and UCBLOCKS Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 16/54] frontend: tda1004x: fix SNR reading Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 17/54] frontend: ves1820: improve tuning Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 18/54] frontend: cx24110: DiSEqC fix Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 19/54] frontend: cx24110: another " Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 20/54] frontend: cx24110: clean up timeout handling Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 21/54] frontend: stv0297: QAM128 tuning improvement Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 22/54] frontend: or51132: remove bogus optimization attempt Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 23/54] usb: add TwinhanDTV StarBox support Johannes Stezenbach
2005-09-04 23:52   ` Nish Aravamudan
2005-09-04 23:23 ` [DVB patch 24/54] usb: dibusb: Kworld Xpert DVB-T USB2.0 support Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 25/54] usb: removed empty module_init/exit calls Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 26/54] usb: dtt200u: copy frontend_ops before modifying Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 27/54] usb: dtt200u: add proper device names Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 28/54] usb: core: change dvb_usb_device_init() API Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 29/54] usb: digitv: support for nxt6000 demod Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 30/54] usb: white space cleanup Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 31/54] usb: cxusb: fixes for new firmware Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 32/54] remove noisy debug print Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 33/54] bt8xx: endianness fix Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 34/54] bt8xx: cleanup Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 35/54] bt8xx: Nebula DigiTV mt352 support Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 36/54] Nebula DigiTV nxt6000 fix Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 37/54] dst: fix symbol rate setting Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 38/54] dst: remove unnecessary code Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 39/54] dst: dprrintk cleanup Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 40/54] dst: identify boards Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 41/54] dst: fix DVB-C tuning Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 42/54] dst: ci doc update Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 43/54] dst: Updated Documentation Johannes Stezenbach
2005-09-04 23:23 ` Johannes Stezenbach [this message]
2005-09-04 23:23 ` [DVB patch 45/54] av7110: Siemens DVB-C analog video input support Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 46/54] budget-ci: add support for TT DVB-C CI card Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 47/54] budget-av: fixes for CI interface Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 48/54] budget-av: enable frontend on KNC1 Plus cards Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 49/54] av7110: disable superflous firmware handshake Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 50/54] av7110: conditionally disable workaround for broken firmware Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 51/54] ttpci: av7110: RC5+ remote control support Johannes Stezenbach
2005-09-04 23:41   ` Nish Aravamudan
2005-09-05  0:13     ` Johannes Stezenbach
2005-09-05  0:16       ` Nish Aravamudan
2005-09-05  0:27         ` Johannes Stezenbach
2005-09-05  0:34           ` Nish Aravamudan
2005-09-04 23:23 ` [DVB patch 52/54] ttpci: add PCI ids for old Siemens/TT DVB-C card Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 53/54] saa7146: i2c vs. sysfs fix Johannes Stezenbach
2005-09-04 23:23 ` [DVB patch 54/54] ttusb-budget: use time_after_eq() Johannes Stezenbach
2005-09-04 23:45   ` Nish Aravamudan
2005-09-05  0:07     ` Johannes Stezenbach
2005-09-05  0:14       ` Nish Aravamudan
2005-09-05  0:19         ` Johannes Stezenbach

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=20050904232333.429481000@abc \
    --to=js@linuxtv.org \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.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.