Re: [PATCH 08/10] rc-core: merge rc5 and streamzap decoders

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

 



Em 28-04-2011 12:13, David HÃrdeman escreveu:
> Now that the protocol is part of the scancode, it is pretty easy to merge
> the rc5 and streamzap decoders. An additional advantage is that the decoder
> is now stricter as it waits for the trailing silence before determining that
> a command is a valid rc5/streamzap command (which avoids collisions that I've
> seen with e.g. Sony protocols).

Makes sense for me.

(FYI, I probably won't be applying any patch after patch 6, due to dependency issues).

> 
> Signed-off-by: David HÃrdeman <david@xxxxxxxxxxx>
> ---
>  drivers/media/rc/Kconfig                |   12 --
>  drivers/media/rc/Makefile               |    1 
>  drivers/media/rc/ir-rc5-decoder.c       |   51 ++++++----
>  drivers/media/rc/ir-rc5-sz-decoder.c    |  153 -------------------------------
>  drivers/media/rc/keymaps/rc-streamzap.c |    4 -
>  drivers/media/rc/rc-core-priv.h         |    8 --
>  drivers/media/rc/streamzap.c            |   10 --
>  7 files changed, 31 insertions(+), 208 deletions(-)
>  delete mode 100644 drivers/media/rc/ir-rc5-sz-decoder.c
> 
> diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
> index 7f03142..7242b0d 100644
> --- a/drivers/media/rc/Kconfig
> +++ b/drivers/media/rc/Kconfig
> @@ -75,18 +75,6 @@ config IR_SONY_DECODER
>  	   Enable this option if you have an infrared remote control which
>  	   uses the Sony protocol, and you need software decoding support.
>  
> -config IR_RC5_SZ_DECODER
> -	tristate "Enable IR raw decoder for the RC-5 (streamzap) protocol"
> -	depends on RC_CORE
> -	select BITREVERSE
> -	default y
> -
> -	---help---
> -	   Enable this option if you have IR with RC-5 (streamzap) protocol,
> -	   and if the IR is decoded in software. (The Streamzap PC Remote
> -	   uses an IR protocol that is almost standard RC-5, but not quite,
> -	   as it uses an additional bit).
> -
>  config IR_LIRC_CODEC
>  	tristate "Enable IR to LIRC bridge"
>  	depends on RC_CORE
> diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile
> index c6cfe70..2d9ddde 100644
> --- a/drivers/media/rc/Makefile
> +++ b/drivers/media/rc/Makefile
> @@ -9,7 +9,6 @@ obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o
>  obj-$(CONFIG_IR_RC6_DECODER) += ir-rc6-decoder.o
>  obj-$(CONFIG_IR_JVC_DECODER) += ir-jvc-decoder.o
>  obj-$(CONFIG_IR_SONY_DECODER) += ir-sony-decoder.o
> -obj-$(CONFIG_IR_RC5_SZ_DECODER) += ir-rc5-sz-decoder.o
>  obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
>  
>  # stand-alone IR receivers/transmitters
> diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c
> index ed726ca..159e57f 100644
> --- a/drivers/media/rc/ir-rc5-decoder.c
> +++ b/drivers/media/rc/ir-rc5-decoder.c
> @@ -1,6 +1,7 @@
> -/* ir-rc5-decoder.c - handle RC5(x) IR Pulse/Space protocol
> +/* ir-rc5-decoder.c - decoder for RC5(x) and StreamZap protocols
>   *
>   * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
> + * Copyright (C) 2010 by Jarod Wilson <jarod@xxxxxxxxxx>
>   *
>   * This program is free software; you can redistribute it and/or modify
>   *  it under the terms of the GNU General Public License as published by
> @@ -13,22 +14,21 @@
>   */
>  
>  /*
> - * This code handles 14 bits RC5 protocols and 20 bits RC5x protocols.
> - * There are other variants that use a different number of bits.
> - * This is currently unsupported.
> - * It considers a carrier of 36 kHz, with a total of 14/20 bits, where
> - * the first two bits are start bits, and a third one is a filing bit
> + * This decoder handles the 14 bit RC5 protocol, 15 bit "StreamZap" protocol
> + * and 20 bit RC5x protocol.
>   */
>  
>  #include "rc-core-priv.h"
>  
>  #define RC5_NBITS		14
> +#define RC5_SZ_NBITS		15
>  #define RC5X_NBITS		20
>  #define CHECK_RC5X_NBITS	8
>  #define RC5_UNIT		888888 /* ns */
>  #define RC5_BIT_START		(1 * RC5_UNIT)
>  #define RC5_BIT_END		(1 * RC5_UNIT)
>  #define RC5X_SPACE		(4 * RC5_UNIT)
> +#define RC5_TRAILER		(10 * RC5_UNIT) /* In reality, approx 100 */
>  
>  enum rc5_state {
>  	STATE_INACTIVE,
> @@ -79,12 +79,15 @@ again:
>  
>  		data->state = STATE_BIT_START;
>  		data->count = 1;
> -		/* We just need enough bits to get to STATE_CHECK_RC5X */
> -		data->wanted_bits = RC5X_NBITS;
>  		decrease_duration(&ev, RC5_BIT_START);
>  		goto again;
>  
>  	case STATE_BIT_START:
> +		if (!ev.pulse && geq_margin(ev.duration, RC5_TRAILER, RC5_UNIT / 2)) {
> +			data->state = STATE_FINISHED;
> +			goto again;
> +		}
> +
>  		if (!eq_margin(ev.duration, RC5_BIT_START, RC5_UNIT / 2))
>  			break;
>  
> @@ -99,9 +102,7 @@ again:
>  		if (!is_transition(&ev, &dev->raw->prev_ev))
>  			break;
>  
> -		if (data->count == data->wanted_bits)
> -			data->state = STATE_FINISHED;
> -		else if (data->count == CHECK_RC5X_NBITS)
> +		if (data->count == CHECK_RC5X_NBITS)
>  			data->state = STATE_CHECK_RC5X;
>  		else
>  			data->state = STATE_BIT_START;
> @@ -111,13 +112,10 @@ again:
>  
>  	case STATE_CHECK_RC5X:
>  		if (!ev.pulse && geq_margin(ev.duration, RC5X_SPACE, RC5_UNIT / 2)) {
> -			/* RC5X */
> -			data->wanted_bits = RC5X_NBITS;
> +			data->is_rc5x = true;
>  			decrease_duration(&ev, RC5X_SPACE);
> -		} else {
> -			/* RC5 */
> -			data->wanted_bits = RC5_NBITS;
> -		}
> +		} else
> +			data->is_rc5x = false;
>  		data->state = STATE_BIT_START;
>  		goto again;
>  
> @@ -125,7 +123,7 @@ again:
>  		if (ev.pulse)
>  			break;
>  
> -		if (data->wanted_bits == RC5X_NBITS) {
> +		if (data->is_rc5x && data->count == RC5X_NBITS) {
>  			/* RC5X */
>  			u8 xdata, command, system;
>  			xdata    = (data->bits & 0x0003F) >> 0;
> @@ -135,7 +133,7 @@ again:
>  			command += (data->bits & 0x01000) ? 0 : 0x40;
>  			scancode = system << 16 | command << 8 | xdata;
>  			protocol = RC_TYPE_RC5X;
> -		} else {
> +		} else if (!data->is_rc5x && data->count == RC5_NBITS) {
>  			/* RC5 */
>  			u8 command, system;
>  			command  = (data->bits & 0x0003F) >> 0;
> @@ -144,10 +142,19 @@ again:
>  			command += (data->bits & 0x01000) ? 0 : 0x40;
>  			scancode = system << 8 | command;
>  			protocol = RC_TYPE_RC5;
> -		}
> +		} else if (!data->is_rc5x && data->count == RC5_SZ_NBITS) {
> +			/* RC5 StreamZap */
> +			u8 command, system;
> +			command  = (data->bits & 0x0003F) >> 0;
> +			system   = (data->bits & 0x02FC0) >> 6;
> +			toggle   = (data->bits & 0x01000) ? 1 : 0;
> +			scancode = system << 6 | command;
> +			protocol = RC_TYPE_RC5_SZ;
> +		} else
> +			break;
>  
>  		if (dev->enabled_protocols & (1 << protocol)) {
> -			IR_dprintk(1, "RC5(x) scancode 0x%06x (toggle: %u)\n",
> +			IR_dprintk(1, "RC5(x/sz) scancode 0x%06x (toggle: %u)\n",
>  				   scancode, toggle);
>  			rc_keydown(dev, protocol, scancode, toggle);
>  		}
> @@ -164,7 +171,7 @@ out:
>  }
>  
>  static struct ir_raw_handler rc5_handler = {
> -	.protocols	= RC_BIT_RC5 | RC_BIT_RC5X,
> +	.protocols	= RC_BIT_RC5 | RC_BIT_RC5X | RC_BIT_RC5_SZ,
>  	.decode		= ir_rc5_decode,
>  };
>  
> diff --git a/drivers/media/rc/ir-rc5-sz-decoder.c b/drivers/media/rc/ir-rc5-sz-decoder.c
> deleted file mode 100644
> index 7e9e9c5..0000000
> --- a/drivers/media/rc/ir-rc5-sz-decoder.c
> +++ /dev/null
> @@ -1,153 +0,0 @@
> -/* ir-rc5-sz-decoder.c - handle RC5 Streamzap IR Pulse/Space protocol
> - *
> - * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
> - * Copyright (C) 2010 by Jarod Wilson <jarod@xxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - *  it under the terms of the GNU General Public License as published by
> - *  the Free Software Foundation version 2 of the License.
> - *
> - *  This program is distributed in the hope that it will be useful,
> - *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - *  GNU General Public License for more details.
> - */
> -
> -/*
> - * This code handles the 15 bit RC5-ish protocol used by the Streamzap
> - * PC Remote.
> - * It considers a carrier of 36 kHz, with a total of 15 bits, where
> - * the first two bits are start bits, and a third one is a filing bit
> - */
> -
> -#include "rc-core-priv.h"
> -
> -#define RC5_SZ_NBITS		15
> -#define RC5_UNIT		888888 /* ns */
> -#define RC5_BIT_START		(1 * RC5_UNIT)
> -#define RC5_BIT_END		(1 * RC5_UNIT)
> -
> -enum rc5_sz_state {
> -	STATE_INACTIVE,
> -	STATE_BIT_START,
> -	STATE_BIT_END,
> -	STATE_FINISHED,
> -};
> -
> -/**
> - * ir_rc5_sz_decode() - Decode one RC-5 Streamzap pulse or space
> - * @dev:	the struct rc_dev descriptor of the device
> - * @ev:		the struct ir_raw_event descriptor of the pulse/space
> - *
> - * This function returns -EINVAL if the pulse violates the state machine
> - */
> -static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev)
> -{
> -	struct rc5_sz_dec *data = &dev->raw->rc5_sz;
> -	u8 toggle, command, system;
> -	u32 scancode;
> -
> -        if (!(dev->enabled_protocols & RC_BIT_RC5_SZ))
> -                return 0;
> -
> -	if (!is_timing_event(ev)) {
> -		if (ev.reset)
> -			data->state = STATE_INACTIVE;
> -		return 0;
> -	}
> -
> -	if (!geq_margin(ev.duration, RC5_UNIT, RC5_UNIT / 2))
> -		goto out;
> -
> -again:
> -	IR_dprintk(2, "RC5-sz decode started at state %i (%uus %s)\n",
> -		   data->state, TO_US(ev.duration), TO_STR(ev.pulse));
> -
> -	if (!geq_margin(ev.duration, RC5_UNIT, RC5_UNIT / 2))
> -		return 0;
> -
> -	switch (data->state) {
> -
> -	case STATE_INACTIVE:
> -		if (!ev.pulse)
> -			break;
> -
> -		data->state = STATE_BIT_START;
> -		data->count = 1;
> -		data->wanted_bits = RC5_SZ_NBITS;
> -		decrease_duration(&ev, RC5_BIT_START);
> -		goto again;
> -
> -	case STATE_BIT_START:
> -		if (!eq_margin(ev.duration, RC5_BIT_START, RC5_UNIT / 2))
> -			break;
> -
> -		data->bits <<= 1;
> -		if (!ev.pulse)
> -			data->bits |= 1;
> -		data->count++;
> -		data->state = STATE_BIT_END;
> -		return 0;
> -
> -	case STATE_BIT_END:
> -		if (!is_transition(&ev, &dev->raw->prev_ev))
> -			break;
> -
> -		if (data->count == data->wanted_bits)
> -			data->state = STATE_FINISHED;
> -		else
> -			data->state = STATE_BIT_START;
> -
> -		decrease_duration(&ev, RC5_BIT_END);
> -		goto again;
> -
> -	case STATE_FINISHED:
> -		if (ev.pulse)
> -			break;
> -
> -		/* RC5-sz */
> -		command  = (data->bits & 0x0003F) >> 0;
> -		system   = (data->bits & 0x02FC0) >> 6;
> -		toggle   = (data->bits & 0x01000) ? 1 : 0;
> -		scancode = system << 6 | command;
> -
> -		IR_dprintk(1, "RC5-sz scancode 0x%04x (toggle: %u)\n",
> -			   scancode, toggle);
> -
> -		rc_keydown(dev, RC_TYPE_RC5_SZ, scancode, toggle);
> -		data->state = STATE_INACTIVE;
> -		return 0;
> -	}
> -
> -out:
> -	IR_dprintk(1, "RC5-sz decode failed at state %i (%uus %s)\n",
> -		   data->state, TO_US(ev.duration), TO_STR(ev.pulse));
> -	data->state = STATE_INACTIVE;
> -	return -EINVAL;
> -}
> -
> -static struct ir_raw_handler rc5_sz_handler = {
> -	.protocols	= RC_BIT_RC5_SZ,
> -	.decode		= ir_rc5_sz_decode,
> -};
> -
> -static int __init ir_rc5_sz_decode_init(void)
> -{
> -	ir_raw_handler_register(&rc5_sz_handler);
> -
> -	printk(KERN_INFO "IR RC5 (streamzap) protocol handler initialized\n");
> -	return 0;
> -}
> -
> -static void __exit ir_rc5_sz_decode_exit(void)
> -{
> -	ir_raw_handler_unregister(&rc5_sz_handler);
> -}
> -
> -module_init(ir_rc5_sz_decode_init);
> -module_exit(ir_rc5_sz_decode_exit);
> -
> -MODULE_LICENSE("GPL");
> -MODULE_AUTHOR("Jarod Wilson <jarod@xxxxxxxxxx>");
> -MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
> -MODULE_DESCRIPTION("RC5 (streamzap) IR protocol decoder");
> diff --git a/drivers/media/rc/keymaps/rc-streamzap.c b/drivers/media/rc/keymaps/rc-streamzap.c
> index 3e4d62f..d8d097a 100644
> --- a/drivers/media/rc/keymaps/rc-streamzap.c
> +++ b/drivers/media/rc/keymaps/rc-streamzap.c
> @@ -14,9 +14,7 @@
>  static struct rc_map_table streamzap[] = {
>  /*
>   * The Streamzap remote is almost, but not quite, RC-5, as it has an extra
> - * bit in it, which throws the in-kernel RC-5 decoder for a loop. Currently,
> - * an additional RC-5-sz decoder is being deployed to support it, but it
> - * may be possible to merge it back with the standard RC-5 decoder.
> + * bit in it.
>   */
>  	{ RC_TYPE_RC5_SZ, RC_SCANCODE_RC5_SZ(0x28,0xc0), KEY_NUMERIC_0 },
>  	{ RC_TYPE_RC5_SZ, RC_SCANCODE_RC5_SZ(0x28,0xc1), KEY_NUMERIC_1 },
> diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h
> index 729b6a7..bcdf7b5 100644
> --- a/drivers/media/rc/rc-core-priv.h
> +++ b/drivers/media/rc/rc-core-priv.h
> @@ -54,7 +54,7 @@ struct ir_raw_event_ctrl {
>  		int state;
>  		u32 bits;
>  		unsigned count;
> -		unsigned wanted_bits;
> +		bool is_rc5x;
>  	} rc5;
>  	struct rc6_dec {
>  		int state;
> @@ -77,12 +77,6 @@ struct ir_raw_event_ctrl {
>  		bool first;
>  		bool toggle;
>  	} jvc;
> -	struct rc5_sz_dec {
> -		int state;
> -		u32 bits;
> -		unsigned count;
> -		unsigned wanted_bits;
> -	} rc5_sz;
>  	struct lirc_codec {
>  		struct rc_dev *dev;
>  		struct lirc_driver *drv;
> diff --git a/drivers/media/rc/streamzap.c b/drivers/media/rc/streamzap.c
> index 48cf47f..eccfbb4 100644
> --- a/drivers/media/rc/streamzap.c
> +++ b/drivers/media/rc/streamzap.c
> @@ -69,13 +69,6 @@ MODULE_DEVICE_TABLE(usb, streamzap_table);
>  /* number of samples buffered */
>  #define SZ_BUF_LEN 128
>  
> -/* from ir-rc5-sz-decoder.c */
> -#ifdef CONFIG_IR_RC5_SZ_DECODER_MODULE
> -#define load_rc5_sz_decode()    request_module("ir-rc5-sz-decoder")
> -#else
> -#define load_rc5_sz_decode()    {}
> -#endif
> -
>  enum StreamzapDecoderState {
>  	PulseSpace,
>  	FullPulse,
> @@ -458,9 +451,6 @@ static int __devinit streamzap_probe(struct usb_interface *intf,
>  	dev_info(sz->dev, "Registered %s on usb%d:%d\n", name,
>  		 usbdev->bus->busnum, usbdev->devnum);
>  
> -	/* Load the streamzap not-quite-rc5 decoder too */
> -	load_rc5_sz_decode();
> -
>  	return 0;
>  
>  rc_dev_fail:
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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