diff mbox

[10/11] media: rc: img-ir: add Sharp decoder module

Message ID 1386947579-26703-11-git-send-email-james.hogan@imgtec.com (mailing list archive)
State New, archived
Headers show

Commit Message

James Hogan Dec. 13, 2013, 3:12 p.m. UTC
Add an img-ir module for decoding the Sharp infrared protocol.

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-sharp.c | 115 +++++++++++++++++++++++++++++++++
 3 files changed, 123 insertions(+)
 create mode 100644 drivers/media/rc/img-ir/img-ir-sharp.c

Comments

Mauro Carvalho Chehab Dec. 22, 2013, 2:01 p.m. UTC | #1
Em Fri, 13 Dec 2013 15:12:58 +0000
James Hogan <james.hogan@imgtec.com> escreveu:

> Add an img-ir module for decoding the Sharp infrared protocol.

Patches 5 and 7-11 look OK to me.

While not required for patchset acceptance, it would be great if you could
also add an IR raw decoder for this protocol, specially if you can also
test it.

> 
> 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-sharp.c | 115 +++++++++++++++++++++++++++++++++
>  3 files changed, 123 insertions(+)
>  create mode 100644 drivers/media/rc/img-ir/img-ir-sharp.c
> 
> diff --git a/drivers/media/rc/img-ir/Kconfig b/drivers/media/rc/img-ir/Kconfig
> index 38505188df0e..24e0966a3220 100644
> --- a/drivers/media/rc/img-ir/Kconfig
> +++ b/drivers/media/rc/img-ir/Kconfig
> @@ -45,3 +45,10 @@ config IR_IMG_SONY
>  	help
>  	   Say Y or M here to enable support for the Sony protocol in the ImgTec
>  	   infrared decoder block.
> +
> +config IR_IMG_SHARP
> +	tristate "Sharp protocol support"
> +	depends on IR_IMG && IR_IMG_HW
> +	help
> +	   Say Y or M here to enable support for the Sharp protocol in the
> +	   ImgTec infrared decoder block.
> diff --git a/drivers/media/rc/img-ir/Makefile b/drivers/media/rc/img-ir/Makefile
> index f3e7cc4f32e4..3c3ab4f1a9f1 100644
> --- a/drivers/media/rc/img-ir/Makefile
> +++ b/drivers/media/rc/img-ir/Makefile
> @@ -7,3 +7,4 @@ obj-$(CONFIG_IR_IMG)		+= img-ir.o
>  obj-$(CONFIG_IR_IMG_NEC)	+= img-ir-nec.o
>  obj-$(CONFIG_IR_IMG_JVC)	+= img-ir-jvc.o
>  obj-$(CONFIG_IR_IMG_SONY)	+= img-ir-sony.o
> +obj-$(CONFIG_IR_IMG_SHARP)	+= img-ir-sharp.o
> diff --git a/drivers/media/rc/img-ir/img-ir-sharp.c b/drivers/media/rc/img-ir/img-ir-sharp.c
> new file mode 100644
> index 000000000000..4d70abc088b4
> --- /dev/null
> +++ b/drivers/media/rc/img-ir/img-ir-sharp.c
> @@ -0,0 +1,115 @@
> +/*
> + * ImgTec IR Decoder setup for Sharp protocol.
> + *
> + * Copyright 2012-2013 Imagination Technologies Ltd.
> + */
> +
> +#include <linux/module.h>
> +
> +#include "img-ir-hw.h"
> +
> +/* Convert Sharp data to a scancode */
> +static int img_ir_sharp_scancode(int len, u64 raw, u64 protocols)
> +{
> +	unsigned int addr, cmd, exp, chk;
> +
> +	if (len != 15)
> +		return IMG_IR_ERR_INVALID;
> +
> +	addr = (raw >>   0) & 0x1f;
> +	cmd  = (raw >>   5) & 0xff;
> +	exp  = (raw >>  13) &  0x1;
> +	chk  = (raw >>  14) &  0x1;
> +
> +	/* validate data */
> +	if (!exp)
> +		return IMG_IR_ERR_INVALID;
> +	if (chk)
> +		/* probably the second half of the message */
> +		return IMG_IR_ERR_INVALID;
> +
> +	return addr << 8 | cmd;
> +}
> +
> +/* Convert Sharp scancode to Sharp data filter */
> +static int img_ir_sharp_filter(const struct img_ir_sc_filter *in,
> +			       struct img_ir_filter *out, u64 protocols)
> +{
> +	unsigned int addr, cmd, exp = 0, chk = 0;
> +	unsigned int addr_m, cmd_m, exp_m = 0, chk_m = 0;
> +
> +	addr   = (in->data >> 8) & 0x1f;
> +	addr_m = (in->mask >> 8) & 0x1f;
> +	cmd    = (in->data >> 0) & 0xff;
> +	cmd_m  = (in->mask >> 0) & 0xff;
> +	if (cmd_m) {
> +		/* if filtering commands, we can only match the first part */
> +		exp   = 1;
> +		exp_m = 1;
> +		chk   = 0;
> +		chk_m = 1;
> +	}
> +
> +	out->data = addr        |
> +		    cmd   <<  5 |
> +		    exp   << 13 |
> +		    chk   << 14;
> +	out->mask = addr_m      |
> +		    cmd_m <<  5 |
> +		    exp_m << 13 |
> +		    chk_m << 14;
> +
> +	return 0;
> +}
> +
> +/*
> + * Sharp decoder
> + * See also http://www.sbprojects.com/knowledge/ir/sharp.php
> + */
> +static struct img_ir_decoder img_ir_sharp = {
> +	.type = RC_BIT_SHARP,
> +	.control = {
> +		.decoden = 0,
> +		.decodend2 = 1,
> +		.code_type = IMG_IR_CODETYPE_PULSEDIST,
> +		.d1validsel = 1,
> +	},
> +	/* main timings */
> +	.timings = {
> +		/* 0 symbol */
> +		.s10 = {
> +			.pulse = { 320	/* 320 us */ },
> +			.space = { 680	/* 1 ms period */ },
> +		},
> +		/* 1 symbol */
> +		.s11 = {
> +			.pulse = { 320	/* 230 us */ },
> +			.space = { 1680	/* 2 ms period */ },
> +		},
> +		/* free time */
> +		.ft = {
> +			.minlen = 15,
> +			.maxlen = 15,
> +			.ft_min = 5000,	/* 5 ms */
> +		},
> +	},
> +	/* scancode logic */
> +	.scancode = img_ir_sharp_scancode,
> +	.filter = img_ir_sharp_filter,
> +};
> +
> +static int __init img_ir_sharp_init(void)
> +{
> +	return img_ir_register_decoder(&img_ir_sharp);
> +}
> +module_init(img_ir_sharp_init);
> +
> +static void __exit img_ir_sharp_exit(void)
> +{
> +	img_ir_unregister_decoder(&img_ir_sharp);
> +}
> +module_exit(img_ir_sharp_exit);
> +
> +MODULE_AUTHOR("Imagination Technologies Ltd.");
> +MODULE_DESCRIPTION("ImgTec IR Sharp protocol support");
> +MODULE_LICENSE("GPL");
James Hogan Dec. 23, 2013, 12:04 p.m. UTC | #2
On 22/12/13 14:01, Mauro Carvalho Chehab wrote:
> Em Fri, 13 Dec 2013 15:12:58 +0000
> James Hogan <james.hogan@imgtec.com> escreveu:
> 
>> Add an img-ir module for decoding the Sharp infrared protocol.
> 
> Patches 5 and 7-11 look OK to me.

Thanks very much for reviewing.

> 
> While not required for patchset acceptance, it would be great if you could
> also add an IR raw decoder for this protocol, specially if you can also
> test it.

Yes, this had occurred to me too, but I haven't got around to it yet.
I've found several codes my universal remote control can use which
appear to be the sharp protocol so I am able to test it a bit, but don't
have any original sharp remotes to hand.

Cheers
James

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

Patch

diff --git a/drivers/media/rc/img-ir/Kconfig b/drivers/media/rc/img-ir/Kconfig
index 38505188df0e..24e0966a3220 100644
--- a/drivers/media/rc/img-ir/Kconfig
+++ b/drivers/media/rc/img-ir/Kconfig
@@ -45,3 +45,10 @@  config IR_IMG_SONY
 	help
 	   Say Y or M here to enable support for the Sony protocol in the ImgTec
 	   infrared decoder block.
+
+config IR_IMG_SHARP
+	tristate "Sharp protocol support"
+	depends on IR_IMG && IR_IMG_HW
+	help
+	   Say Y or M here to enable support for the Sharp protocol in the
+	   ImgTec infrared decoder block.
diff --git a/drivers/media/rc/img-ir/Makefile b/drivers/media/rc/img-ir/Makefile
index f3e7cc4f32e4..3c3ab4f1a9f1 100644
--- a/drivers/media/rc/img-ir/Makefile
+++ b/drivers/media/rc/img-ir/Makefile
@@ -7,3 +7,4 @@  obj-$(CONFIG_IR_IMG)		+= img-ir.o
 obj-$(CONFIG_IR_IMG_NEC)	+= img-ir-nec.o
 obj-$(CONFIG_IR_IMG_JVC)	+= img-ir-jvc.o
 obj-$(CONFIG_IR_IMG_SONY)	+= img-ir-sony.o
+obj-$(CONFIG_IR_IMG_SHARP)	+= img-ir-sharp.o
diff --git a/drivers/media/rc/img-ir/img-ir-sharp.c b/drivers/media/rc/img-ir/img-ir-sharp.c
new file mode 100644
index 000000000000..4d70abc088b4
--- /dev/null
+++ b/drivers/media/rc/img-ir/img-ir-sharp.c
@@ -0,0 +1,115 @@ 
+/*
+ * ImgTec IR Decoder setup for Sharp protocol.
+ *
+ * Copyright 2012-2013 Imagination Technologies Ltd.
+ */
+
+#include <linux/module.h>
+
+#include "img-ir-hw.h"
+
+/* Convert Sharp data to a scancode */
+static int img_ir_sharp_scancode(int len, u64 raw, u64 protocols)
+{
+	unsigned int addr, cmd, exp, chk;
+
+	if (len != 15)
+		return IMG_IR_ERR_INVALID;
+
+	addr = (raw >>   0) & 0x1f;
+	cmd  = (raw >>   5) & 0xff;
+	exp  = (raw >>  13) &  0x1;
+	chk  = (raw >>  14) &  0x1;
+
+	/* validate data */
+	if (!exp)
+		return IMG_IR_ERR_INVALID;
+	if (chk)
+		/* probably the second half of the message */
+		return IMG_IR_ERR_INVALID;
+
+	return addr << 8 | cmd;
+}
+
+/* Convert Sharp scancode to Sharp data filter */
+static int img_ir_sharp_filter(const struct img_ir_sc_filter *in,
+			       struct img_ir_filter *out, u64 protocols)
+{
+	unsigned int addr, cmd, exp = 0, chk = 0;
+	unsigned int addr_m, cmd_m, exp_m = 0, chk_m = 0;
+
+	addr   = (in->data >> 8) & 0x1f;
+	addr_m = (in->mask >> 8) & 0x1f;
+	cmd    = (in->data >> 0) & 0xff;
+	cmd_m  = (in->mask >> 0) & 0xff;
+	if (cmd_m) {
+		/* if filtering commands, we can only match the first part */
+		exp   = 1;
+		exp_m = 1;
+		chk   = 0;
+		chk_m = 1;
+	}
+
+	out->data = addr        |
+		    cmd   <<  5 |
+		    exp   << 13 |
+		    chk   << 14;
+	out->mask = addr_m      |
+		    cmd_m <<  5 |
+		    exp_m << 13 |
+		    chk_m << 14;
+
+	return 0;
+}
+
+/*
+ * Sharp decoder
+ * See also http://www.sbprojects.com/knowledge/ir/sharp.php
+ */
+static struct img_ir_decoder img_ir_sharp = {
+	.type = RC_BIT_SHARP,
+	.control = {
+		.decoden = 0,
+		.decodend2 = 1,
+		.code_type = IMG_IR_CODETYPE_PULSEDIST,
+		.d1validsel = 1,
+	},
+	/* main timings */
+	.timings = {
+		/* 0 symbol */
+		.s10 = {
+			.pulse = { 320	/* 320 us */ },
+			.space = { 680	/* 1 ms period */ },
+		},
+		/* 1 symbol */
+		.s11 = {
+			.pulse = { 320	/* 230 us */ },
+			.space = { 1680	/* 2 ms period */ },
+		},
+		/* free time */
+		.ft = {
+			.minlen = 15,
+			.maxlen = 15,
+			.ft_min = 5000,	/* 5 ms */
+		},
+	},
+	/* scancode logic */
+	.scancode = img_ir_sharp_scancode,
+	.filter = img_ir_sharp_filter,
+};
+
+static int __init img_ir_sharp_init(void)
+{
+	return img_ir_register_decoder(&img_ir_sharp);
+}
+module_init(img_ir_sharp_init);
+
+static void __exit img_ir_sharp_exit(void)
+{
+	img_ir_unregister_decoder(&img_ir_sharp);
+}
+module_exit(img_ir_sharp_exit);
+
+MODULE_AUTHOR("Imagination Technologies Ltd.");
+MODULE_DESCRIPTION("ImgTec IR Sharp protocol support");
+MODULE_LICENSE("GPL");