brintos

brintos / linux-shallow public Read only

0
0
Text · 2.2 KiB · ce5d1a0 Raw
103 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * ImgTec IR Decoder setup for Sharp protocol.4 *5 * Copyright 2012-2014 Imagination Technologies Ltd.6 */7 8#include "img-ir-hw.h"9 10/* Convert Sharp data to a scancode */11static int img_ir_sharp_scancode(int len, u64 raw, u64 enabled_protocols,12				 struct img_ir_scancode_req *request)13{14	unsigned int addr, cmd, exp, chk;15 16	if (len != 15)17		return -EINVAL;18 19	addr = (raw >>   0) & 0x1f;20	cmd  = (raw >>   5) & 0xff;21	exp  = (raw >>  13) &  0x1;22	chk  = (raw >>  14) &  0x1;23 24	/* validate data */25	if (!exp)26		return -EINVAL;27	if (chk)28		/* probably the second half of the message */29		return -EINVAL;30 31	request->protocol = RC_PROTO_SHARP;32	request->scancode = addr << 8 | cmd;33	return IMG_IR_SCANCODE;34}35 36/* Convert Sharp scancode to Sharp data filter */37static int img_ir_sharp_filter(const struct rc_scancode_filter *in,38			       struct img_ir_filter *out, u64 protocols)39{40	unsigned int addr, cmd, exp = 0, chk = 0;41	unsigned int addr_m, cmd_m, exp_m = 0, chk_m = 0;42 43	addr   = (in->data >> 8) & 0x1f;44	addr_m = (in->mask >> 8) & 0x1f;45	cmd    = (in->data >> 0) & 0xff;46	cmd_m  = (in->mask >> 0) & 0xff;47	if (cmd_m) {48		/* if filtering commands, we can only match the first part */49		exp   = 1;50		exp_m = 1;51		chk   = 0;52		chk_m = 1;53	}54 55	out->data = addr        |56		    cmd   <<  5 |57		    exp   << 13 |58		    chk   << 14;59	out->mask = addr_m      |60		    cmd_m <<  5 |61		    exp_m << 13 |62		    chk_m << 14;63 64	return 0;65}66 67/*68 * Sharp decoder69 * See also http://www.sbprojects.com/knowledge/ir/sharp.php70 */71struct img_ir_decoder img_ir_sharp = {72	.type = RC_PROTO_BIT_SHARP,73	.control = {74		.decoden = 0,75		.decodend2 = 1,76		.code_type = IMG_IR_CODETYPE_PULSEDIST,77		.d1validsel = 1,78	},79	/* main timings */80	.tolerance = 20,	/* 20% */81	.timings = {82		/* 0 symbol */83		.s10 = {84			.pulse = { 320	/* 320 us */ },85			.space = { 680	/* 1 ms period */ },86		},87		/* 1 symbol */88		.s11 = {89			.pulse = { 320	/* 320 us */ },90			.space = { 1680	/* 2 ms period */ },91		},92		/* free time */93		.ft = {94			.minlen = 15,95			.maxlen = 15,96			.ft_min = 5000,	/* 5 ms */97		},98	},99	/* scancode logic */100	.scancode = img_ir_sharp_scancode,101	.filter = img_ir_sharp_filter,102};103