Re: [PATCH] media: rc: xbox_remote: add protocol and set timeout

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Mar 24, 2019 at 10:43:51AM +0100, Matthias Reichl wrote:
> 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 <hias@xxxxxxxxx>
> ---
> Bug report about sluggish response of the Xbox DVD remote and test
> results can be found in this thread:
> https://forum.libreelec.tv/thread/14861-the-adventures-of-libreelec-and-a-really-old-ir-remote/
> 
> We tried to capture some more protocol details with an mceusb receiver
> but this didn't work well - could be that the Xbox DVD remote uses a
> different carrier frequency and/or the IR receiver can't cope well with
> it's burst lengths.

Not sure what was happening there. When I try with my topseed mceusb device
it works. The remote repeats the IR signal every 64ms exactly, so I think
your patch is spot on.

Thanks

Sean

> 
> 
>  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 7a8b8ff4f076..ac768d769113 100644
> --- a/Documentation/media/lirc.h.rst.exceptions
> +++ b/Documentation/media/lirc.h.rst.exceptions
> @@ -63,6 +63,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 e8fa28e20192..be5fd129d728 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 5e684bb0d64c..367d983188f7 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



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux