Re: [RFC PATCH 1/3] rc-core: Add Manchester encoder (phase encoder) support to rc-core

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

 



Hi Antti,

On 08/02/14 12:07, Antti Seppälä wrote:
> Adding a simple Manchester encoder to rc-core.
> Manchester coding is used by at least RC-5 protocol and its variants.
> 
> Signed-off-by: Antti Seppälä <a.seppala@xxxxxxxxx>
> ---
>  drivers/media/rc/ir-raw.c       | 44 +++++++++++++++++++++++++++++++++++++++++
>  drivers/media/rc/rc-core-priv.h | 14 +++++++++++++
>  2 files changed, 58 insertions(+)
> 
> diff --git a/drivers/media/rc/ir-raw.c b/drivers/media/rc/ir-raw.c
> index 9d734dd..7fea9ac 100644
> --- a/drivers/media/rc/ir-raw.c
> +++ b/drivers/media/rc/ir-raw.c
> @@ -240,6 +240,50 @@ ir_raw_get_allowed_protocols(void)
>  	return protocols;
>  }
>  
> +int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max,
> +			  const struct ir_raw_timings_manchester *timings,
> +			  unsigned int n, unsigned int data)
> +{
> +	bool need_pulse;
> +	int i, count = 0;
> +	i = 1 << (n - 1);
> +
> +	if (n > max || max < 2)
> +		return -EINVAL;
> +
> +	if (timings->pulse_space_start) {
> +		init_ir_raw_event_duration((*ev)++, 1, timings->clock);
> +		init_ir_raw_event_duration((*ev), 0, timings->clock);
> +		count += 2;
> +	} else {
> +		init_ir_raw_event_duration((*ev), 1, timings->clock);
> +		count++;
> +	}
> +	i >>= 1;

If you use pulse_space_start to encode the first bit, did you mean to
discard the highest bit of data?

> +
> +	while (i > 0) {
> +		if (count > max)

if count > max I think you've already overflowed the buffer (max is more
of a max count rather than max buffer index).

> +			return -EINVAL;
> +
> +		need_pulse = !(data & i);
> +		if (need_pulse == !!(*ev)->pulse) {
> +			(*ev)->duration += timings->clock;
> +		} else {
> +			init_ir_raw_event_duration(++(*ev), need_pulse,
> +						   timings->clock);
> +			count++;

I guess you need to check for buffer space here too.

> +		}
> +
> +		init_ir_raw_event_duration(++(*ev), !need_pulse,
> +					   timings->clock);
> +		count++;
> +		i >>= 1;
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(ir_raw_gen_manchester);

Cheers
James

Attachment: signature.asc
Description: OpenPGP digital signature


[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