From: Mauro Carvalho Chehab <m.chehab@samsung.com>
To: James Hogan <james.hogan@imgtec.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH 06/11] media: rc: img-ir: add NEC decoder module
Date: Sun, 22 Dec 2013 11:49:01 -0200 [thread overview]
Message-ID: <20131222114901.3e5d7dae@samsung.com> (raw)
In-Reply-To: <1386947579-26703-7-git-send-email-james.hogan@imgtec.com>
Em Fri, 13 Dec 2013 15:12:54 +0000
James Hogan <james.hogan@imgtec.com> escreveu:
> Add an img-ir module for decoding the NEC and extended NEC infrared
> protocols.
>
> Signed-off-by: James Hogan <james.hogan@imgtec.com>
> Cc: Mauro Carvalho Chehab <m.chehab@samsung.com>
> Cc: linux-media@vger.kernel.org
> ---
> drivers/media/rc/img-ir/Kconfig | 7 ++
> drivers/media/rc/img-ir/Makefile | 1 +
> drivers/media/rc/img-ir/img-ir-nec.c | 149 +++++++++++++++++++++++++++++++++++
> 3 files changed, 157 insertions(+)
> create mode 100644 drivers/media/rc/img-ir/img-ir-nec.c
>
> diff --git a/drivers/media/rc/img-ir/Kconfig b/drivers/media/rc/img-ir/Kconfig
> index 60eaba6a0843..44d00227c6c4 100644
> --- a/drivers/media/rc/img-ir/Kconfig
> +++ b/drivers/media/rc/img-ir/Kconfig
> @@ -24,3 +24,10 @@ config IR_IMG_HW
> signals in hardware. This is more reliable, consumes less processing
> power since only a single interrupt is received for each scancode,
> and allows an IR scancode to be used as a wake event.
> +
> +config IR_IMG_NEC
> + tristate "NEC protocol support"
> + depends on IR_IMG && IR_IMG_HW
> + help
> + Say Y or M here to enable support for the NEC and extended NEC
> + protocols in the ImgTec infrared decoder block.
> diff --git a/drivers/media/rc/img-ir/Makefile b/drivers/media/rc/img-ir/Makefile
> index 4ef86edec873..f3052878f092 100644
> --- a/drivers/media/rc/img-ir/Makefile
> +++ b/drivers/media/rc/img-ir/Makefile
> @@ -4,3 +4,4 @@ img-ir-$(CONFIG_IR_IMG_HW) += img-ir-hw.o
> img-ir-objs := $(img-ir-y)
>
> obj-$(CONFIG_IR_IMG) += img-ir.o
> +obj-$(CONFIG_IR_IMG_NEC) += img-ir-nec.o
> diff --git a/drivers/media/rc/img-ir/img-ir-nec.c b/drivers/media/rc/img-ir/img-ir-nec.c
> new file mode 100644
> index 000000000000..ba376caafaf2
> --- /dev/null
> +++ b/drivers/media/rc/img-ir/img-ir-nec.c
> @@ -0,0 +1,149 @@
> +/*
> + * ImgTec IR Decoder setup for NEC protocol.
> + *
> + * Copyright 2010-2013 Imagination Technologies Ltd.
> + */
> +
> +#include <linux/module.h>
> +
> +#include "img-ir-hw.h"
> +
> +/* Convert NEC data to a scancode */
> +static int img_ir_nec_scancode(int len, u64 raw, u64 protocols)
> +{
> + unsigned int addr, addr_inv, data, data_inv;
> + int scancode;
> + /* a repeat code has no data */
> + if (!len)
> + return IMG_IR_REPEATCODE;
> + if (len != 32)
> + return IMG_IR_ERR_INVALID;
> + addr = (raw >> 0) & 0xff;
> + addr_inv = (raw >> 8) & 0xff;
> + data = (raw >> 16) & 0xff;
> + data_inv = (raw >> 24) & 0xff;
> + /* Validate data */
> + if ((data_inv ^ data) != 0xff)
> + return IMG_IR_ERR_INVALID;
> +
> + if ((addr_inv ^ addr) != 0xff) {
> + /* Extended NEC */
> + scancode = addr << 16 |
> + addr_inv << 8 |
> + data;
> + } else {
> + /* Normal NEC */
> + scancode = addr << 8 |
> + data;
> + }
There are some types of NEC extended that uses the full 32 bits as
scancodes. Those are used at least on Apple and TiVo remote controllers.
> + return scancode;
> +}
> +
> +/* Convert NEC scancode to NEC data filter */
> +static int img_ir_nec_filter(const struct img_ir_sc_filter *in,
> + struct img_ir_filter *out, u64 protocols)
> +{
> + unsigned int addr, addr_inv, data, data_inv;
> + unsigned int addr_m, addr_inv_m, data_m;
> +
> + data = in->data & 0xff;
> + data_m = in->mask & 0xff;
> + data_inv = data ^ 0xff;
> +
> + if (in->data & 0xff000000)
> + return -EINVAL;
> +
> + if (in->data & 0x00ff0000) {
> + /* Extended NEC */
> + addr = (in->data >> 16) & 0xff;
> + addr_m = (in->mask >> 16) & 0xff;
> + addr_inv = (in->data >> 8) & 0xff;
> + addr_inv_m = (in->mask >> 8) & 0xff;
> + } else {
> + /* Normal NEC */
> + addr = (in->data >> 8) & 0xff;
> + addr_m = (in->mask >> 8) & 0xff;
> + addr_inv = addr ^ 0xff;
> + addr_inv_m = addr_m;
> + }
> +
> + out->data = data_inv << 24 |
> + data << 16 |
> + addr_inv << 8 |
> + addr;
> + out->mask = data_m << 24 |
> + data_m << 16 |
> + addr_inv_m << 8 |
> + addr_m;
> + return 0;
> +}
> +
> +/*
> + * NEC decoder
> + * See also http://www.sbprojects.com/knowledge/ir/nec.php
> + * http://wiki.altium.com/display/ADOH/NEC+Infrared+Transmission+Protocol
> + */
> +static struct img_ir_decoder img_ir_nec = {
> + .type = RC_BIT_NEC,
> + .control = {
> + .decoden = 1,
> + .code_type = IMG_IR_CODETYPE_PULSEDIST,
> + },
> + /* main timings */
> + .unit = 562500, /* 562.5 us */
> + .timings = {
> + /* leader symbol */
> + .ldr = {
> + .pulse = { 16 /* 9ms */ },
> + .space = { 8 /* 4.5ms */ },
> + },
> + /* 0 symbol */
> + .s00 = {
> + .pulse = { 1 /* 562.5 us */ },
> + .space = { 1 /* 562.5 us */ },
> + },
> + /* 1 symbol */
> + .s01 = {
> + .pulse = { 1 /* 562.5 us */ },
> + .space = { 3 /* 1687.5 us */ },
> + },
> + /* free time */
> + .ft = {
> + .minlen = 32,
> + .maxlen = 32,
> + .ft_min = 10, /* 5.625 ms */
> + },
> + },
> + /* repeat codes */
> + .repeat = 108, /* 108 ms */
> + .rtimings = {
> + /* leader symbol */
> + .ldr = {
> + .space = { 4 /* 2.25 ms */ },
> + },
> + /* free time */
> + .ft = {
> + .minlen = 0, /* repeat code has no data */
> + .maxlen = 0,
> + },
> + },
> + /* scancode logic */
> + .scancode = img_ir_nec_scancode,
> + .filter = img_ir_nec_filter,
> +};
> +
> +static int __init img_ir_nec_init(void)
> +{
> + return img_ir_register_decoder(&img_ir_nec);
> +}
> +module_init(img_ir_nec_init);
> +
> +static void __exit img_ir_nec_exit(void)
> +{
> + img_ir_unregister_decoder(&img_ir_nec);
> +}
> +module_exit(img_ir_nec_exit);
> +
> +MODULE_AUTHOR("Imagination Technologies Ltd.");
> +MODULE_DESCRIPTION("ImgTec IR NEC protocol support");
> +MODULE_LICENSE("GPL");
--
Cheers,
Mauro
next prev parent reply other threads:[~2013-12-22 13:49 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-13 15:12 [PATCH 00/11] media: rc: ImgTec IR decoder driver James Hogan
2013-12-13 15:12 ` [PATCH 01/11] dt: binding: add binding for ImgTec IR block James Hogan
2013-12-22 10:56 ` Mauro Carvalho Chehab
2013-12-22 12:48 ` Tomasz Figa
2013-12-23 10:41 ` James Hogan
2013-12-13 15:12 ` [PATCH 02/11] media: rc: img-ir: add base driver James Hogan
2013-12-13 15:12 ` [PATCH 03/11] media: rc: img-ir: add raw driver James Hogan
2013-12-13 15:12 ` [PATCH 04/11] media: rc: img-ir: add hardware decoder driver James Hogan
2013-12-22 13:40 ` Mauro Carvalho Chehab
2013-12-23 13:17 ` James Hogan
2013-12-13 15:12 ` [PATCH 05/11] media: rc: img-ir: add to build James Hogan
2013-12-13 15:12 ` [PATCH 06/11] media: rc: img-ir: add NEC decoder module James Hogan
2013-12-22 13:49 ` Mauro Carvalho Chehab [this message]
2013-12-23 11:30 ` James Hogan
2013-12-13 15:12 ` [PATCH 07/11] media: rc: img-ir: add JVC " James Hogan
2013-12-13 15:12 ` [PATCH 08/11] media: rc: img-ir: add Sony " James Hogan
2013-12-13 15:12 ` [PATCH 09/11] media: rc: add Sharp infrared protocol James Hogan
2013-12-13 15:12 ` [PATCH 10/11] media: rc: img-ir: add Sharp decoder module James Hogan
2013-12-22 14:01 ` Mauro Carvalho Chehab
2013-12-23 12:04 ` James Hogan
2013-12-13 15:12 ` [PATCH 11/11] media: rc: img-ir: add Sanyo " James Hogan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131222114901.3e5d7dae@samsung.com \
--to=m.chehab@samsung.com \
--cc=james.hogan@imgtec.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox