mirror of https://github.com/OpenIPC/firmware.git
119 lines
3.4 KiB
Diff
119 lines
3.4 KiB
Diff
diff -drupN a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
|
|
--- a/drivers/media/rc/rc-main.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/drivers/media/rc/rc-main.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -30,12 +30,13 @@
|
|
#define RC_DEV_MAX 256
|
|
|
|
/* FIXME: IR_KEYPRESS_TIMEOUT should be protocol specific */
|
|
-#define IR_KEYPRESS_TIMEOUT 250
|
|
+#define IR_KEYPRESS_TIMEOUT 160
|
|
|
|
/* Used to keep track of known keymaps */
|
|
static LIST_HEAD(rc_map_list);
|
|
static DEFINE_SPINLOCK(rc_map_lock);
|
|
static struct led_trigger *led_feedback;
|
|
+static int key_repeat;
|
|
|
|
/* Used to keep track of rc devices */
|
|
static DEFINE_IDA(rc_ida);
|
|
@@ -199,7 +200,7 @@ static int ir_resize_table(struct rc_map
|
|
|
|
newscan = kmalloc(newalloc, gfp_flags);
|
|
if (!newscan) {
|
|
- IR_dprintk(1, "Failed to kmalloc %u bytes\n", newalloc);
|
|
+ IR_dprintk(0, "Failed to kmalloc %u bytes\n", newalloc);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -547,12 +548,20 @@ static void ir_do_keyup(struct rc_dev *d
|
|
if (!dev->keypressed)
|
|
return;
|
|
|
|
- IR_dprintk(1, "keyup key 0x%04x\n", dev->last_keycode);
|
|
+ IR_dprintk(2, "keyup key 0x%04x, dev->last_scancode is 0x%04x\n",\
|
|
+ dev->last_keycode, dev->last_scancode);
|
|
+/*sunxi_multi ir only care scancode, not really keycode*/
|
|
+#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT
|
|
+ input_event(dev->input_dev, EV_MSC, MSC_SCAN, (dev->last_scancode & (~(0x1 << 24))));
|
|
+#else
|
|
input_report_key(dev->input_dev, dev->last_keycode, 0);
|
|
+#endif
|
|
led_trigger_event(led_feedback, LED_OFF);
|
|
if (sync)
|
|
input_sync(dev->input_dev);
|
|
+
|
|
dev->keypressed = false;
|
|
+ key_repeat = 0;
|
|
}
|
|
|
|
/**
|
|
@@ -610,18 +619,22 @@ static void ir_timer_keyup(unsigned long
|
|
*/
|
|
void rc_repeat(struct rc_dev *dev)
|
|
{
|
|
- unsigned long flags;
|
|
+ unsigned long flags __attribute__((unused));
|
|
|
|
spin_lock_irqsave(&dev->keylock, flags);
|
|
-
|
|
+#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT
|
|
+ if (!dev->keypressed)
|
|
+ goto out;
|
|
+ key_repeat = 1;
|
|
+#else
|
|
input_event(dev->input_dev, EV_MSC, MSC_SCAN, dev->last_scancode);
|
|
input_sync(dev->input_dev);
|
|
-
|
|
if (!dev->keypressed)
|
|
goto out;
|
|
|
|
dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
|
|
mod_timer(&dev->timer_keyup, dev->keyup_jiffies);
|
|
+#endif
|
|
|
|
out:
|
|
spin_unlock_irqrestore(&dev->keylock, flags);
|
|
@@ -644,11 +657,32 @@ static void ir_do_keydown(struct rc_dev
|
|
{
|
|
bool new_event = (!dev->keypressed ||
|
|
dev->last_protocol != protocol ||
|
|
- dev->last_scancode != scancode ||
|
|
+ ((dev->last_scancode & 0xffffffUL) != (scancode & 0xffffffUL)) ||
|
|
+ !key_repeat ||
|
|
dev->last_toggle != toggle);
|
|
|
|
if (new_event && dev->keypressed)
|
|
ir_do_keyup(dev, false);
|
|
+#ifdef CONFIG_SUNXI_MULTI_IR_SUPPORT
|
|
+ if (new_event) {
|
|
+ /* Register a keypress */
|
|
+ dev->keypressed = true;
|
|
+ key_repeat = 0;
|
|
+ dev->last_protocol = protocol;
|
|
+ dev->last_scancode = scancode;
|
|
+ dev->last_toggle = toggle;
|
|
+ dev->last_keycode = keycode;
|
|
+ input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode | (0x01 << 24));
|
|
+
|
|
+ IR_dprintk(1, "%s: key down event, "
|
|
+ "key 0x%04x, protocol 0x%04x, scancode 0x%08x\n",
|
|
+ dev->input_name, keycode, protocol, scancode);
|
|
+
|
|
+ led_trigger_event(led_feedback, LED_FULL);
|
|
+ } else {
|
|
+ IR_dprintk(1, "scode :0x%4x , repeat :0x%4x\n", dev->last_scancode, key_repeat);
|
|
+ }
|
|
+#else
|
|
|
|
input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
|
|
|
|
@@ -667,7 +701,7 @@ static void ir_do_keydown(struct rc_dev
|
|
|
|
led_trigger_event(led_feedback, LED_FULL);
|
|
}
|
|
-
|
|
+#endif
|
|
input_sync(dev->input_dev);
|
|
}
|
|
|