From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Jarod Wilson <jarod@wilsonet.com>
Cc: Lawrence Rust <lawrence@softsystem.co.uk>,
Linux Media Mailing List <linux-media@vger.kernel.org>,
Greg KH <greg@kroah.com>
Subject: Re: [PATCH] Fix cx88 remote control input
Date: Wed, 04 May 2011 17:16:29 -0300 [thread overview]
Message-ID: <4DC1B41D.9090200@redhat.com> (raw)
In-Reply-To: <D7FAB30A-E204-47B9-A7A0-E3BF50EE7FBD@wilsonet.com>
Hi Lawerence,
Em 03-05-2011 14:19, Jarod Wilson escreveu:
> On May 3, 2011, at 3:25 AM, Lawrence Rust wrote:
>
>> On Mon, 2011-05-02 at 15:50 -0300, Mauro Carvalho Chehab wrote:
>>> Em 08-04-2011 09:50, Lawrence Rust escreveu:
>>>> This patch restores remote control input for cx2388x based boards on
>>>> Linux kernels >= 2.6.38.
>>>>
>>>> After upgrading from Linux 2.6.37 to 2.6.38 I found that the remote
>>>> control input of my Hauppauge Nova-S plus was no longer functioning.
>>>> I posted a question on this newsgroup and Mauro Carvalho Chehab gave
>>>> some helpful pointers as to the likely cause.
>>>>
>>>> Turns out that there are 2 problems:
>>>>
>>>> 1. In the IR interrupt handler of cx88-input.c there's a 32-bit multiply
>>>> overflow which causes IR pulse durations to be incorrectly calculated.
I'm adding the patch for it today on my linux-next tree. I'll probably send
upstream on the next couple days.
>>>>
>>>> 2. The RC5 decoder appends the system code to the scancode and passes
>>>> the combination to rc_keydown(). Unfortunately, the combined value is
>>>> then forwarded to input_event() which then fails to recognise a valid
>>>> scancode and hence no input events are generated.
In this case, a patch should be sent to -stable in separate.
Greg,
On 2.6.38, there are two RC5 keytables for Hauppauge devices, one with incomplete
scancodes (just 8 bits for each key) and the other one with 14 bits. One patch
changed the IR handling for cx88 to accept 14-bits for scancodes, but the change
didn't switch to the complete table.
For 2.6.39, all keytables for Hauppauge (4 different tables) were unified into
just one keytable. So, on 2.6.39-rc, the cx88 code already works fine for 64-bits
kernels, and the fix for 32-bits is undergoing.
In the case of 2.6.38 kernel, the Remote Controller is broken for both kernels.
The fix is as simple as:
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -283,7 +283,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
case CX88_BOARD_PCHDTV_HD3000:
case CX88_BOARD_PCHDTV_HD5500:
case CX88_BOARD_HAUPPAUGE_IRONLY:
- ir_codes = RC_MAP_HAUPPAUGE_NEW;
+ ir_codes = RC_MAP_RC5_HAUPPAUGE_NEW;
ir->sampling = 1;
break;
case CX88_BOARD_WINFAST_DTV2000H:
But this change diverges from upstream, due to the table unify. Would such patch
be acceptable for stable, even not having a corresponding upstream commit?
Thanks!
Mauro.
>>>>
>>>> I note that in commit 2997137be8eba5bf9c07a24d5fda1f4225f9ca7d, which
>>>> introduced these changes, David Härdeman changed the IR sample frequency
>>>> to a supposed 4kHz. However, the registers dealing with IR input are
>>>> undocumented in the cx2388x datasheets and there's no publicly available
>>>> information on them. I have to ask the question why this change was
>>>> made as it is of no apparent benefit and could have unanticipated
>>>> consequences. IMHO that change should also be reverted unless there is
>>>> evidence to substantiate it.
>>>>
>>>> Signed off by: Lawrence Rust <lvr at softsystem dot co dot uk>
>>>>
>>>> diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c
>>>> index ebdba55..c4052da 100644
>>>> --- a/drivers/media/rc/ir-rc5-decoder.c
>>>> +++ b/drivers/media/rc/ir-rc5-decoder.c
>>>> @@ -144,10 +144,15 @@ again:
>>>> system = (data->bits & 0x007C0) >> 6;
>>>> toggle = (data->bits & 0x00800) ? 1 : 0;
>>>> command += (data->bits & 0x01000) ? 0 : 0x40;
>>>> - scancode = system << 8 | command;
>>>> -
>>>> - IR_dprintk(1, "RC5 scancode 0x%04x (toggle: %u)\n",
>>>> - scancode, toggle);
>>>> + /* Notes
>>>> + * 1. Should filter unknown systems e.g Hauppauge use 0x1e or 0x1f
>>>> + * 2. Don't include system in the scancode otherwise input_event()
>>>> + * doesn't recognise the scancode
>>>> + */
>>>> + scancode = command;
>>>> +
>>>> + IR_dprintk(1, "RC5 scancode 0x%02x (system: 0x%02x toggle: %u)\n",
>>>> + scancode, system, toggle);
>>>> }
>>>>
>>>> rc_keydown(dev, scancode, toggle);
>>>
>>> I agree with Jarod: The above hunk shouldn't go upstream, or else it would break _lots_ of
>>> remotes.
>>>
>>>> diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
>>>> index c820e2f..7281db4 100644
>>>> --- a/drivers/media/video/cx88/cx88-input.c
>>>> +++ b/drivers/media/video/cx88/cx88-input.c
>>>> @@ -524,7 +524,7 @@ void cx88_ir_irq(struct cx88_core *core)
>>>> for (todo = 32; todo > 0; todo -= bits) {
>>>> ev.pulse = samples & 0x80000000 ? false : true;
>>>> bits = min(todo, 32U - fls(ev.pulse ? samples : ~samples));
>>>> - ev.duration = (bits * NSEC_PER_SEC) / (1000 * ir_samplerate);
>>>> + ev.duration = bits * (NSEC_PER_SEC / (1000 * ir_samplerate)); /* NB avoid 32-bit overflow */
>>>> ir_raw_event_store_with_filter(ir->dev, &ev);
>>>> samples <<= bits;
>>>> }
>>>
>>> This change is OK, though. Yet. due to precision issues, it is better to do a 64-bit
>>> multiplication and use do_div for the division. This is compatible with 32 bits and 64
>>> bits systems, and will reduce error noise at the duration.
>>>
>>> I've reworked that part of the patch, as follows.
>>
>> The following is a much simpler change that maintains precision and
>> avoids 64-bit arithmetic. Moving the division by 1000 and grouping it
>> with (NSEC_PER_SEC / 1000), an exact integer, avoids the 32-bit overflow
>> and allows the compiler to optimise the division without losing any
>> precision.
>>
>> diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
>> index 06f7d1d..67a2b08 100644
>> --- a/drivers/media/video/cx88/cx88-input.c
>> +++ b/drivers/media/video/cx88/cx88-input.c
>> @@ -523,7 +523,7 @@ void cx88_ir_irq(struct cx88_core *core)
>> for (todo = 32; todo > 0; todo -= bits) {
>> ev.pulse = samples & 0x80000000 ? false : true;
>> bits = min(todo, 32U - fls(ev.pulse ? samples : ~samples));
>> - ev.duration = (bits * NSEC_PER_SEC) / (1000 * ir_samplerate);
>> + ev.duration = (bits * (NSEC_PER_SEC / 1000)) / ir_samplerate;
>> ir_raw_event_store_with_filter(ir->dev, &ev);
>> samples <<= bits;
>> }
>
> ACK on this part for the devel tree.
>
>
>> And, FWIW the following patch fixes RC key input for Nova-S plus,
>> HVR1100, HVR3000 and HVR4000 in the 2.6.38 kernel. Apparently a
>> Hauppauge keymap with system ID code was added in this release but the
>> cx88 code was not updated when the RC5 decoder changes were made:
>>
>> diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
>> index 06f7d1d..67a2b08 100644
>> --- a/drivers/media/video/cx88/cx88-input.c
>> +++ b/drivers/media/video/cx88/cx88-input.c
>> @@ -283,7 +283,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
>> case CX88_BOARD_PCHDTV_HD3000:
>> case CX88_BOARD_PCHDTV_HD5500:
>> case CX88_BOARD_HAUPPAUGE_IRONLY:
>> - ir_codes = RC_MAP_HAUPPAUGE_NEW;
>> + ir_codes = RC_MAP_RC5_HAUPPAUGE_NEW;
>> ir->sampling = 1;
>> break;
>> case CX88_BOARD_WINFAST_DTV2000H:
>>
>> Signed off by: Lawrence Rust < lvr at softsystem dot co dot uk >
>
> ACK on this part for the 2.6.38.y stable tree.
>
>
next prev parent reply other threads:[~2011-05-04 20:16 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-08 12:50 [PATCH] Fix cx88 remote control input Lawrence Rust
2011-04-08 14:32 ` Jarod Wilson
2011-04-08 14:41 ` Jarod Wilson
2011-04-08 15:22 ` Lawrence Rust
2011-04-08 16:21 ` Jarod Wilson
2011-04-08 16:50 ` Lawrence Rust
2011-04-08 18:18 ` Jarod Wilson
2011-04-08 17:07 ` Devin Heitmueller
2011-04-08 18:00 ` Jarod Wilson
2011-04-08 18:38 ` Devin Heitmueller
2011-04-08 19:27 ` Jarod Wilson
2011-04-08 20:50 ` Andy Walls
2011-04-10 1:39 ` Jarod Wilson
2011-04-10 23:08 ` HVR-1250/CX23885 IR Rx (Re: [PATCH] Fix cx88 remote control input) Andy Walls
2011-06-28 0:38 ` HVR-1250/CX23885 IR Rx Jarod Wilson
2011-06-28 10:30 ` Andy Walls
2011-06-28 21:39 ` Jarod Wilson
2011-06-28 22:32 ` Andy Walls
2011-06-29 2:17 ` Jarod Wilson
2011-06-29 3:54 ` Andy Walls
2011-05-02 18:50 ` [PATCH] Fix cx88 remote control input Mauro Carvalho Chehab
2011-05-03 7:25 ` Lawrence Rust
2011-05-03 17:19 ` Jarod Wilson
2011-05-04 20:16 ` Mauro Carvalho Chehab [this message]
2011-05-04 20:36 ` Greg KH
2011-05-05 2:25 ` Mauro Carvalho Chehab
2011-05-05 20:35 ` Greg KH
2011-05-05 21:08 ` Patch "[media] cx88: Fix HVR4000 IR keymap" has been added to the 2.6.38-stable tree gregkh
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=4DC1B41D.9090200@redhat.com \
--to=mchehab@redhat.com \
--cc=greg@kroah.com \
--cc=jarod@wilsonet.com \
--cc=lawrence@softsystem.co.uk \
--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