diff options
Diffstat (limited to 'drivers/media/common/ir-common.c')
-rw-r--r-- | drivers/media/common/ir-common.c | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/drivers/media/common/ir-common.c b/drivers/media/common/ir-common.c index ab7a1fba4427..a0e700d7a4a4 100644 --- a/drivers/media/common/ir-common.c +++ b/drivers/media/common/ir-common.c | |||
@@ -1,5 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ir-common.c,v 1.11 2005/07/07 14:44:43 mchehab Exp $ | ||
3 | * | 2 | * |
4 | * some common structs and functions to handle infrared remotes via | 3 | * some common structs and functions to handle infrared remotes via |
5 | * input layer ... | 4 | * input layer ... |
@@ -335,6 +334,72 @@ int ir_dump_samples(u32 *samples, int count) | |||
335 | return 0; | 334 | return 0; |
336 | } | 335 | } |
337 | 336 | ||
337 | /* decode raw samples, pulse distance coding used by NEC remotes */ | ||
338 | int ir_decode_pulsedistance(u32 *samples, int count, int low, int high) | ||
339 | { | ||
340 | int i,last,bit,len; | ||
341 | u32 curBit; | ||
342 | u32 value; | ||
343 | |||
344 | /* find start burst */ | ||
345 | for (i = len = 0; i < count * 32; i++) { | ||
346 | bit = getbit(samples,i); | ||
347 | if (bit) { | ||
348 | len++; | ||
349 | } else { | ||
350 | if (len >= 29) | ||
351 | break; | ||
352 | len = 0; | ||
353 | } | ||
354 | } | ||
355 | |||
356 | /* start burst to short */ | ||
357 | if (len < 29) | ||
358 | return 0xffffffff; | ||
359 | |||
360 | /* find start silence */ | ||
361 | for (len = 0; i < count * 32; i++) { | ||
362 | bit = getbit(samples,i); | ||
363 | if (bit) { | ||
364 | break; | ||
365 | } else { | ||
366 | len++; | ||
367 | } | ||
368 | } | ||
369 | |||
370 | /* silence to short */ | ||
371 | if (len < 7) | ||
372 | return 0xffffffff; | ||
373 | |||
374 | /* go decoding */ | ||
375 | len = 0; | ||
376 | last = 1; | ||
377 | value = 0; curBit = 1; | ||
378 | for (; i < count * 32; i++) { | ||
379 | bit = getbit(samples,i); | ||
380 | if (last) { | ||
381 | if(bit) { | ||
382 | continue; | ||
383 | } else { | ||
384 | len = 1; | ||
385 | } | ||
386 | } else { | ||
387 | if (bit) { | ||
388 | if (len > (low + high) /2) | ||
389 | value |= curBit; | ||
390 | curBit <<= 1; | ||
391 | if (curBit == 1) | ||
392 | break; | ||
393 | } else { | ||
394 | len++; | ||
395 | } | ||
396 | } | ||
397 | last = bit; | ||
398 | } | ||
399 | |||
400 | return value; | ||
401 | } | ||
402 | |||
338 | /* decode raw samples, biphase coding, used by rc5 for example */ | 403 | /* decode raw samples, biphase coding, used by rc5 for example */ |
339 | int ir_decode_biphase(u32 *samples, int count, int low, int high) | 404 | int ir_decode_biphase(u32 *samples, int count, int low, int high) |
340 | { | 405 | { |
@@ -383,6 +448,7 @@ EXPORT_SYMBOL_GPL(ir_input_keydown); | |||
383 | EXPORT_SYMBOL_GPL(ir_extract_bits); | 448 | EXPORT_SYMBOL_GPL(ir_extract_bits); |
384 | EXPORT_SYMBOL_GPL(ir_dump_samples); | 449 | EXPORT_SYMBOL_GPL(ir_dump_samples); |
385 | EXPORT_SYMBOL_GPL(ir_decode_biphase); | 450 | EXPORT_SYMBOL_GPL(ir_decode_biphase); |
451 | EXPORT_SYMBOL_GPL(ir_decode_pulsedistance); | ||
386 | 452 | ||
387 | /* | 453 | /* |
388 | * Local variables: | 454 | * Local variables: |