From: Maxim L. <max...@gm...> - 2009-08-17 03:07:33
|
>From ebce809743028c0f50d73967e63bdc97dd1723b5 Mon Sep 17 00:00:00 2001 From: Maxim Levitsky <max...@gm...> Date: Mon, 17 Aug 2009 05:59:39 +0300 Subject: [PATCH] Few fixes to ENE0100 driver * Update for long gap handling, treats spaces correctly now * Remove ability to runtime set the sample period, won't work properly if device is opened, and dangerous due to missing checks * Check for corect sample period on module load * set sample period to 75 by default to make driver decode sync pulses correctly Signed-off-by: Maxim Levitsky <max...@gm...> --- drivers/lirc_ene0100/lirc_ene0100.c | 41 ++++++++++++++-------------------- drivers/lirc_ene0100/lirc_ene0100.h | 4 ++- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/drivers/lirc_ene0100/lirc_ene0100.c b/drivers/lirc_ene0100/lirc_ene0100.c index a41383f..d191bcb 100644 --- a/drivers/lirc_ene0100/lirc_ene0100.c +++ b/drivers/lirc_ene0100/lirc_ene0100.c @@ -31,7 +31,7 @@ #error "Sorry, this driver needs kernel version 2.6.29 or higher" #else -static int sample_period = 50; +static int sample_period = 75; static int enable_idle = 1; static void ene_set_idle(struct ene_device *dev, int idle); @@ -176,13 +176,14 @@ static void ene_set_idle(struct ene_device *dev, int idle) do_gettimeofday(&now); if (now.tv_sec - dev->gap_start.tv_sec > 16) - dev->sample = PULSE_MASK; + dev->sample = space(PULSE_MASK); else - dev->sample -= 1000000ull * (now.tv_sec - dev->gap_start.tv_sec) - + (now.tv_usec - dev->gap_start.tv_usec); + dev->sample = dev->sample + + space(1000000ull * (now.tv_sec - dev->gap_start.tv_sec)) + + space(now.tv_usec - dev->gap_start.tv_usec); - if (dev->sample > PULSE_MASK) - dev->sample = PULSE_MASK; + if (abs(dev->sample) > PULSE_MASK) + dev->sample = space(PULSE_MASK); send_sample(dev); } @@ -225,10 +226,10 @@ static irqreturn_t ene_hw_irq(int irq, void *data, struct pt_regs *regs) /* overflow sample recieved, handle it */ if (hw_value == ENE_SAMPLE_OVERFLOW) { - if (dev->idle) + if (dev->idle && !enable_idle) continue; - if (abs(dev->sample) <= ENE_MAXGAP) + if (dev->sample > 0 || abs(dev->sample) <= ENE_MAXGAP) update_sample(dev, hw_sample); else ene_set_idle(dev, 1); @@ -271,14 +272,6 @@ static int ene_probe(struct pnp_dev *pnp_dev, dev->pnp_dev = pnp_dev; pnp_set_drvdata(pnp_dev, dev); - error = -EINVAL; - if (sample_period < 5) { - - printk(KERN_ERR ENE_DRIVER_NAME ": sample period must be at " - "least 5 ms, (at least 30 recommended)\n"); - - goto err1; - } /* validate and read resources */ error = -ENODEV; @@ -291,7 +284,6 @@ static int ene_probe(struct pnp_dev *pnp_dev, if (pnp_resource_len(res) < ENE_MAX_IO) goto err2; - res = pnp_get_resource(pnp_dev, IORESOURCE_IRQ, 0); if (!pnp_resource_valid(res)) goto err2; @@ -392,7 +384,6 @@ static int ene_suspend(struct pnp_dev *pnp_dev, pm_message_t state) return 0; } - static int ene_resume(struct pnp_dev *pnp_dev) { struct ene_device *dev = pnp_get_drvdata(pnp_dev); @@ -405,7 +396,6 @@ static int ene_resume(struct pnp_dev *pnp_dev) #endif - static const struct pnp_device_id ene_ids[] = { { .id = "ENE0100", }, { }, @@ -425,9 +415,13 @@ static struct pnp_driver ene_driver = { #endif }; - static int __init ene_init(void) { + if (sample_period < 5) { + printk(KERN_ERR ENE_DRIVER_NAME ": sample period must be at " + "least 5 ms, (at least 30 recommended)\n"); + return -EINVAL; + } return pnp_register_driver(&ene_driver); } @@ -437,14 +431,13 @@ static void ene_exit(void) } -module_param(sample_period, int, S_IRUGO | S_IWUSR); +module_param(sample_period, int, S_IRUGO); MODULE_PARM_DESC(sample_period, "Hardware sample period (50 us default)"); - module_param(enable_idle, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(enable_idle, -"Allow hardware to signal when IR pulse starts, disable if your remote" -"doesn't send a sync pulse"); +"Disable active sampling while no signal is recieved, if set to false" +"might help in detecting input signal"); MODULE_DEVICE_TABLE(pnp, ene_ids); diff --git a/drivers/lirc_ene0100/lirc_ene0100.h b/drivers/lirc_ene0100/lirc_ene0100.h index b6b40d7..3a29e1e 100644 --- a/drivers/lirc_ene0100/lirc_ene0100.h +++ b/drivers/lirc_ene0100/lirc_ene0100.h @@ -75,12 +75,14 @@ #define ENE_DRIVER_NAME "enecir" -#define ENE_MAXGAP 150000 /* this is amount of +#define ENE_MAXGAP 250000 /* this is amount of time we wait before turning the sampler, chosen arbitry */ +#define space(len) (-(len)) /* add a space */ + struct ene_device { struct pnp_dev *pnp_dev; -- 1.6.0.4 |
From: <li...@ba...> - 2009-08-17 18:26:11
|
Hi! Maxim Levitsky "max...@gm..." wrote: >> From ebce809743028c0f50d73967e63bdc97dd1723b5 Mon Sep 17 00:00:00 2001 > From: Maxim Levitsky <max...@gm...> > Date: Mon, 17 Aug 2009 05:59:39 +0300 > Subject: [PATCH] Few fixes to ENE0100 driver This is in CVS now. I also made more changes, could you please check if everything is still working? Christoph |