101 lines
3.1 KiB
Diff
101 lines
3.1 KiB
Diff
|
From fd945928d6fd544d2f4bdde718b097b01bafb048 Mon Sep 17 00:00:00 2001
|
||
|
From: popcornmix <popcornmix@gmail.com>
|
||
|
Date: Tue, 22 Apr 2014 13:58:14 +0100
|
||
|
Subject: [PATCH 194/196] lirc_rpi: Use read_current_timer to determine
|
||
|
transmitter delay. Thanks to jjmz and others See:
|
||
|
https://github.com/raspberrypi/linux/issues/525
|
||
|
|
||
|
---
|
||
|
drivers/staging/media/lirc/lirc_rpi.c | 32 +++++++++++++++++---------------
|
||
|
1 file changed, 17 insertions(+), 15 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/staging/media/lirc/lirc_rpi.c b/drivers/staging/media/lirc/lirc_rpi.c
|
||
|
index 8aee83f..57ffacf 100644
|
||
|
--- a/drivers/staging/media/lirc/lirc_rpi.c
|
||
|
+++ b/drivers/staging/media/lirc/lirc_rpi.c
|
||
|
@@ -30,6 +30,7 @@
|
||
|
#include <linux/sched.h>
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/time.h>
|
||
|
+#include <linux/timex.h>
|
||
|
#include <linux/string.h>
|
||
|
#include <linux/delay.h>
|
||
|
#include <linux/platform_device.h>
|
||
|
@@ -41,7 +42,7 @@
|
||
|
|
||
|
#define LIRC_DRIVER_NAME "lirc_rpi"
|
||
|
#define RBUF_LEN 256
|
||
|
-#define LIRC_TRANSMITTER_LATENCY 256
|
||
|
+#define LIRC_TRANSMITTER_LATENCY 50
|
||
|
|
||
|
#ifndef MAX_UDELAY_MS
|
||
|
#define MAX_UDELAY_US 5000
|
||
|
@@ -107,19 +108,15 @@ static void safe_udelay(unsigned long usecs)
|
||
|
static int init_timing_params(unsigned int new_duty_cycle,
|
||
|
unsigned int new_freq)
|
||
|
{
|
||
|
- /*
|
||
|
- * period, pulse/space width are kept with 8 binary places -
|
||
|
- * IE multiplied by 256.
|
||
|
- */
|
||
|
- if (256 * 1000000L / new_freq * new_duty_cycle / 100 <=
|
||
|
+ if (1000 * 1000000L / new_freq * new_duty_cycle / 100 <=
|
||
|
LIRC_TRANSMITTER_LATENCY)
|
||
|
return -EINVAL;
|
||
|
- if (256 * 1000000L / new_freq * (100 - new_duty_cycle) / 100 <=
|
||
|
+ if (1000 * 1000000L / new_freq * (100 - new_duty_cycle) / 100 <=
|
||
|
LIRC_TRANSMITTER_LATENCY)
|
||
|
return -EINVAL;
|
||
|
duty_cycle = new_duty_cycle;
|
||
|
freq = new_freq;
|
||
|
- period = 256 * 1000000L / freq;
|
||
|
+ period = 1000 * 1000000L / freq;
|
||
|
pulse_width = period * duty_cycle / 100;
|
||
|
space_width = period - pulse_width;
|
||
|
dprintk("in init_timing_params, freq=%d pulse=%ld, "
|
||
|
@@ -130,11 +127,14 @@ static int init_timing_params(unsigned int new_duty_cycle,
|
||
|
static long send_pulse_softcarrier(unsigned long length)
|
||
|
{
|
||
|
int flag;
|
||
|
- unsigned long actual, target, d;
|
||
|
+ unsigned long actual, target;
|
||
|
+ unsigned long actual_us, initial_us, target_us;
|
||
|
|
||
|
- length <<= 8;
|
||
|
+ length *= 1000;
|
||
|
|
||
|
actual = 0; target = 0; flag = 0;
|
||
|
+ read_current_timer(&actual_us);
|
||
|
+
|
||
|
while (actual < length) {
|
||
|
if (flag) {
|
||
|
gpiochip->set(gpiochip, gpio_out_pin, invert);
|
||
|
@@ -143,17 +143,19 @@ static long send_pulse_softcarrier(unsigned long length)
|
||
|
gpiochip->set(gpiochip, gpio_out_pin, !invert);
|
||
|
target += pulse_width;
|
||
|
}
|
||
|
- d = (target - actual -
|
||
|
- LIRC_TRANSMITTER_LATENCY + 128) >> 8;
|
||
|
+ initial_us = actual_us;
|
||
|
+ target_us = actual_us + (target - actual) / 1000;
|
||
|
/*
|
||
|
* Note - we've checked in ioctl that the pulse/space
|
||
|
* widths are big enough so that d is > 0
|
||
|
*/
|
||
|
- udelay(d);
|
||
|
- actual += (d << 8) + LIRC_TRANSMITTER_LATENCY;
|
||
|
+ if ((int)(target_us - actual_us) > 0)
|
||
|
+ udelay(target_us - actual_us);
|
||
|
+ read_current_timer(&actual_us);
|
||
|
+ actual += (actual_us - initial_us) * 1000;
|
||
|
flag = !flag;
|
||
|
}
|
||
|
- return (actual-length) >> 8;
|
||
|
+ return (actual-length) / 1000;
|
||
|
}
|
||
|
|
||
|
static long send_pulse(unsigned long length)
|
||
|
--
|
||
|
1.9.1
|
||
|
|