From: Jan Hoogenraad <jan-conceptronic@hoogenraad.net>
To: Alistair Buxton <a.j.buxton@gmail.com>
Cc: linux-media@vger.kernel.org, Antti Palosaari <crope@iki.fi>
Subject: Re: [PATCH] Rework the RTL2831 remote control handler to reuse dibusb.
Date: Mon, 03 Aug 2009 23:27:09 +0200 [thread overview]
Message-ID: <4A77562D.6060001@hoogenraad.net> (raw)
In-Reply-To: <3d374d00908021245g66fc66b1h66932f4844cb20b1@mail.gmail.com>
Alistar:
Thanks a lot for this patch.
I have never included a patch into the HG tree, so it will take a few
days to get this into the -r2 tree.
Can you also look at the way I set up a command-line switch for
switching remotes ?
Is there a standard within the other drivers ?
And should I write something in the Wiki ?
Antti Palosaari offered help in july to get the includable tree
(front-end / back-end split) up and running. I haven't heard from him
since, so I cc him.
Alistair Buxton wrote:
> Hi. This patch is against the rtl2831-r2 tree.
>
> This patch is really just a proof of concept, that the dibusb handler
> code can handle the rtl2831 remote codes. I have both types of device
> and noticed that the remotes are interchangable, and it turns out the
> code tables are too, but for a quirk in the way the rtl driver looks
> up the values (it uses the wrong fields in keybuf.)
>
> Is there any progress on getting the rtl2831 driver ready for
> inclusion into the mainline?
>
> # HG changeset patch
> # User Alistair Buxton <a.j.buxton@gmail.com>
> # Date 1249239142 -3600
> # Node ID 83476a81ce48824891f64cebfd293239acafc878
> # Parent 1557237aa2ebb25d807e4af251fdf08b182660fb
> RTL2831: Rework the RTL2831 remote control code to reuse the dibusb
> remote control handler.
>
> 1. Add the extra codes of the AzureWave AD-TU800 remote to the dibusb
> code table. This remote
> uses the same NEC codes as the dibusb remotes, but with extra buttons.
> As a bonus, this makes the AzureWave remote work with dibusb devices too.
>
> 2. Make rtd2831u_rc_query() use dvb_usb_nec_rc_key_to_event() instead
> of it's own slightly
> broken implementation.
>
> 3. Fix up the Conceptronic keycode table. This is NEC compatible but
> uses different codes to
> the dibusb_rc_keys[]. The fields are switched around to make the table
> compatible with
> dvb_usb_nec_rc_key_to_event().
>
> 4. Fudge the keybuf when using RC5 table.
>
> 5. Fix all the drivers that use dibusb_rc_keys[] with the new length.
>
> diff -r 1557237aa2eb -r 83476a81ce48
> linux/drivers/media/dvb/dvb-usb/dibusb-common.c
> --- a/linux/drivers/media/dvb/dvb-usb/dibusb-common.c Tue May 19
> 22:29:10 2009 +0200
> +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-common.c Sun Aug 02
> 19:52:22 2009 +0100
> @@ -351,6 +351,31 @@
> { 0x00, 0x48, KEY_INFO }, /* Preview */
> { 0x00, 0x04, KEY_LIST }, /* RecordList */
> { 0x00, 0x0f, KEY_TEXT }, /* Teletext */
> + /* additional keys for the azurewave remote */
> + { 0x00, 0x4a, KEY_UNKNOWN }, /* Clear */
> + { 0x00, 0x13, KEY_BACK },
> + { 0x00, 0x4b, KEY_UP },
> + { 0x00, 0x51, KEY_DOWN },
> + { 0x00, 0x4e, KEY_LEFT },
> + { 0x00, 0x52, KEY_RIGHT },
> + { 0x00, 0x4f, KEY_ENTER },
> + { 0x00, 0x4c, KEY_PAUSE },
> + { 0x00, 0x41, KEY_PREVIOUSSONG }, /* |< */
> + { 0x00, 0x42, KEY_NEXTSONG }, /* >| */
> + { 0x00, 0x54, KEY_CAMERA }, /* capture (has picture of camera on it) */
> + { 0x00, 0x50, KEY_UNKNOWN }, /* SAP */
> + { 0x00, 0x47, KEY_UNKNOWN }, /* PIP */
> + { 0x00, 0x4d, KEY_UNKNOWN }, /* fullscreen */
> + { 0x00, 0x43, KEY_SUBTITLE },
> + { 0x00, 0x49, KEY_UNKNOWN }, /* L/R */
> + { 0x00, 0x07, KEY_POWER2 }, /* hibernate */
> + { 0x00, 0x08, KEY_VIDEO_NEXT },
> + { 0x00, 0x45, KEY_ZOOMIN },
> + { 0x00, 0x46, KEY_ZOOMOUT },
> + { 0x00, 0x18, KEY_RED },
> + { 0x00, 0x53, KEY_GREEN },
> + { 0x00, 0x5e, KEY_YELLOW },
> + { 0x00, 0x5f, KEY_BLUE },
> /* Key codes for the KWorld/ADSTech/JetWay remote. */
> { 0x86, 0x12, KEY_POWER },
> { 0x86, 0x0f, KEY_SELECT }, /* source */
> diff -r 1557237aa2eb -r 83476a81ce48 linux/drivers/media/dvb/dvb-usb/dibusb-mb.c
> --- a/linux/drivers/media/dvb/dvb-usb/dibusb-mb.c Tue May 19 22:29:10 2009 +0200
> +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-mb.c Sun Aug 02 19:52:22 2009 +0100
> @@ -213,7 +213,7 @@
>
> .rc_interval = DEFAULT_RC_INTERVAL,
> .rc_key_map = dibusb_rc_keys,
> - .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> + .rc_key_map_size = 135, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> .rc_query = dibusb_rc_query,
>
> .i2c_algo = &dibusb_i2c_algo,
> @@ -297,7 +297,7 @@
>
> .rc_interval = DEFAULT_RC_INTERVAL,
> .rc_key_map = dibusb_rc_keys,
> - .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> + .rc_key_map_size = 135, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> .rc_query = dibusb_rc_query,
>
> .i2c_algo = &dibusb_i2c_algo,
> @@ -361,7 +361,7 @@
>
> .rc_interval = DEFAULT_RC_INTERVAL,
> .rc_key_map = dibusb_rc_keys,
> - .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> + .rc_key_map_size = 135, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> .rc_query = dibusb_rc_query,
>
> .i2c_algo = &dibusb_i2c_algo,
> @@ -418,7 +418,7 @@
>
> .rc_interval = DEFAULT_RC_INTERVAL,
> .rc_key_map = dibusb_rc_keys,
> - .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> + .rc_key_map_size = 135, /* wow, that is ugly ... I want to load it
> to the driver dynamically */
> .rc_query = dibusb_rc_query,
>
> .i2c_algo = &dibusb_i2c_algo,
> diff -r 1557237aa2eb -r 83476a81ce48 linux/drivers/media/dvb/dvb-usb/dibusb-mc.c
> --- a/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c Tue May 19 22:29:10 2009 +0200
> +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c Sun Aug 02 19:52:22 2009 +0100
> @@ -81,7 +81,7 @@
>
> .rc_interval = DEFAULT_RC_INTERVAL,
> .rc_key_map = dibusb_rc_keys,
> - .rc_key_map_size = 111, /* FIXME */
> + .rc_key_map_size = 135, /* FIXME */
> .rc_query = dibusb_rc_query,
>
> .i2c_algo = &dibusb_i2c_algo,
> diff -r 1557237aa2eb -r 83476a81ce48 linux/drivers/media/dvb/rtl2831/rtd2830u.c
> --- a/linux/drivers/media/dvb/rtl2831/rtd2830u.c Tue May 19 22:29:10 2009 +0200
> +++ b/linux/drivers/media/dvb/rtl2831/rtd2830u.c Sun Aug 02 19:52:22 2009 +0100
> @@ -24,6 +24,7 @@
>
> #include "rtd2831u.h"
> #include "tuner_demod_io.h"
> +#include "dibusb.h"
>
> DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
>
> @@ -58,45 +59,6 @@
> #define USB_EPA_CTL 0x0148
> /*(prev.line) epa contrl register */
>
> -#ifdef RTL2831U_NEC_PROTOCOL
> -static struct dvb_usb_rc_key rtd2831u_nec_keys[] = {
> - {0x03, 0xfc, KEY_1},
> - {0x01, 0xfe, KEY_2},
> - {0x06, 0xf9, KEY_3},
> - {0x09, 0xf6, KEY_4},
> - {0x1d, 0xe2, KEY_5},
> - {0x1f, 0xe0, KEY_6},
> - {0x0D, 0xf2, KEY_7},
> - {0x19, 0xe6, KEY_8},
> - {0x1b, 0xe4, KEY_9},
> - {0x15, 0xea, KEY_0},
> -
> - {0x17, 0xe8, KEY_S}, /*show scan page */
> - {0x14, 0xeb, KEY_G}, /*start scan */
> - {0x1a, 0xe5, KEY_X}, /*stop scan */
> -
> - {0x08, 0xf7, KEY_A}, /*de-interlace ---> advance scanpage */
> -
> - {0x0a, 0xf5, KEY_LEFT}, /*key_left */
> - {0x1e, 0xe1, KEY_RIGHT}, /*key_right */
> - {0x11, 0xee, KEY_BACKSPACE}, /*backspace */
> -
> - {0x0a, 0xf5, KEY_VOLUMEDOWN}, /*vol- */
> - {0x1e, 0xe1, KEY_VOLUMEUP}, /*vol+ */
> - {0x10, 0xef, KEY_MUTE}, /*mute */
> -
> - {0x05, 0xfa, KEY_CHANNELUP}, /*channel+ */
> - {0x02, 0xfd, KEY_CHANNELDOWN}, /*channel- */
> - {0x4f, 0xb0, KEY_LAST}, /*last channel */
> -
> - {0x05, 0xfa, KEY_UP}, /*country + */
> - {0x02, 0xfd, KEY_DOWN}, /*country- */
> -
> - {0x16, 0xe9, KEY_POWER}, /*End(poweroff) */
> - {0x4c, 0xb3, KEY_R}, /*Reboot */
> -};
> -#endif
> -
> #ifdef RTL2831U_RC5_PROTOCOL
> /* philip rc5 keys */
> static struct dvb_usb_rc_key rtd2831u_rc5_keys[] = {
> @@ -137,28 +99,28 @@
> */
>
> static struct dvb_usb_rc_key rtd2831u_conceptronic_keys[] = {
> - {0x04, 0xfb, KEY_1},
> - {0x05, 0xfa, KEY_2},
> - {0x06, 0xf9, KEY_3},
> - {0x07, 0xf8, KEY_4},
> - {0x08, 0xf7, KEY_5},
> - {0x09, 0xf6, KEY_6},
> - {0x0a, 0xf5, KEY_7},
> - {0x1b, 0xe4, KEY_8},
> - {0x1f, 0xe0, KEY_9},
> - {0x0d, 0xf2, KEY_0},
> + {0x80, 0x04, KEY_1},
> + {0x80, 0x05, KEY_2},
> + {0x80, 0x06, KEY_3},
> + {0x80, 0x07, KEY_4},
> + {0x80, 0x08, KEY_5},
> + {0x80, 0x09, KEY_6},
> + {0x80, 0x0a, KEY_7},
> + {0x80, 0x1b, KEY_8},
> + {0x80, 0x1f, KEY_9},
> + {0x80, 0x0d, KEY_0},
>
> - {0x02, 0xfd, KEY_VOLUMEDOWN}, /*vol- */
> - {0x1a, 0xe5, KEY_VOLUMEUP}, /*vol+ */
> - {0x01, 0xfe, KEY_MUTE}, /*mute */
> + {0x80, 0x02, KEY_VOLUMEDOWN}, /*vol- */
> + {0x80, 0x1a, KEY_VOLUMEUP}, /*vol+ */
> + {0x80, 0x01, KEY_MUTE}, /*mute */
>
> - {0x1e, 0xe1, KEY_CHANNELUP}, /*channel+ */
> - {0x03, 0xfc, KEY_CHANNELDOWN}, /*channel- */
> + {0x80, 0x1e, KEY_CHANNELUP}, /*channel+ */
> + {0x80, 0x03, KEY_CHANNELDOWN}, /*channel- */
>
> - {0x12, 0xed, KEY_POWER}, /*End(poweroff) */
> - {0x0e, 0xf1, KEY_LAST}, /*last channel */
> + {0x80, 0x12, KEY_POWER}, /*End(poweroff) */
> + {0x80, 0x0e, KEY_LAST}, /*last channel */
>
> - {0x0c, 0xf3, KEY_ZOOM}, /* zoom was not assigned, now Z */
> + {0x80, 0x0c, KEY_ZOOM}, /* zoom was not assigned, now Z */
> };
>
> #endif
> @@ -196,8 +158,8 @@
> case RTL2831U_NEC_TYPE:
> deb_info("Selected IR type 0x%02x\n", ir_protocol);
> memcpy(reg_val, NEC_REG_VAL, sizeof(u8) * ARRAY_SIZE(reg_val));
> - d->props.rc_key_map = rtd2831u_nec_keys;
> - d->props.rc_key_map_size = ARRAY_SIZE(rtd2831u_nec_keys);
> + d->props.rc_key_map = dibusb_rc_keys;
> + d->props.rc_key_map_size = 135;
> break;
> case RTL2831U_RC5_TYPE:
> deb_info("Selected IR type 0x%02x\n", ir_protocol);
> @@ -237,47 +199,9 @@
> return 1;
> }
>
> -static int rtd2831u_rc_key_to_event(struct dvb_usb_device *d,
> - u8 keybuf[4], u32 * event, int *state)
> -{
> - int i;
> - struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
> - *event = 0;
> - *state = REMOTE_NO_KEY_PRESSED;
> -
> - switch (ir_protocol) {
> - case RTL2831U_RC5_TYPE:
> - keybuf[0] = (keybuf[0] & 0x00);
> - keybuf[1] = (keybuf[1] & 0x00);
> - keybuf[2] = (keybuf[2] & 0x00);
> - keybuf[3] = (keybuf[3] & 0xff);
> - break;
> - }
> -
> -/* deb_info("raw key code 0x%02x, 0x%02x, 0x%02x,
> 0x%02x\n",keybuf[0], keybuf[1], keybuf[2], keybuf[3]); */
> - /* See if we can match the raw key code. */
> - for (i = 0; i < d->props.rc_key_map_size; i++)
> - if (keymap[i].custom == keybuf[2]
> - && keymap[i].data == keybuf[3]) {
> - *event = keymap[i].event;
> - *state = REMOTE_KEY_PRESSED;
> - return 0;
> - }
> -
> - if (*state != REMOTE_KEY_PRESSED) {
> - deb_info
> - ("Unmatched raw key code 0x%02x, 0x%02x, 0x%02x, 0x%02x: please
> try other setting for parameter ir_protocol\n",
> - keybuf[0], keybuf[1], keybuf[2], keybuf[3]);
> - }
> -
> - return 0;
> -
> -}
> -
> static int rtd2831u_rc_query(struct dvb_usb_device *d, u32 * event, int *state)
> {
> - u8 key[4];
> - u8 b = 0xcc;
> + u8 key[5] = {0xcc, 0, 0, 0, 0};
> struct rtl2831u_rc_state *p_rc_state = d->priv;
>
> *event = 0;
> @@ -290,21 +214,36 @@
> goto error;
> }
>
> - if (RTD2831_READ_BYTES(d, RTD2831U_SYS, IRRC_SR, &b, 1))
> + if (RTD2831_READ_BYTES(d, RTD2831U_SYS, IRRC_SR, &key[0], 1))
> goto error;
>
> - if (b & 0x01) {
> - if (RTD2831_READ_BYTES(d, RTD2831U_SYS, IRRC_RP, key, 4))
> + if (key[0] & 0x01) {
> + if (RTD2831_READ_BYTES(d, RTD2831U_SYS, IRRC_RP, &key[1], 4))
> goto error;
> - b = 0x01;
> - if (RTD2831_WRITE_BYTES(d, RTD2831U_SYS, IRRC_SR, &b, 1))
> + key[0] = 0x01;
> + if (RTD2831_WRITE_BYTES(d, RTD2831U_SYS, IRRC_SR, &key[0], 1))
> goto error;
>
> if (++p_rc_state->repeat_key_count <
> p_rc_state->rc_key_repeat_count)
> return 0; /*set two events to 1(repeat.....) */
>
> - rtd2831u_rc_key_to_event(d, key, event, state);
> + /* in the old code, keybuf was 4 bytes. in the dibusb, keybuf is 5 bytes.
> + byte 0 is the cmd. bytes 1-4 are bytes 0-3 from the old.
> + so we must switch around some bytes to make the rc5 table valid.
> + This probably isn't necessary (can just fix the table instead)
> + but I can't tell without the actual un-switched remote codes. */
> +
> + switch (ir_protocol) {
> + case RTL2831U_RC5_TYPE:
> + key[1] = 0x00; // custom - 0 in rc5 table
> + key[2] = 0xff; // checksum/compliment of keybuf[1]
> + key[3] = (key[4] & 0xff); // data (need to move it)
> + key[4] = ~key[3]; // checksum/compliment
> + break;
> + }
> +
> + dvb_usb_nec_rc_key_to_event(d, key, event, state);
> p_rc_state->repeat_key_count = 0;
> /*(prev.line) reset counter to 0 */
> }
> @@ -412,17 +351,16 @@
>
> .rc_interval = 300,
> #ifdef RTL2831U_NEC_PROTOCOL
> - .rc_key_map = rtd2831u_nec_keys,
> - .rc_key_map_size = ARRAY_SIZE(rtd2831u_nec_keys),
> -#else
> -#ifdef RTL2831U_RC5_PROTOCOL
> + .rc_key_map = dibusb_rc_keys,
> + .rc_key_map_size = 135,
> +#elif defined RTL2831U_RC5_PROTOCOL
> .rc_key_map = rtd2831u_rc5_keys,
> .rc_key_map_size = ARRAY_SIZE(rtd2831u_rc5_keys),
> #elif defined RTL2831U_CONCEPTRONIC_PROTOCOL
> .rc_key_map = rtd2831u_conceptronic_keys,
> .rc_key_map_size = ARRAY_SIZE(rtd2831u_conceptronic_keys),
> #endif
> -#endif
> +
> .rc_query = rtd2831u_rc_query,
>
> .num_device_descs = 8,
> @@ -487,17 +425,15 @@
>
> .rc_interval = 300,
> #ifdef RTL2831U_NEC_PROTOCOL
> - .rc_key_map = rtd2831u_nec_keys,
> - .rc_key_map_size = ARRAY_SIZE(rtd2831u_nec_keys),
> -#else
> -#ifdef RTL2831U_RC5_PROTOCOL
> + .rc_key_map = dibusb_rc_keys,
> + .rc_key_map_size = 135,
> +#elif defined RTL2831U_RC5_PROTOCOL
> .rc_key_map = rtd2831u_rc5_keys,
> .rc_key_map_size = ARRAY_SIZE(rtd2831u_rc5_keys),
> #elif defined RTL2831U_CONCEPTRONIC_PROTOCOL
> .rc_key_map = rtd2831u_conceptronic_keys,
> .rc_key_map_size = ARRAY_SIZE(rtd2831u_conceptronic_keys),
> #endif
> -#endif
> .rc_query = rtd2831u_rc_query,
>
> .num_device_descs = 5,
>
>
>
>
>
--
Jan Hoogenraad
Hoogenraad Interface Services
Postbus 2717
3500 GS Utrecht
next prev parent reply other threads:[~2009-08-03 21:28 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-02 19:45 [PATCH] Rework the RTL2831 remote control handler to reuse dibusb Alistair Buxton
2009-08-03 21:27 ` Jan Hoogenraad [this message]
2009-08-16 16:42 ` Antti Palosaari
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=4A77562D.6060001@hoogenraad.net \
--to=jan-conceptronic@hoogenraad.net \
--cc=a.j.buxton@gmail.com \
--cc=crope@iki.fi \
--cc=linux-media@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox