diff mbox

[2/3,media] winbond-cir: increase IR receiver resolution

Message ID 1351113762-5530-2-git-send-email-sean@mess.org (mailing list archive)
State New, archived
Headers show

Commit Message

Sean Young Oct. 24, 2012, 9:22 p.m. UTC
This is needed for carrier reporting.

Signed-off-by: Sean Young <sean@mess.org>
---
 drivers/media/rc/winbond-cir.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

Comments

David Härdeman Jan. 3, 2013, 12:16 a.m. UTC | #1
On Wed, Oct 24, 2012 at 10:22:41PM +0100, Sean Young wrote:
>This is needed for carrier reporting.
>
>Signed-off-by: Sean Young <sean@mess.org>
>---
> drivers/media/rc/winbond-cir.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)

Using a resolution of 2us rather than 10us means that the resolution
(and amount of work necessary for decoding a given signal) is about 25x
higher than in the windows driver (which uses a 50us resolution IIRC)...

Most of it is mitigated by using RLE (which I don't think the windows
driver uses....again...IIRC), but it still seems unnecessary for the
general case.

Wouldn't it be possible to only use the high-res mode when carrier
reports are actually enabled?

(Yes, I know this patch was sent a long time ago)


//David
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sean Young Jan. 5, 2013, 4:47 p.m. UTC | #2
On Thu, Jan 03, 2013 at 01:16:57AM +0100, David Härdeman wrote:
> On Wed, Oct 24, 2012 at 10:22:41PM +0100, Sean Young wrote:
> >This is needed for carrier reporting.
> >
> >Signed-off-by: Sean Young <sean@mess.org>
> >---
> > drivers/media/rc/winbond-cir.c | 14 +++++++++-----
> > 1 file changed, 9 insertions(+), 5 deletions(-)
> 
> Using a resolution of 2us rather than 10us means that the resolution
> (and amount of work necessary for decoding a given signal) is about 25x
> higher than in the windows driver (which uses a 50us resolution IIRC)...
> 
> Most of it is mitigated by using RLE (which I don't think the windows
> driver uses....again...IIRC), but it still seems unnecessary for the
> general case.

You're right, the hardware will generate more data for 2us rather than 
10us. For one key press on a nec remote, I get 69 interrupts before 
this patch and 302 after. That's almost 5 times as much, but not a 
ridiculous amount of work.

> Wouldn't it be possible to only use the high-res mode when carrier
> reports are actually enabled?

That is possible, although is it really worth the effort? I'll have a
look at implementing it and see what the code will look like.


Sean
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c
index 6f0f5ef..1ff47eb 100644
--- a/drivers/media/rc/winbond-cir.c
+++ b/drivers/media/rc/winbond-cir.c
@@ -358,7 +358,7 @@  wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device)
 		if (data->rxstate == WBCIR_RXSTATE_ERROR)
 			continue;
 		rawir.pulse = irdata & 0x80 ? false : true;
-		rawir.duration = US_TO_NS(((irdata & 0x7F) + 1) * 10);
+		rawir.duration = US_TO_NS(((irdata & 0x7F) + 1) * 2);
 		ir_raw_event_store_with_filter(data->dev, &rawir);
 	}
 
@@ -862,8 +862,8 @@  wbcir_init_hw(struct wbcir_data *data)
 	/* prescaler 1.0, tx/rx fifo lvl 16 */
 	outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2);
 
-	/* Set baud divisor to sample every 10 us */
-	outb(0x0F, data->sbase + WBCIR_REG_SP3_BGDL);
+	/* Set baud divisor to sample every 2 ns */
+	outb(0x03, data->sbase + WBCIR_REG_SP3_BGDL);
 	outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH);
 
 	/* Set CEIR mode */
@@ -872,9 +872,12 @@  wbcir_init_hw(struct wbcir_data *data)
 	inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */
 	inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */
 
-	/* Disable RX demod, enable run-length enc/dec, set freq span */
+	/*
+	 * Disable RX demod, enable run-length enc/dec, set freq span and
+	 * enable over-sampling
+	 */
 	wbcir_select_bank(data, WBCIR_BANK_7);
-	outb(0x90, data->sbase + WBCIR_REG_SP3_RCCFG);
+	outb(0xd0, data->sbase + WBCIR_REG_SP3_RCCFG);
 
 	/* Disable timer */
 	wbcir_select_bank(data, WBCIR_BANK_4);
@@ -1017,6 +1020,7 @@  wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
 	data->dev->priv = data;
 	data->dev->dev.parent = &device->dev;
 	data->dev->timeout = MS_TO_NS(100);
+	data->dev->rx_resolution = US_TO_NS(2);
 	data->dev->allowed_protos = RC_TYPE_ALL;
 
 	if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {