media: rc: document and fix rc_validate_scancode()
For some IR protocols, some scancode values not valid, i.e. they're part of a different protocol variant. Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
49a4b36ada
commit
6b514c4a50
|
@ -776,21 +776,35 @@ void rc_keydown_notimeout(struct rc_dev *dev, enum rc_proto protocol,
|
||||||
EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
|
EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rc_validate_scancode() - checks that a scancode is valid for a protocol
|
* rc_validate_scancode() - checks that a scancode is valid for a protocol.
|
||||||
|
* For nec, it should do the opposite of ir_nec_bytes_to_scancode()
|
||||||
* @proto: protocol
|
* @proto: protocol
|
||||||
* @scancode: scancode
|
* @scancode: scancode
|
||||||
*/
|
*/
|
||||||
bool rc_validate_scancode(enum rc_proto proto, u32 scancode)
|
bool rc_validate_scancode(enum rc_proto proto, u32 scancode)
|
||||||
{
|
{
|
||||||
switch (proto) {
|
switch (proto) {
|
||||||
|
/*
|
||||||
|
* NECX has a 16-bit address; if the lower 8 bits match the upper
|
||||||
|
* 8 bits inverted, then the address would match regular nec.
|
||||||
|
*/
|
||||||
case RC_PROTO_NECX:
|
case RC_PROTO_NECX:
|
||||||
if ((((scancode >> 16) ^ ~(scancode >> 8)) & 0xff) == 0)
|
if ((((scancode >> 16) ^ ~(scancode >> 8)) & 0xff) == 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
* NEC32 has a 16 bit address and 16 bit command. If the lower 8 bits
|
||||||
|
* of the command match the upper 8 bits inverted, then it would
|
||||||
|
* be either NEC or NECX.
|
||||||
|
*/
|
||||||
case RC_PROTO_NEC32:
|
case RC_PROTO_NEC32:
|
||||||
if ((((scancode >> 24) ^ ~(scancode >> 16)) & 0xff) == 0)
|
if ((((scancode >> 8) ^ ~scancode) & 0xff) == 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
* If the customer code (top 32-bit) is 0x800f, it is MCE else it
|
||||||
|
* is regular mode-6a 32 bit
|
||||||
|
*/
|
||||||
case RC_PROTO_RC6_MCE:
|
case RC_PROTO_RC6_MCE:
|
||||||
if ((scancode & 0xffff0000) != 0x800f0000)
|
if ((scancode & 0xffff0000) != 0x800f0000)
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue