[linux-dvb] kworld atsc 110 remote

Jonathan Isom jeisom at gmail.com
Mon Apr 2 18:34:05 CEST 2007


here is the patch .  I changed
-        mod_timer(&ir->timer, jiffies+HZ/10);
to
+       mod_timer(&ir->timer, jiffies+HZ/20);
to improve responsiveness.  polls twice as often.  Not sure where the
change should go though.  Has anyone actually got a repeat from this
card, cause for the life of me i can't.
          Hope this helps someone
                 Jonathan

On 4/2/07, Nathan Faust <nfaust at merchantwarehouse.com> wrote:
> Jon,
>
> Can you post your kernel patch with the fixes.
> I'm probably using the one by Dwaine Garden "80th attempt...." post.
> I would like any improvement in button response.
>
> Thank you.
> Nathan.
> -------------------------------------------
> Nathan Faust
>
>
> -----Original Message-----
> From: Jonathan Isom [mailto:jeisom at gmail.com]
> Sent: Monday, April 02, 2007 11:13 AM
> To: Nathan Faust
> Cc: linux-dvb at linuxtv.org
> Subject: Re: [linux-dvb] kworld atsc 110 remote
>
> Hello
>     Yeah I have a modified patch that seems more responsive that
> detects button presses
> through gpio.  also the patch I found on the list (80th attempt....)
> has some duplicate entries
> in the key map that i think is causing some of the
> problems(specifically presses being miss
> detected as  other buttons.  so far (since last night) it seems
> better. Though I'd like to use
> lirc directly so any remote would work.  the lirc_i2c driver is very
> similar to the saa7134's i2c
> input driver, code wise , but I just get 1 byte codes like its hard
> coded for there remote.
> If the patch stays stable I'll post it.
>                       later
>                           Jonathan
> On 4/2/07, Nathan Faust <nfaust at merchantwarehouse.com> wrote:
> > Jon,
> >
> > Having the same card, the best I have done is:
> > Apply the kernel patch to create an event input device for the ir
> > sensor.
> >         I'm still seeing some of the issues talked about with the
> patch:
> > delayed button presses the most         notable one.
> > I created a udev rule to map /dev/input/event? -> /dev/input/irremote
> >         KERNEL=="event*",ATTRS{modalias}=="input:b0018v0000p0000e0000-
> >
> e0,1,14,k71,72,73,74,80,9F,A3,A4,A5,A7,A8,D2,D9,16D,174,188,189,192,193,
> > ramlsfw",SYMLINK="input/
> >         irremote"
> > I setup lirc in /etc/lirc/hardware.conf to read from the dev/input
> > driver on /dev/input/irremote
> >         # /etc/lirc/hardware.conf
> >         #
> >         # Arguments which will be used when launching lircd
> >         LIRCD_ARGS=""
> >         #Don't start lircmd even if there seems to be a good config
> file
> >         #START_LIRCMD=false
> >         #Try to load appropriate kernel modules
> >         LOAD_MODULES=false
> >         # Run "lircd --driver=help" for a list of supported drivers.
> >         DRIVER="dev/input"
> >         # If DEVICE is set to /dev/lirc and devfs is in use
> /dev/lirc/0
> > will be
> >         # automatically used instead
> >         DEVICE="/dev/input/irremote"
> >         MODULES=""
> >         # Default configuration files for your hardware if any
> >         LIRCD_CONF="/etc/lirc/lircd.conf"
> >         LIRCMD_CONF=""
> > And used the lircd.conf file from
> > http://lirc.sourceforge.net/remotes/kworld/ATSC_110
> > -------------------------------------------
> > Nathan Faust
> >
> >
> > -----Original Message-----
> > From: linux-dvb-bounces at linuxtv.org
> > [mailto:linux-dvb-bounces at linuxtv.org] On Behalf Of Jonathan Isom
> > Sent: Sunday, April 01, 2007 9:24 PM
> > To: linux-dvb at linuxtv.org
> > Subject: [linux-dvb] kworld atsc 110 remote
> >
> > Hello
> >     I'm hoping some one can help me.  I'm trying to make lirc handle
> > the remote control for the 110 but all the data i get from the card is
> > from the remote that came with the card.  The codes i receive from the
> > remote are 1 byte long and match the buttons mapping in the patch
> > floating around.  I was wondering if maybe you have to init the ir
> > controller to use it with another remote.
> >             any ideas
> >                   Jonathan
> >
> > _______________________________________________
> > linux-dvb mailing list
> > linux-dvb at linuxtv.org
> > http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
> >
> >
> >
>
>
>
-------------- next part --------------
diff -uprN b/linux/drivers/media/common/ir-keymaps.c a/linux/drivers/media/common/ir-keymaps.c
--- b/linux/drivers/media/common/ir-keymaps.c	2007-03-30 13:07:10.000000000 -0500
+++ a/linux/drivers/media/common/ir-keymaps.c	2007-04-02 02:56:42.040426917 -0500
@@ -1827,3 +1827,56 @@ IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTA
 };
 
 EXPORT_SYMBOL_GPL(ir_codes_tt_1500);
+
+IR_KEYTAB_TYPE ir_codes_kworld_atsc110[IR_KEYTAB_SIZE] = {
+        [ 0x00 ] = KEY_1,
+        [ 0x01 ] = KEY_2,
+        [ 0x02 ] = KEY_3,
+        [ 0x03 ] = KEY_4,
+        [ 0x04 ] = KEY_5,
+        [ 0x05 ] = KEY_6,
+        [ 0x06 ] = KEY_7,
+        [ 0x07 ] = KEY_8,
+        [ 0x08 ] = KEY_9,
+        [ 0x0a ] = KEY_0,
+        [ 0x09 ] = KEY_ESC,              /* UP ARROW */
+        [ 0x0c ] = KEY_POWER,            /* POWER */
+        [ 0x0b ] = KEY_SEARCH,		/* SEARCH */
+        [ 0x0d ] = KEY_EPG,             /* GUIDE */
+        [ 0x1b ] = KEY_RECORD,          /* RECORD */
+        [ 0x16 ] = KEY_PAUSE,           /* PAUSE */
+        [ 0x1a ] = KEY_STOP,            /* STOP */
+        [ 0x1d ] = KEY_VOLUMEDOWN,      /* VOLUME- */
+        [ 0x1c ] = KEY_VOLUMEUP,        /* VOLUME+ */
+        [ 0x1f ] = KEY_CHANNELDOWN,     /* CHANNEL/PAGE- */
+        [ 0x1e ] = KEY_CHANNELUP,       /* CHANNEL/PAGE+ */
+        [ 0x10 ] = KEY_UP,              /* KEY_SCROLLUP */
+        [ 0x12 ] = KEY_LEFT,            /* KEY_BACK */
+        [ 0x0e ] = KEY_ENTER,           /* KEY_ENTER */
+        [ 0x13 ] = KEY_RIGHT,           /* KEY_FORWARD */
+        [ 0x11 ] = KEY_DOWN,            /* KEY_SCROLLDOWN */
+        [ 0x14 ] = KEY_MUTE,            /* MUTE */
+        [ 0x15 ] = KEY_AUDIO,           /* STEREO */
+        [ 0x16 ] = KEY_VIDEO,           /* SOURCE */
+        [ 0x17 ] = KEY_ZOOM,            /* ZOOM */
+        [ 0x18 ] = KEY_PRINT,           /* SHUTDOWN */
+        [ 0X19 ] = KEY_T,               /* TIMESHIFT */
+        [ 0x44 ] = KEY_PLAYPAUSE,       /* PAUSE/PLAY */
+        [ 0x45 ] = KEY_STOP,            /* STOP */
+        [ 0x40 ] = KEY_REWIND,          /* REWIND */
+        [ 0x41 ] = KEY_FORWARD,         /* FASTFORWARD */
+        [ 0x42 ] = KEY_PREVIOUSSONG,    /* PREVIOUS */
+        [ 0x43 ] = KEY_NEXTSONG,        /* NEXT */
+
+        // buttons a-h
+        [ 0x48 ] = KEY_A, 
+        [ 0x49 ] = KEY_B,
+        [ 0x4a ] = KEY_C,
+        [ 0x4b ] = KEY_D,
+        [ 0x4c ] = KEY_E,
+        [ 0x4d ] = KEY_F,
+        [ 0x4e ] = KEY_G,
+        [ 0x4f ] = KEY_H
+};
+
+EXPORT_SYMBOL_GPL(ir_codes_kworld_atsc110);
diff -uprN b/linux/drivers/media/video/ir-kbd-i2c.c a/linux/drivers/media/video/ir-kbd-i2c.c
--- b/linux/drivers/media/video/ir-kbd-i2c.c	2007-03-30 13:07:10.000000000 -0500
+++ a/linux/drivers/media/video/ir-kbd-i2c.c	2007-04-02 11:21:19.140426918 -0500
@@ -44,6 +44,8 @@
 #include <media/ir-kbd-i2c.h>
 #include "compat.h"
 
+#include "saa7134.h"
+#include "saa7134-reg.h"
 /* ----------------------------------------------------------------------- */
 /* insmod parameters                                                       */
 
@@ -61,6 +63,8 @@ MODULE_PARM_DESC(hauppauge, "Specify Hau
 
 /* ----------------------------------------------------------------------- */
 
+static int kworldatsc110 = 0; /* Both KNC1 and the Kworld ATSC110 cards use the same i2c address */
+
 static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
 {
 	unsigned char buf[3];
@@ -133,7 +137,27 @@ static int get_key_pv951(struct IR_i2c *
 
 static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
 {
-	unsigned char b;
+	unsigned char b=0;
+	int gpio;
+
+	/* <dev> is needed to access GPIO. Used by the saa_readl macro. */
+	struct saa7134_dev *dev = ir->c.adapter->algo_data;
+	if (dev == NULL) {
+	       dprintk (1,"get_key_knc1: gir->c.adapter->algo_data is NULL!\n");
+	       return -EIO;
+	}
+
+	/* rising SAA7134_GPIO_GPRESCAN reads the status */
+	saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+	saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+
+	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
+       /* GPIO&0x100 is pulsed low when a button is pressed. Don't do
+          I2C receive if gpio&0x100 is not low. */
+
+	if( gpio & 0x100) {
+	         return 0;
+	 }
 
 	/* poll IR chip */
 	if (1 != i2c_master_recv(&ir->c,&b,1)) {
@@ -143,17 +167,15 @@ static int get_key_knc1(struct IR_i2c *i
 
 	/* it seems that 0xFE indicates that a button is still hold
 	   down, while 0xff indicates that no button is hold
-	   down. 0xfe sequences are sometimes interrupted by 0xFF */
-
-	dprintk(2,"key %02x\n", b);
-
-	if (b == 0xff)
-		return 0;
+	   down. 0xfe and 0x80 sequences are sometimes interrupted by 0xFF */
 
-	if (b == 0xfe)
-		/* keep old data */
-		return 1;
+	dprintk(1,"key %02x\n", b);
 
+			
+       if ((b == 0xfe)||(b & 0x80))
+                /* keep old data */
+                return 1;
+	
 	*ir_key = b;
 	*ir_raw = b;
 	return 1;
@@ -280,7 +302,7 @@ static void ir_work(struct work_struct *
 	struct IR_i2c *ir = container_of(work, struct IR_i2c, work);
 #endif
 	ir_key_poll(ir);
-	mod_timer(&ir->timer, jiffies+HZ/10);
+	mod_timer(&ir->timer, jiffies+HZ/20);
 }
 
 /* ----------------------------------------------------------------------- */
@@ -363,10 +385,15 @@ static int ir_attach(struct i2c_adapter 
 		}
 		break;
 	case 0x30:
-		name        = "KNC One";
 		ir->get_key = get_key_knc1;
 		ir_type     = IR_TYPE_OTHER;
-		ir_codes    = ir_codes_empty;
+		if (kworldatsc110 == 1) {
+			name        = "Kworld ATSC110";
+			ir_codes    = ir_codes_kworld_atsc110;
+		} else {
+			name        = "KNC One";
+			ir_codes    = ir_codes_empty;
+		}  
 		break;
 	case 0x7a:
 	case 0x47:
@@ -468,8 +495,8 @@ static int ir_probe(struct i2c_adapter *
 	   That's why we probe 0x1a (~0x34) first. CB
 	*/
 
-	static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
-	static const int probe_saa7134[] = { 0x7a, 0x47, 0x71, -1 };
+	static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1 };
+	static const int probe_saa7134[] = { 0x7a, 0x30, 0x47, 0x71, -1 };
 	static const int probe_em28XX[] = { 0x30, 0x47, -1 };
 	const int *probe = NULL;
 	struct i2c_client c;
@@ -498,6 +525,30 @@ static int ir_probe(struct i2c_adapter *
 	for (i = 0; -1 != probe[i]; i++) {
 		c.addr = probe[i];
 		rc = i2c_master_recv(&c,&buf,0);
+
+		/* Special case for Kworld ATSC110 remote */
+		if (c.adapter->id == I2C_HW_SAA7134 && probe[i] == 0x30)
+		{
+			struct i2c_client c2;
+			
+			memset (&c2, 0, sizeof(c2));
+			c2.adapter = c.adapter;
+				
+			for (c2.addr=127; c2.addr > 0; c2.addr--) {
+				if (0 == i2c_master_recv(&c2,&buf,0)) {
+					dprintk(1,"Found another device, at addr 0x%02x\n", c2.addr);
+					break;
+				}
+			}
+
+			/* Now do the probe. The controller does not respond
+			   to 0-byte reads, so we use a 1-byte read instead. */
+			rc = i2c_master_recv(&c,&buf,1);
+			rc--;
+			kworldatsc110 = 1;
+		} else {
+			rc = i2c_master_recv(&c,&buf,0);
+		}
 		dprintk(1,"probe 0x%02x @ %s: %s\n",
 			probe[i], adap->name,
 			(0 == rc) ? "yes" : "no");
diff -uprN b/linux/drivers/media/video/saa7134/saa7134-cards.c a/linux/drivers/media/video/saa7134/saa7134-cards.c
--- b/linux/drivers/media/video/saa7134/saa7134-cards.c	2007-03-30 13:07:10.000000000 -0500
+++ a/linux/drivers/media/video/saa7134/saa7134-cards.c	2007-03-30 21:12:01.663329134 -0500
@@ -4346,6 +4346,9 @@ int saa7134_board_init1(struct saa7134_d
 	case SAA7134_BOARD_PINNACLE_PCTV_110i:
 	case SAA7134_BOARD_PINNACLE_PCTV_310i:
 	case SAA7134_BOARD_UPMOST_PURPLE_TV:
+	case SAA7134_BOARD_KWORLD_ATSC110:
+		dev->has_remote = SAA7134_REMOTE_I2C;
+		break;
 	case SAA7134_BOARD_HAUPPAUGE_HVR1110:
 		dev->has_remote = SAA7134_REMOTE_I2C;
 		break;
diff -uprN b/linux/drivers/media/video/saa7134/saa7134-i2c.c a/linux/drivers/media/video/saa7134/saa7134-i2c.c
--- b/linux/drivers/media/video/saa7134/saa7134-i2c.c	2007-03-30 13:07:10.000000000 -0500
+++ a/linux/drivers/media/video/saa7134/saa7134-i2c.c	2007-03-30 21:12:01.663329134 -0500
@@ -350,6 +350,7 @@ static int attach_inform(struct i2c_clie
 
 	switch (client->addr) {
 		case 0x7a:
+		case 0x30:
 		case 0x47:
 		case 0x71:
 		{
diff -uprN b/linux/include/media/ir-common.h a/linux/include/media/ir-common.h
--- b/linux/include/media/ir-common.h	2007-03-30 13:07:10.000000000 -0500
+++ a/linux/include/media/ir-common.h	2007-03-30 21:12:01.683329134 -0500
@@ -140,6 +140,7 @@ extern IR_KEYTAB_TYPE ir_codes_budget_ci
 extern IR_KEYTAB_TYPE ir_codes_asus_pc39[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE];
+extern IR_KEYTAB_TYPE ir_codes_kworld_atsc110[IR_KEYTAB_SIZE];
 
 #endif
 


More information about the linux-dvb mailing list