diff --git a/packages/linux/patches/default/linux-904-improve-xbox-dvd-remote-performance.patch b/packages/linux/patches/default/linux-904-improve-xbox-dvd-remote-performance.patch new file mode 100644 index 0000000000..5ec182064e --- /dev/null +++ b/packages/linux/patches/default/linux-904-improve-xbox-dvd-remote-performance.patch @@ -0,0 +1,158 @@ +From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001 +From: Matthias Reichl +Date: Fri, 22 Mar 2019 12:26:17 +0100 +Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout + +The timestamps in ir-keytable -t output showed that the Xbox DVD +IR dongle decodes scancodes every 64ms. The last scancode of a +longer button press is decodes 64ms after the last-but-one which +indicates the decoder doesn't use a timeout but decodes on the last +edge of the signal. + +267.042629: lirc protocol(unknown): scancode = 0xace +267.042665: event type EV_MSC(0x04): scancode = 0xace +267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002) +267.042665: event type EV_SYN(0x00). +267.106625: lirc protocol(unknown): scancode = 0xace +267.106643: event type EV_MSC(0x04): scancode = 0xace +267.106643: event type EV_SYN(0x00). +267.170623: lirc protocol(unknown): scancode = 0xace +267.170638: event type EV_MSC(0x04): scancode = 0xace +267.170638: event type EV_SYN(0x00). +267.234621: lirc protocol(unknown): scancode = 0xace +267.234636: event type EV_MSC(0x04): scancode = 0xace +267.234636: event type EV_SYN(0x00). +267.298623: lirc protocol(unknown): scancode = 0xace +267.298638: event type EV_MSC(0x04): scancode = 0xace +267.298638: event type EV_SYN(0x00). +267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002) +267.543345: event type EV_SYN(0x00). +267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002) +267.570015: event type EV_SYN(0x00). + +Add a protocol with the repeat value and set the timeout in the +driver to 10ms (to have a bit of headroom for delays) so the Xbox +DVD remote performs more responsive. + +Signed-off-by: Matthias Reichl +--- + Documentation/media/lirc.h.rst.exceptions | 1 + + drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +- + drivers/media/rc/rc-main.c | 2 ++ + drivers/media/rc/xbox_remote.c | 4 +++- + include/media/rc-map.h | 4 +++- + include/uapi/linux/lirc.h | 2 ++ + 6 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions +index e7a41d4b3d46..f8b5f1a32b7d 100644 +--- a/Documentation/media/lirc.h.rst.exceptions ++++ b/Documentation/media/lirc.h.rst.exceptions +@@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON + ignore symbol RC_PROTO_RCMM12 + ignore symbol RC_PROTO_RCMM24 + ignore symbol RC_PROTO_RCMM32 ++ignore symbol RC_PROTO_XBOX_DVD + + # Undocumented macros + +diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c +index af387244636b..42815ab57bff 100644 +--- a/drivers/media/rc/keymaps/rc-xbox-dvd.c ++++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c +@@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = { + .map = { + .scan = xbox_dvd, + .size = ARRAY_SIZE(xbox_dvd), +- .rc_proto = RC_PROTO_UNKNOWN, ++ .rc_proto = RC_PROTO_XBOX_DVD, + .name = RC_MAP_XBOX_DVD, + } + }; +diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c +index 78e79c37f208..7f1d5b226f68 100644 +--- a/drivers/media/rc/rc-main.c ++++ b/drivers/media/rc/rc-main.c +@@ -76,6 +76,7 @@ static const struct { + .scancode_bits = 0x00ffffff, .repeat_period = 114 }, + [RC_PROTO_RCMM32] = { .name = "rc-mm-32", + .scancode_bits = 0xffffffff, .repeat_period = 114 }, ++ [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 }, + }; + + /* Used to keep track of known keymaps */ +@@ -1027,6 +1028,7 @@ static const struct { + { RC_PROTO_BIT_RCMM12 | + RC_PROTO_BIT_RCMM24 | + RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" }, ++ { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL }, + }; + + /** +diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c +index f959cbb94744..79470c09989e 100644 +--- a/drivers/media/rc/xbox_remote.c ++++ b/drivers/media/rc/xbox_remote.c +@@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) + struct rc_dev *rdev = xbox_remote->rdev; + + rdev->priv = xbox_remote; +- rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN; ++ rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD; + rdev->driver_name = "xbox_remote"; + + rdev->open = xbox_remote_rc_open; +@@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) + rdev->device_name = xbox_remote->rc_name; + rdev->input_phys = xbox_remote->rc_phys; + ++ rdev->timeout = MS_TO_NS(10); ++ + usb_to_input_id(xbox_remote->udev, &rdev->input_id); + rdev->dev.parent = &xbox_remote->interface->dev; + } +diff --git a/include/media/rc-map.h b/include/media/rc-map.h +index e5e86d595645..a0000f392362 100644 +--- a/include/media/rc-map.h ++++ b/include/media/rc-map.h +@@ -40,6 +40,7 @@ + #define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12) + #define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24) + #define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32) ++#define RC_PROTO_BIT_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD) + + #define RC_PROTO_BIT_ALL \ + (RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \ +@@ -55,7 +56,8 @@ + RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ + RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \ + RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \ +- RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32) ++ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \ ++ RC_PROTO_BIT_XBOX_DVD) + /* All rc protocols for which we have decoders */ + #define RC_PROTO_BIT_ALL_IR_DECODER \ + (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ +diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h +index 45fcbf99d72e..f99d9dcae667 100644 +--- a/include/uapi/linux/lirc.h ++++ b/include/uapi/linux/lirc.h +@@ -195,6 +195,7 @@ struct lirc_scancode { + * @RC_PROTO_RCMM12: RC-MM protocol 12 bits + * @RC_PROTO_RCMM24: RC-MM protocol 24 bits + * @RC_PROTO_RCMM32: RC-MM protocol 32 bits ++ * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol + */ + enum rc_proto { + RC_PROTO_UNKNOWN = 0, +@@ -224,6 +225,7 @@ enum rc_proto { + RC_PROTO_RCMM12 = 24, + RC_PROTO_RCMM24 = 25, + RC_PROTO_RCMM32 = 26, ++ RC_PROTO_XBOX_DVD = 27, + }; + + #endif +-- +2.20.1 + diff --git a/packages/linux/patches/raspberrypi/linux-904-improve-xbox-dvd-remote-performance.patch b/packages/linux/patches/raspberrypi/linux-904-improve-xbox-dvd-remote-performance.patch new file mode 100644 index 0000000000..5ec182064e --- /dev/null +++ b/packages/linux/patches/raspberrypi/linux-904-improve-xbox-dvd-remote-performance.patch @@ -0,0 +1,158 @@ +From 55096db50d8cdbf777c67f672b493ef565a12c38 Mon Sep 17 00:00:00 2001 +From: Matthias Reichl +Date: Fri, 22 Mar 2019 12:26:17 +0100 +Subject: [PATCH] media: rc: xbox_remote: add protocol and set timeout + +The timestamps in ir-keytable -t output showed that the Xbox DVD +IR dongle decodes scancodes every 64ms. The last scancode of a +longer button press is decodes 64ms after the last-but-one which +indicates the decoder doesn't use a timeout but decodes on the last +edge of the signal. + +267.042629: lirc protocol(unknown): scancode = 0xace +267.042665: event type EV_MSC(0x04): scancode = 0xace +267.042665: event type EV_KEY(0x01) key_down: KEY_1(0x0002) +267.042665: event type EV_SYN(0x00). +267.106625: lirc protocol(unknown): scancode = 0xace +267.106643: event type EV_MSC(0x04): scancode = 0xace +267.106643: event type EV_SYN(0x00). +267.170623: lirc protocol(unknown): scancode = 0xace +267.170638: event type EV_MSC(0x04): scancode = 0xace +267.170638: event type EV_SYN(0x00). +267.234621: lirc protocol(unknown): scancode = 0xace +267.234636: event type EV_MSC(0x04): scancode = 0xace +267.234636: event type EV_SYN(0x00). +267.298623: lirc protocol(unknown): scancode = 0xace +267.298638: event type EV_MSC(0x04): scancode = 0xace +267.298638: event type EV_SYN(0x00). +267.543345: event type EV_KEY(0x01) key_down: KEY_1(0x0002) +267.543345: event type EV_SYN(0x00). +267.570015: event type EV_KEY(0x01) key_up: KEY_1(0x0002) +267.570015: event type EV_SYN(0x00). + +Add a protocol with the repeat value and set the timeout in the +driver to 10ms (to have a bit of headroom for delays) so the Xbox +DVD remote performs more responsive. + +Signed-off-by: Matthias Reichl +--- + Documentation/media/lirc.h.rst.exceptions | 1 + + drivers/media/rc/keymaps/rc-xbox-dvd.c | 2 +- + drivers/media/rc/rc-main.c | 2 ++ + drivers/media/rc/xbox_remote.c | 4 +++- + include/media/rc-map.h | 4 +++- + include/uapi/linux/lirc.h | 2 ++ + 6 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions +index e7a41d4b3d46..f8b5f1a32b7d 100644 +--- a/Documentation/media/lirc.h.rst.exceptions ++++ b/Documentation/media/lirc.h.rst.exceptions +@@ -61,6 +61,7 @@ ignore symbol RC_PROTO_IMON + ignore symbol RC_PROTO_RCMM12 + ignore symbol RC_PROTO_RCMM24 + ignore symbol RC_PROTO_RCMM32 ++ignore symbol RC_PROTO_XBOX_DVD + + # Undocumented macros + +diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c +index af387244636b..42815ab57bff 100644 +--- a/drivers/media/rc/keymaps/rc-xbox-dvd.c ++++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c +@@ -42,7 +42,7 @@ static struct rc_map_list xbox_dvd_map = { + .map = { + .scan = xbox_dvd, + .size = ARRAY_SIZE(xbox_dvd), +- .rc_proto = RC_PROTO_UNKNOWN, ++ .rc_proto = RC_PROTO_XBOX_DVD, + .name = RC_MAP_XBOX_DVD, + } + }; +diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c +index 78e79c37f208..7f1d5b226f68 100644 +--- a/drivers/media/rc/rc-main.c ++++ b/drivers/media/rc/rc-main.c +@@ -76,6 +76,7 @@ static const struct { + .scancode_bits = 0x00ffffff, .repeat_period = 114 }, + [RC_PROTO_RCMM32] = { .name = "rc-mm-32", + .scancode_bits = 0xffffffff, .repeat_period = 114 }, ++ [RC_PROTO_XBOX_DVD] = { .name = "xbox-dvd", .repeat_period = 64 }, + }; + + /* Used to keep track of known keymaps */ +@@ -1027,6 +1028,7 @@ static const struct { + { RC_PROTO_BIT_RCMM12 | + RC_PROTO_BIT_RCMM24 | + RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" }, ++ { RC_PROTO_BIT_XBOX_DVD, "xbox-dvd", NULL }, + }; + + /** +diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c +index f959cbb94744..79470c09989e 100644 +--- a/drivers/media/rc/xbox_remote.c ++++ b/drivers/media/rc/xbox_remote.c +@@ -148,7 +148,7 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) + struct rc_dev *rdev = xbox_remote->rdev; + + rdev->priv = xbox_remote; +- rdev->allowed_protocols = RC_PROTO_BIT_UNKNOWN; ++ rdev->allowed_protocols = RC_PROTO_BIT_XBOX_DVD; + rdev->driver_name = "xbox_remote"; + + rdev->open = xbox_remote_rc_open; +@@ -157,6 +157,8 @@ static void xbox_remote_rc_init(struct xbox_remote *xbox_remote) + rdev->device_name = xbox_remote->rc_name; + rdev->input_phys = xbox_remote->rc_phys; + ++ rdev->timeout = MS_TO_NS(10); ++ + usb_to_input_id(xbox_remote->udev, &rdev->input_id); + rdev->dev.parent = &xbox_remote->interface->dev; + } +diff --git a/include/media/rc-map.h b/include/media/rc-map.h +index e5e86d595645..a0000f392362 100644 +--- a/include/media/rc-map.h ++++ b/include/media/rc-map.h +@@ -40,6 +40,7 @@ + #define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12) + #define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24) + #define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32) ++#define RC_PROTO_BIT_XBOX_DVD BIT_ULL(RC_PROTO_XBOX_DVD) + + #define RC_PROTO_BIT_ALL \ + (RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \ +@@ -55,7 +56,8 @@ + RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ + RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \ + RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \ +- RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32) ++ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32 | \ ++ RC_PROTO_BIT_XBOX_DVD) + /* All rc protocols for which we have decoders */ + #define RC_PROTO_BIT_ALL_IR_DECODER \ + (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ +diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h +index 45fcbf99d72e..f99d9dcae667 100644 +--- a/include/uapi/linux/lirc.h ++++ b/include/uapi/linux/lirc.h +@@ -195,6 +195,7 @@ struct lirc_scancode { + * @RC_PROTO_RCMM12: RC-MM protocol 12 bits + * @RC_PROTO_RCMM24: RC-MM protocol 24 bits + * @RC_PROTO_RCMM32: RC-MM protocol 32 bits ++ * @RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol + */ + enum rc_proto { + RC_PROTO_UNKNOWN = 0, +@@ -224,6 +225,7 @@ enum rc_proto { + RC_PROTO_RCMM12 = 24, + RC_PROTO_RCMM24 = 25, + RC_PROTO_RCMM32 = 26, ++ RC_PROTO_XBOX_DVD = 27, + }; + + #endif +-- +2.20.1 +