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.sepp...@gmail.com>
> ---
>  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

Reply via email to