Steve,<br>

<br>

I've been trying to do exactly the same thing and wrote a big long e-mail at work about it, but I lost it :-(.<br>

<br>

Attached is a patch of as far as I got with it. I kindof gave up
because I don't have the confidence to continue really.&nbsp; *Don't*
apply the patch unless you know what you're doing. I wouldn't want to
crash your system.<br>

<br>

Please keep in mind I'm a complete linux kernel newbie - &amp;
programming C isn't my forte (&amp; I'm lazy). I'm trying to get out of
not statically allocating my swap_table array because I wanted to see
all my changes on the same page.<br>

<br>

I'm using debug=49 which gives loads of info.<br>

<br>

There are a few issues.<br>

<br>
- I tried my freecom USB stick with a JVC DVD remote similar to
<a href="http://lirc.sourceforge.net/remotes/jvc/RM-SXVS40A" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://lirc.sourceforge.net/remotes/jvc/RM-SXVS40A</a>
I worked out that
the 2 bytes received by the stick had their nibbles swapped and the
bits reversed in comparison with the LIRC definition of things. The
patch muddles the bits around to fix it. There's probably some macro
somewhere in the kernel code to fix this by magic, but I never know how
to find those things.<br>

<br>

- The freecom remote seems to transmit 4 bytes, 1 byte identifier
(0x80), 1 byte code,&nbsp; and 2 checksum (same but NOTed I think).<br>

<br>
- The JVC remote transmits 2 bytes: an identifier (0xf7) and 1 byte code.<br>

<br>

- The freeecom stick seems to have a 5 byte buffer. THe first byte is
always 1 if there something new (I think), and the remaining 4 bytes<br>

<br>

- If the freecom remote transmits, all 4 bytes are written over.
However, if the JVC remote transmits, only the first 2 are written over
&amp; the remaining 2 bytes aren't. So here's the first problem: If you
want to do the checksum, then the JVC remote will always fail the
checksum. I put a workaround for this by checking whether the first
byte was the freecom remote first byte (0x80) &amp; if it was, then do
the checksum. This probably isn't a valid solution for all remotes, but
it got me around it.
<br>

<br>

- Having worked this out, the problem is, how to get the key-code to
lirc. I thought at first of looking at /proc/dev/input/devices to see
where the output is going. Mine looks like this:<br>

<br>

I: Bus=0000 Vendor=0000 Product=0000 Version=0000<br>

N: Name=&quot;IR-receiver inside an USB DVB receiver&quot;<br>

P: Phys=/ir0<br>

H: Handlers=kbd event3<br>

B: EV=3<br>

B: KEY=c0000 100002 0 0 0 0 0 0 0 1e0000 0 0 ffc<br>

<br>

Which suggests I should look at /dev/input/event3<br>

<br>

But when I cat /dev/input/event3 &amp; try my JVC remote nothign
happens. I think this is because, when you setup the input device (in
dvb_usb_remote_init()) you have to tell the kernel which key-codes you
will generate by setting some mask values with set_bit(). That got a
little complicated for me.<br>

<br>

At this point I decided I was way out of my depth because really these
aren't valid key codes being generated by the remote (i.e. it isn't
KEY_1) when I hit the JVC remote 1 key. In fact, I want to let lirc do
the key decoding. So perhaps to get key-codes out to lirc we need to
create a completely separate char device that has nothing to do with
the linux input subsystem. I dunno.<br>

<br>

Phew, that's tiring.<br>

<br>

I'd help out for fun if you need. Let me know if I've gone completely down the wrong track.<br>

<br>

Cheers!<br>

<br>

Keith<br>

<br>

<br>

<br>

<br>

BEGIN PATCH <br>

<br>


Index: dtt200u.c<br>

==============================
<div>=====================================<br>
RCS file: /cvs/video4linux/v4l-dvb/linux/drivers/media/dvb/dvb-usb/dtt200u.c,v<br>
retrieving revision 1.20<br>
diff -r1.20 dtt200u.c<br>
83d82<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dvb_usb_nec_rc_key_to_event(d,key,event,state);<br>
85a85,120<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key[1] == 0x80) {<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dvb_usb_nec_rc_key_to_event(d,key,event,state);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 swapped_keys[5];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
u8 swap_table[] =
{0x0,0x8,0x4,0xC,0x2,0xA,0x6,0xE,0x1,0x9,0x5,0xD,0x3,0xB,0x7,0xF};<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 nibl, nibh;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *event = 0;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *state = REMOTE_NO_KEY_PRESSED;<br>
&gt;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(key[0]) {<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x00:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x01:<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[0] = key[0];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nibl = key[1] &amp; 0xf;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nibh = (key[1] &gt;&gt; 4) &amp; 0xf;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[1] = (swap_table[nibl] &lt;&lt; 4) | swap_table[nibh];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nibl = key[2] &amp; 0xf;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
nibh = (key[2] &gt;&gt; 4) &amp; 0xf;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[2] = (swap_table[nibl] &lt;&lt; 4) | swap_table[nibh];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[3] = key[3];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[4] = key[4];<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*event = (swapped_keys[1] &lt;&lt; 8) + (swapped_keys[2]);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*state = REMOTE_KEY_PRESSED;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
deb_info(&quot;swapped_key: %x %x %x %x %x event:%d\n&quot;,swapped_keys[0],<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
swapped_keys[1],swapped_keys[2],swapped_keys[3],swapped_keys[4],
*event);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br>
&gt;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x02:<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*state = REMOTE_KEY_REPEAT;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
deb_info(&quot;KB: unkown type of remote status: %d\n&quot;,key[0]);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
Index: dvb-usb-remote.c<br>
===================================================================<br>
RCS file: /cvs/video4linux/v4l-dvb/linux/drivers/media/dvb/dvb-usb/dvb-usb-remote.c,v<br>
retrieving revision 1.11<br>
diff -r1.11 dvb-usb-remote.c<br>
106,107c106,107<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-&gt;rc_input_dev-&gt;keycodesize = sizeof(unsigned char);<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-&gt;rc_input_dev-&gt;keycodemax = KEY_MAX;<br>
---<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-&gt;rc_input_dev-&gt;keycodesize = sizeof(unsigned short);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-&gt;rc_input_dev-&gt;keycodemax = 0xffff; //KEY_MAX;<br>
113,114c113,117<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; d-&gt;props.rc_key_map_size; i++) {<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
deb_rc(&quot;setting bit for event %d item
%d\n&quot;,d-&gt;props.rc_key_map[i].event, i);<br>
---<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; d-&gt;props.rc_key_map_size; i++) {<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
deb_rc(&quot;setting bit for event %d item
%d\n&quot;,d-&gt;props.rc_key_map[i].event, i);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
set_bit(d-&gt;props.rc_key_map[i].event, d-&gt;rc_input_dev-&gt;keybit);<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 512; i++)<br>
116d118<br>
&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
<br>
</div>
-- <br>Keith Bannister