[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