Re: [PATCH] rc-core: use the full 32 bits for NEC scancodes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



April 24, 2017 5:58 PM, "Sean Young" <sean@xxxxxxxx> wrote:
> On Tue, Apr 18, 2017 at 05:50:27PM +0200, David Härdeman wrote:
>> Using the full 32 bits for all kinds of NEC scancodes simplifies rc-core
>> and the nec decoder without any loss of functionality. At the same time
>> it ensures that scancodes for NEC16/NEC24/NEC32 do not overlap and
>> removes lots of duplication (as you can see from the patch, the same NEC
>> disambiguation logic is contained in several different drivers).
>> 
>> Using NEC32 also removes ambiguity. For example, consider these two NEC
>> messages:
>> NEC16 message to address 0x05, command 0x03
>> NEC24 message to address 0x0005, command 0x03
>> 
>> They'll both have scancode 0x00000503, and there's no way to tell which
>> message was received.
> 
> More precisely, there is no way to tell which protocol variant it was sent
> with.

Oh, but there is. The driver/rc-core will know. It's just that userspace cannot ever know.

> With the Sony and rc6 protocols, you can also get the same scancode from
> different protocol variants. I think the right solution is to pass the protocol
> variant to user space (and the keymap mapper).

Yes, I'm working on refreshing my patches to add a new EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2 ioctl which includes the protocol. And actually, those patches are greatly simplified by only using NEC32.
 
> This also solves some other problems, e.g. rc6_6a_20:0x75460 is also decoded
> by the sony protocol decoder (as scancode 0).

I know. And it also makes it possible to make /sys/class/rc/rc0/protocols fully automatic. And we could theoretically also refuse to set unsupported protocols in the keytable (not sure yet if that's something we should do).

>> In order to maintain backwards compatibility, some heuristics are added
>> in rc-main.c to convert scancodes to NEC32 as necessary when userspace
>> adds entries to the keytable using the regular input ioctls.
> 
> This is where it falls apart. In the patch below, you guess the protocol
> variant from the scancode value. By your own example above, nec24 with
> an address of 0x0005 would be not be possible in a keymap since it would
> guessed as nec16 (see to_nec32() below) and expanded to 0x05fb03fc. An
> actual nec24 would be 0x000503fc.

It's not 100% bulletproof. There's no way to fix this issue in a 100% backwards compatible manner. But the future EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2 ioctl would make the heuristics unnecessary.

>> These
>> heuristics are essentially the same as the ones that are currently in
>> drivers/media/rc/img-ir/img-ir-nec.c (which are rendered unecessary
>> with this patch).
> 
> Rendered unnecessary since you moved it to core code. You've changed the
> img-ir filter functionality in the process, breaking userspace.

I doubt it can be fixed in a way which doesn't involve some userspace changes. But the breakage can be minimized.

> This is the scancode filter in the img-ir which admittedly isn't great,
> so I don't think we should introduce it elsewhere. What would be much
> better would be if we could specify the protocol variants for ir decoding,
> rather than just "nec" or "sony" or "rc6". I'm not sure how to do this
> without breaking userspace though.

I think the best way is by introducing the new ioctls.

Anyway, I'll try to post the whole patchset later today, then it should be clearer why this is a good change.

>> The reason this has to be done now is that the newer sysfs wakefilter API
>> will expose the difference between the NEC protocols to userspace for no
>> good reason and once exposed, it will be much more difficult to change the
>> logic.
>> 
>> Signed-off-by: David Härdeman <david@xxxxxxxxxxx>
>> ---
>> drivers/media/rc/igorplugusb.c | 4 +
>> drivers/media/rc/img-ir/img-ir-nec.c | 92 +++++++---------------------------
>> drivers/media/rc/ir-nec-decoder.c | 63 ++++-------------------
>> drivers/media/rc/rc-main.c | 74 ++++++++++++++++++++-------
>> drivers/media/rc/winbond-cir.c | 32 +-----------
>> 5 files changed, 89 insertions(+), 176 deletions(-)
>> 
>> diff --git a/drivers/media/pci/cx88/cx88-input.c b/drivers/media/pci/cx88/cx88-input.c
>> index 01f2e472a2a0..61c46763ac97 100644
>> --- a/drivers/media/pci/cx88/cx88-input.c
>> +++ b/drivers/media/pci/cx88/cx88-input.c
>> @@ -146,7 +146,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
>> scancode = RC_SCANCODE_NECX(addr, cmd);
>> 
>> if (0 == (gpio & ir->mask_keyup))
>> - rc_keydown_notimeout(ir->dev, RC_TYPE_NECX, scancode,
>> + rc_keydown_notimeout(ir->dev, RC_TYPE_NEC, scancode,
>> 0);
>> else
>> rc_keyup(ir->dev);
>> @@ -348,7 +348,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
>> * 002-T mini RC, provided with newer PV hardware
>> */
>> ir_codes = RC_MAP_PIXELVIEW_MK12;
>> - rc_type = RC_BIT_NECX;
>> + rc_type = RC_BIT_NEC;
>> ir->gpio_addr = MO_GP1_IO;
>> ir->mask_keyup = 0x80;
>> ir->polling = 10; /* ms */
>> diff --git a/drivers/media/pci/saa7134/saa7134-input.c b/drivers/media/pci/saa7134/saa7134-input.c
>> index 78849c19f68a..47d8e055ddd3 100644
>> --- a/drivers/media/pci/saa7134/saa7134-input.c
>> +++ b/drivers/media/pci/saa7134/saa7134-input.c
>> @@ -338,7 +338,7 @@ static int get_key_beholdm6xx(struct IR_i2c *ir, enum rc_type *protocol,
>> if (data[9] != (unsigned char)(~data[8]))
>> return 0;
>> 
>> - *protocol = RC_TYPE_NECX;
>> + *protocol = RC_TYPE_NEC;
>> *scancode = RC_SCANCODE_NECX(data[11] << 8 | data[10], data[9]);
>> *toggle = 0;
>> return 1;
>> @@ -1028,7 +1028,7 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
>> dev->init_data.name = "BeholdTV";
>> dev->init_data.get_key = get_key_beholdm6xx;
>> dev->init_data.ir_codes = RC_MAP_BEHOLD;
>> - dev->init_data.type = RC_BIT_NECX;
>> + dev->init_data.type = RC_BIT_NEC;
>> info.addr = 0x2d;
>> break;
>> case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
>> diff --git a/drivers/media/rc/igorplugusb.c b/drivers/media/rc/igorplugusb.c
>> index cb6d4f1247da..9e3119c94368 100644
>> --- a/drivers/media/rc/igorplugusb.c
>> +++ b/drivers/media/rc/igorplugusb.c
>> @@ -203,8 +203,8 @@ static int igorplugusb_probe(struct usb_interface *intf,
>> * for the NEC protocol and many others.
>> */
>> rc->allowed_protocols = RC_BIT_ALL_IR_DECODER & ~(RC_BIT_NEC |
>> - RC_BIT_NECX | RC_BIT_NEC32 | RC_BIT_RC6_6A_20 |
>> - RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE |
>> + RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |
>> + RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE |
>> RC_BIT_SONY20 | RC_BIT_SANYO);
>> 
>> rc->priv = ir;
>> diff --git a/drivers/media/rc/img-ir/img-ir-nec.c b/drivers/media/rc/img-ir/img-ir-nec.c
>> index 044fd42b22a0..56159bb44f9c 100644
>> --- a/drivers/media/rc/img-ir/img-ir-nec.c
>> +++ b/drivers/media/rc/img-ir/img-ir-nec.c
>> @@ -28,28 +28,15 @@ static int img_ir_nec_scancode(int len, u64 raw, u64 enabled_protocols,
>> addr_inv = (raw >> 8) & 0xff;
>> data = (raw >> 16) & 0xff;
>> data_inv = (raw >> 24) & 0xff;
>> - if ((data_inv ^ data) != 0xff) {
>> - /* 32-bit NEC (used by Apple and TiVo remotes) */
>> - /* scan encoding: as transmitted, MSBit = first received bit */
>> - request->scancode = bitrev8(addr) << 24 |
>> - bitrev8(addr_inv) << 16 |
>> - bitrev8(data) << 8 |
>> - bitrev8(data_inv);
>> - request->protocol = RC_TYPE_NEC32;
>> - } else if ((addr_inv ^ addr) != 0xff) {
>> - /* Extended NEC */
>> - /* scan encoding: AAaaDD */
>> - request->scancode = addr << 16 |
>> - addr_inv << 8 |
>> - data;
>> - request->protocol = RC_TYPE_NECX;
>> - } else {
>> - /* Normal NEC */
>> - /* scan encoding: AADD */
>> - request->scancode = addr << 8 |
>> - data;
>> - request->protocol = RC_TYPE_NEC;
>> - }
>> +
>> + /* 32-bit NEC */
>> + /* scan encoding: as transmitted, MSBit = first received bit */
>> + request->scancode =
>> + bitrev8(addr) << 24 |
>> + bitrev8(addr_inv) << 16 |
>> + bitrev8(data) << 8 |
>> + bitrev8(data_inv);
>> + request->protocol = RC_TYPE_NEC;
>> return IMG_IR_SCANCODE;
>> }
>> 
>> @@ -60,55 +47,16 @@ static int img_ir_nec_filter(const struct rc_scancode_filter *in,
>> unsigned int addr, addr_inv, data, data_inv;
>> unsigned int addr_m, addr_inv_m, data_m, data_inv_m;
>> 
>> - data = in->data & 0xff;
>> - data_m = in->mask & 0xff;
>> -
>> - protocols &= RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32;
>> -
>> - /*
>> - * If only one bit is set, we were requested to do an exact
>> - * protocol. This should be the case for wakeup filters; for
>> - * normal filters, guess the protocol from the scancode.
>> - */
>> - if (!is_power_of_2(protocols)) {
>> - if ((in->data | in->mask) & 0xff000000)
>> - protocols = RC_BIT_NEC32;
>> - else if ((in->data | in->mask) & 0x00ff0000)
>> - protocols = RC_BIT_NECX;
>> - else
>> - protocols = RC_BIT_NEC;
>> - }
>> -
>> - if (protocols == RC_BIT_NEC32) {
>> - /* 32-bit NEC (used by Apple and TiVo remotes) */
>> - /* scan encoding: as transmitted, MSBit = first received bit */
>> - addr = bitrev8(in->data >> 24);
>> - addr_m = bitrev8(in->mask >> 24);
>> - addr_inv = bitrev8(in->data >> 16);
>> - addr_inv_m = bitrev8(in->mask >> 16);
>> - data = bitrev8(in->data >> 8);
>> - data_m = bitrev8(in->mask >> 8);
>> - data_inv = bitrev8(in->data >> 0);
>> - data_inv_m = bitrev8(in->mask >> 0);
>> - } else if (protocols == RC_BIT_NECX) {
>> - /* Extended NEC */
>> - /* scan encoding AAaaDD */
>> - addr = (in->data >> 16) & 0xff;
>> - addr_m = (in->mask >> 16) & 0xff;
>> - addr_inv = (in->data >> 8) & 0xff;
>> - addr_inv_m = (in->mask >> 8) & 0xff;
>> - data_inv = data ^ 0xff;
>> - data_inv_m = data_m;
>> - } else {
>> - /* Normal NEC */
>> - /* scan encoding: AADD */
>> - addr = (in->data >> 8) & 0xff;
>> - addr_m = (in->mask >> 8) & 0xff;
>> - addr_inv = addr ^ 0xff;
>> - addr_inv_m = addr_m;
>> - data_inv = data ^ 0xff;
>> - data_inv_m = data_m;
>> - }
>> + /* 32-bit NEC */
>> + /* scan encoding: as transmitted, MSBit = first received bit */
>> + addr = bitrev8(in->data >> 24);
>> + addr_m = bitrev8(in->mask >> 24);
>> + addr_inv = bitrev8(in->data >> 16);
>> + addr_inv_m = bitrev8(in->mask >> 16);
>> + data = bitrev8(in->data >> 8);
>> + data_m = bitrev8(in->mask >> 8);
>> + data_inv = bitrev8(in->data >> 0);
>> + data_inv_m = bitrev8(in->mask >> 0);
> 
> If someone sets the filter and filter_mask to (say) 0xe100 and 0xff00
> respectively, then your change just broke it.
> 
>> /* raw encoding: ddDDaaAA */
>> out->data = data_inv << 24 |
>> @@ -128,7 +76,7 @@ static int img_ir_nec_filter(const struct rc_scancode_filter *in,
>> * http://wiki.altium.com/display/ADOH/NEC+Infrared+Transmission+Protocol
>> */
>> struct img_ir_decoder img_ir_nec = {
>> - .type = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32,
>> + .type = RC_BIT_NEC,
>> .control = {
>> .decoden = 1,
>> .code_type = IMG_IR_CODETYPE_PULSEDIST,
>> diff --git a/drivers/media/rc/ir-nec-decoder.c b/drivers/media/rc/ir-nec-decoder.c
>> index 3ce850314dca..1f137dfa3eb3 100644
>> --- a/drivers/media/rc/ir-nec-decoder.c
>> +++ b/drivers/media/rc/ir-nec-decoder.c
>> @@ -49,9 +49,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
>> {
>> struct nec_dec *data = &dev->raw->nec;
>> u32 scancode;
>> - enum rc_type rc_type;
>> u8 address, not_address, command, not_command;
>> - bool send_32bits = false;
>> 
>> if (!is_timing_event(ev)) {
>> if (ev.reset)
>> @@ -161,39 +159,14 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
>> command = bitrev8((data->bits >> 8) & 0xff);
>> not_command = bitrev8((data->bits >> 0) & 0xff);
>> 
>> - if ((command ^ not_command) != 0xff) {
>> - IR_dprintk(1, "NEC checksum error: received 0x%08x\n",
>> - data->bits);
>> - send_32bits = true;
>> - }
>> -
>> - if (send_32bits) {
>> - /* NEC transport, but modified protocol, used by at
>> - * least Apple and TiVo remotes */
>> - scancode = not_address << 24 |
>> - address << 16 |
>> - not_command << 8 |
>> - command;
>> - IR_dprintk(1, "NEC (modified) scancode 0x%08x\n", scancode);
>> - rc_type = RC_TYPE_NEC32;
>> - } else if ((address ^ not_address) != 0xff) {
>> - /* Extended NEC */
>> - scancode = address << 16 |
>> - not_address << 8 |
>> - command;
>> - IR_dprintk(1, "NEC (Ext) scancode 0x%06x\n", scancode);
>> - rc_type = RC_TYPE_NECX;
>> - } else {
>> - /* Normal NEC */
>> - scancode = address << 8 | command;
>> - IR_dprintk(1, "NEC scancode 0x%04x\n", scancode);
>> - rc_type = RC_TYPE_NEC;
>> - }
>> + scancode = RC_SCANCODE_NEC32(address << 24 | not_address << 16 |
>> + command << 8 | not_command);
>> + IR_dprintk(1, "NEC scancode 0x%08x\n", scancode);
>> 
>> if (data->is_nec_x)
>> data->necx_repeat = true;
>> 
>> - rc_keydown(dev, rc_type, scancode, 0);
>> + rc_keydown(dev, RC_TYPE_NEC, scancode, 0);
>> data->state = STATE_INACTIVE;
>> return 0;
>> }
>> @@ -214,27 +187,11 @@ static u32 ir_nec_scancode_to_raw(enum rc_type protocol, u32 scancode)
>> {
>> unsigned int addr, addr_inv, data, data_inv;
>> 
>> - data = scancode & 0xff;
>> -
>> - if (protocol == RC_TYPE_NEC32) {
>> - /* 32-bit NEC (used by Apple and TiVo remotes) */
>> - /* scan encoding: aaAAddDD */
>> - addr_inv = (scancode >> 24) & 0xff;
>> - addr = (scancode >> 16) & 0xff;
>> - data_inv = (scancode >> 8) & 0xff;
>> - } else if (protocol == RC_TYPE_NECX) {
>> - /* Extended NEC */
>> - /* scan encoding AAaaDD */
>> - addr = (scancode >> 16) & 0xff;
>> - addr_inv = (scancode >> 8) & 0xff;
>> - data_inv = data ^ 0xff;
>> - } else {
>> - /* Normal NEC */
>> - /* scan encoding: AADD */
>> - addr = (scancode >> 8) & 0xff;
>> - addr_inv = addr ^ 0xff;
>> - data_inv = data ^ 0xff;
>> - }
>> + /* 32-bit NEC, scan encoding: aaAAddDD */
>> + addr_inv = (scancode >> 24) & 0xff;
>> + addr = (scancode >> 16) & 0xff;
>> + data_inv = (scancode >> 8) & 0xff;
>> + data = (scancode >> 0) & 0xff;
>> 
>> /* raw encoding: ddDDaaAA */
>> return data_inv << 24 |
>> @@ -285,7 +242,7 @@ static int ir_nec_encode(enum rc_type protocol, u32 scancode,
>> }
>> 
>> static struct ir_raw_handler nec_handler = {
>> - .protocols = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32,
>> + .protocols = RC_BIT_NEC,
>> .decode = ir_nec_decode,
>> .encode = ir_nec_encode,
>> };
>> diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
>> index 6ec73357fa47..196843c5a886 100644
>> --- a/drivers/media/rc/rc-main.c
>> +++ b/drivers/media/rc/rc-main.c
>> @@ -327,6 +327,49 @@ static unsigned int ir_establish_scancode(struct rc_dev *dev,
>> }
>> 
>> /**
>> + * guess_protocol() - heuristics to guess the protocol for a scancode
>> + * @rdev: the struct rc_dev device descriptor
>> + * @return: the guessed RC_TYPE_* protocol
>> + *
>> + * Internal routine to guess the current IR protocol for legacy ioctls.
>> + */
>> +static inline enum rc_type guess_protocol(struct rc_dev *rdev)
>> +{
>> + struct rc_map *rc_map = &rdev->rc_map;
>> +
>> + if (hweight64(rdev->enabled_protocols) == 1)
>> + return rc_bitmap_to_type(rdev->enabled_protocols);
>> + else if (hweight64(rdev->allowed_protocols) == 1)
>> + return rc_bitmap_to_type(rdev->allowed_protocols);
>> + else
>> + return rc_map->rc_type;
>> +}
>> +
>> +/**
>> + * to_nec32() - helper function to try to convert misc NEC scancodes to NEC32
>> + * @orig: original scancode
>> + * @return: NEC32 scancode
>> + *
>> + * This helper routine is used to provide backwards compatibility.
>> + */
>> +static u64 to_nec32(u64 orig)
>> +{
>> + u8 b3 = (u8)(orig >> 16);
>> + u8 b2 = (u8)(orig >> 8);
>> + u8 b1 = (u8)(orig >> 0);
>> +
>> + if (orig <= 0xffff)
>> + /* Plain old NEC */
>> + return b2 << 24 | ((u8)~b2) << 16 | b1 << 8 | ((u8)~b1);
>> + else if (orig <= 0xffffff)
>> + /* NEC extended */
>> + return b3 << 24 | b2 << 16 | b1 << 8 | ((u8)~b1);
>> + else
>> + /* NEC32 */
>> + return orig;
>> +}
> 
> So what about extended nec with an address < 0x100? Or an nec32 with the
> upper 8 bits set to 0? This is no longer possible.
> 
>> +
>> +/**
>> * ir_setkeycode() - set a keycode in the scancode->keycode table
>> * @idev: the struct input_dev device descriptor
>> * @scancode: the desired scancode
>> @@ -359,6 +402,9 @@ static int ir_setkeycode(struct input_dev *idev,
>> if (retval)
>> goto out;
>> 
>> + if (guess_protocol(rdev) == RC_TYPE_NEC)
>> + scancode = to_nec32(scancode);
>> +
>> index = ir_establish_scancode(rdev, rc_map, scancode, true);
>> if (index >= rc_map->len) {
>> retval = -ENOMEM;
>> @@ -399,7 +445,10 @@ static int ir_setkeytable(struct rc_dev *dev,
>> 
>> for (i = 0; i < from->size; i++) {
>> index = ir_establish_scancode(dev, rc_map,
>> - from->scan[i].scancode, false);
>> + from->rc_type == RC_TYPE_NEC ?
>> + to_nec32(from->scan[i].scancode) :
>> + from->scan[i].scancode,
>> + false);
>> if (index >= rc_map->len) {
>> rc = -ENOMEM;
>> break;
>> @@ -473,6 +522,8 @@ static int ir_getkeycode(struct input_dev *idev,
>> if (retval)
>> goto out;
>> 
>> + if (guess_protocol(rdev) == RC_TYPE_NEC)
>> + scancode = to_nec32(scancode);
>> index = ir_lookup_by_scancode(rc_map, scancode);
>> }
>> 
>> @@ -669,7 +720,6 @@ static void ir_do_keydown(struct rc_dev *dev, enum rc_type protocol,
>> 
>> led_trigger_event(led_feedback, LED_FULL);
>> }
>> -
>> input_sync(dev->input_dev);
>> }
>> 
>> @@ -742,9 +792,7 @@ static int rc_validate_filter(struct rc_dev *dev,
>> [RC_TYPE_SONY15] = 0xff007f,
>> [RC_TYPE_SONY20] = 0x1fff7f,
>> [RC_TYPE_JVC] = 0xffff,
>> - [RC_TYPE_NEC] = 0xffff,
>> - [RC_TYPE_NECX] = 0xffffff,
>> - [RC_TYPE_NEC32] = 0xffffffff,
>> + [RC_TYPE_NEC] = 0xffffffff,
>> [RC_TYPE_SANYO] = 0x1fffff,
>> [RC_TYPE_MCIR2_KBD] = 0xffff,
>> [RC_TYPE_MCIR2_MSE] = 0x1fffff,
>> @@ -759,14 +807,6 @@ static int rc_validate_filter(struct rc_dev *dev,
>> enum rc_type protocol = dev->wakeup_protocol;
>> 
>> switch (protocol) {
>> - case RC_TYPE_NECX:
>> - if ((((s >> 16) ^ ~(s >> 8)) & 0xff) == 0)
>> - return -EINVAL;
>> - break;
>> - case RC_TYPE_NEC32:
>> - if ((((s >> 24) ^ ~(s >> 16)) & 0xff) == 0)
>> - return -EINVAL;
>> - break;
>> case RC_TYPE_RC6_MCE:
>> if ((s & 0xffff0000) != 0x800f0000)
>> return -EINVAL;
>> @@ -865,9 +905,7 @@ static const struct {
>> { RC_BIT_UNKNOWN, "unknown", NULL },
>> { RC_BIT_RC5 |
>> RC_BIT_RC5X_20, "rc-5", "ir-rc5-decoder" },
>> - { RC_BIT_NEC |
>> - RC_BIT_NECX |
>> - RC_BIT_NEC32, "nec", "ir-nec-decoder" },
>> + { RC_BIT_NEC, "nec", "ir-nec-decoder" },
>> { RC_BIT_RC6_0 |
>> RC_BIT_RC6_6A_20 |
>> RC_BIT_RC6_6A_24 |
>> @@ -1330,7 +1368,7 @@ static ssize_t store_filter(struct device *device,
>> /*
>> * This is the list of all variants of all protocols, which is used by
>> * the wakeup_protocols sysfs entry. In the protocols sysfs entry some
>> - * some protocols are grouped together (e.g. nec = nec + necx + nec32).
>> + * some protocols are grouped together.
>> *
>> * For wakeup we need to know the exact protocol variant so the hardware
>> * can be programmed exactly what to expect.
>> @@ -1346,8 +1384,6 @@ static const char * const proto_variant_names[] = {
>> [RC_TYPE_SONY15] = "sony-15",
>> [RC_TYPE_SONY20] = "sony-20",
>> [RC_TYPE_NEC] = "nec",
>> - [RC_TYPE_NECX] = "nec-x",
>> - [RC_TYPE_NEC32] = "nec-32",
>> [RC_TYPE_SANYO] = "sanyo",
>> [RC_TYPE_MCIR2_KBD] = "mcir2-kbd",
>> [RC_TYPE_MCIR2_MSE] = "mcir2-mse",
>> diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c
>> index 5a4d4a611197..914eab8df819 100644
>> --- a/drivers/media/rc/winbond-cir.c
>> +++ b/drivers/media/rc/winbond-cir.c
>> @@ -715,34 +715,6 @@ wbcir_shutdown(struct pnp_dev *device)
>> break;
>> 
>> case RC_TYPE_NEC:
>> - mask[1] = bitrev8(mask_sc);
>> - mask[0] = mask[1];
>> - mask[3] = bitrev8(mask_sc >> 8);
>> - mask[2] = mask[3];
>> -
>> - match[1] = bitrev8(wake_sc);
>> - match[0] = ~match[1];
>> - match[3] = bitrev8(wake_sc >> 8);
>> - match[2] = ~match[3];
>> -
>> - proto = IR_PROTOCOL_NEC;
>> - break;
>> -
>> - case RC_TYPE_NECX:
>> - mask[1] = bitrev8(mask_sc);
>> - mask[0] = mask[1];
>> - mask[2] = bitrev8(mask_sc >> 8);
>> - mask[3] = bitrev8(mask_sc >> 16);
>> -
>> - match[1] = bitrev8(wake_sc);
>> - match[0] = ~match[1];
>> - match[2] = bitrev8(wake_sc >> 8);
>> - match[3] = bitrev8(wake_sc >> 16);
>> -
>> - proto = IR_PROTOCOL_NEC;
>> - break;
>> -
>> - case RC_TYPE_NEC32:
>> mask[0] = bitrev8(mask_sc);
>> mask[1] = bitrev8(mask_sc >> 8);
>> mask[2] = bitrev8(mask_sc >> 16);
>> @@ -1087,8 +1059,8 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
>> data->dev->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
>> data->dev->rx_resolution = US_TO_NS(2);
>> data->dev->allowed_protocols = RC_BIT_ALL_IR_DECODER;
>> - data->dev->allowed_wakeup_protocols = RC_BIT_NEC | RC_BIT_NECX |
>> - RC_BIT_NEC32 | RC_BIT_RC5 | RC_BIT_RC6_0 |
>> + data->dev->allowed_wakeup_protocols =
>> + RC_BIT_NEC | RC_BIT_RC5 | RC_BIT_RC6_0 |
>> RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |
>> RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE;
>> data->dev->wakeup_protocol = RC_TYPE_RC6_MCE;
>> diff --git a/drivers/media/usb/au0828/au0828-input.c b/drivers/media/usb/au0828/au0828-input.c
>> index 9ec919c68482..545741feff2f 100644
>> --- a/drivers/media/usb/au0828/au0828-input.c
>> +++ b/drivers/media/usb/au0828/au0828-input.c
>> @@ -343,8 +343,7 @@ int au0828_rc_register(struct au0828_dev *dev)
>> rc->input_id.product = le16_to_cpu(dev->usbdev->descriptor.idProduct);
>> rc->dev.parent = &dev->usbdev->dev;
>> rc->driver_name = "au0828-input";
>> - rc->allowed_protocols = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32 |
>> - RC_BIT_RC5;
>> + rc->allowed_protocols = RC_BIT_NEC | RC_BIT_RC5;
>> 
>> /* all done */
>> err = rc_register_device(rc);
>> diff --git a/drivers/media/usb/dvb-usb-v2/af9015.c b/drivers/media/usb/dvb-usb-v2/af9015.c
>> index caa1e6101f58..ef1800206ca6 100644
>> --- a/drivers/media/usb/dvb-usb-v2/af9015.c
>> +++ b/drivers/media/usb/dvb-usb-v2/af9015.c
>> @@ -1218,7 +1218,6 @@ static int af9015_rc_query(struct dvb_usb_device *d)
>> 
>> /* Only process key if canary killed */
>> if (buf[16] != 0xff && buf[0] != 0x01) {
>> - enum rc_type proto;
>> dev_dbg(&d->udev->dev, "%s: key pressed %*ph\n",
>> __func__, 4, buf + 12);
>> 
>> @@ -1229,28 +1228,11 @@ static int af9015_rc_query(struct dvb_usb_device *d)
>> 
>> /* Remember this key */
>> memcpy(state->rc_last, &buf[12], 4);
>> - if (buf[14] == (u8) ~buf[15]) {
>> - if (buf[12] == (u8) ~buf[13]) {
>> - /* NEC */
>> - state->rc_keycode = RC_SCANCODE_NEC(buf[12],
>> - buf[14]);
>> - proto = RC_TYPE_NEC;
>> - } else {
>> - /* NEC extended*/
>> - state->rc_keycode = RC_SCANCODE_NECX(buf[12] << 8 |
>> - buf[13],
>> - buf[14]);
>> - proto = RC_TYPE_NECX;
>> - }
>> - } else {
>> - /* 32 bit NEC */
>> - state->rc_keycode = RC_SCANCODE_NEC32(buf[12] << 24 |
>> - buf[13] << 16 |
>> - buf[14] << 8 |
>> - buf[15]);
>> - proto = RC_TYPE_NEC32;
>> - }
>> - rc_keydown(d->rc_dev, proto, state->rc_keycode, 0);
>> + state->rc_keycode = RC_SCANCODE_NEC32(buf[12] << 24 |
>> + buf[13] << 16 |
>> + buf[14] << 8 |
>> + buf[15]);
>> + rc_keydown(d->rc_dev, RC_TYPE_NEC, state->rc_keycode, 0);
>> } else {
>> dev_dbg(&d->udev->dev, "%s: no key press\n", __func__);
>> /* Invalidate last keypress */
>> @@ -1317,7 +1299,7 @@ static int af9015_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc
>> *rc)
>> if (!rc->map_name)
>> rc->map_name = RC_MAP_EMPTY;
>> 
>> - rc->allowed_protos = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32;
>> + rc->allowed_protos = RC_BIT_NEC;
>> rc->query = af9015_rc_query;
>> rc->interval = 500;
>> 
>> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
>> index 4df9486e19b9..ccb2b4c673db 100644
>> --- a/drivers/media/usb/dvb-usb-v2/af9035.c
>> +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
>> @@ -1828,8 +1828,6 @@ static int af9035_rc_query(struct dvb_usb_device *d)
>> {
>> struct usb_interface *intf = d->intf;
>> int ret;
>> - enum rc_type proto;
>> - u32 key;
>> u8 buf[4];
>> struct usb_req req = { CMD_IR_GET, 0, 0, NULL, 4, buf };
>> 
>> @@ -1839,26 +1837,12 @@ static int af9035_rc_query(struct dvb_usb_device *d)
>> else if (ret < 0)
>> goto err;
>> 
>> - if ((buf[2] + buf[3]) == 0xff) {
>> - if ((buf[0] + buf[1]) == 0xff) {
>> - /* NEC standard 16bit */
>> - key = RC_SCANCODE_NEC(buf[0], buf[2]);
>> - proto = RC_TYPE_NEC;
>> - } else {
>> - /* NEC extended 24bit */
>> - key = RC_SCANCODE_NECX(buf[0] << 8 | buf[1], buf[2]);
>> - proto = RC_TYPE_NECX;
>> - }
>> - } else {
>> - /* NEC full code 32bit */
>> - key = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
>> - buf[2] << 8 | buf[3]);
>> - proto = RC_TYPE_NEC32;
>> - }
>> -
>> dev_dbg(&intf->dev, "%*ph\n", 4, buf);
>> 
>> - rc_keydown(d->rc_dev, proto, key, 0);
>> + rc_keydown(d->rc_dev, RC_TYPE_NEC,
>> + RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
>> + buf[2] << 8 | buf[3]),
>> + 0);
>> 
>> return 0;
>> 
>> @@ -1881,8 +1865,7 @@ static int af9035_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc
>> *rc)
>> switch (state->ir_type) {
>> case 0: /* NEC */
>> default:
>> - rc->allowed_protos = RC_BIT_NEC | RC_BIT_NECX |
>> - RC_BIT_NEC32;
>> + rc->allowed_protos = RC_BIT_NEC;
>> break;
>> case 1: /* RC6 */
>> rc->allowed_protos = RC_BIT_RC6_MCE;
>> diff --git a/drivers/media/usb/dvb-usb-v2/az6007.c b/drivers/media/usb/dvb-usb-v2/az6007.c
>> index 50c07fe7dacb..7e3827843042 100644
>> --- a/drivers/media/usb/dvb-usb-v2/az6007.c
>> +++ b/drivers/media/usb/dvb-usb-v2/az6007.c
>> @@ -208,31 +208,18 @@ static int az6007_rc_query(struct dvb_usb_device *d)
>> {
>> struct az6007_device_state *st = d_to_priv(d);
>> unsigned code;
>> - enum rc_type proto;
>> 
>> az6007_read(d, AZ6007_READ_IR, 0, 0, st->data, 10);
>> 
>> if (st->data[1] == 0x44)
>> return 0;
>> 
>> - if ((st->data[3] ^ st->data[4]) == 0xff) {
>> - if ((st->data[1] ^ st->data[2]) == 0xff) {
>> - code = RC_SCANCODE_NEC(st->data[1], st->data[3]);
>> - proto = RC_TYPE_NEC;
>> - } else {
>> - code = RC_SCANCODE_NECX(st->data[1] << 8 | st->data[2],
>> - st->data[3]);
>> - proto = RC_TYPE_NECX;
>> - }
>> - } else {
>> - code = RC_SCANCODE_NEC32(st->data[1] << 24 |
>> - st->data[2] << 16 |
>> - st->data[3] << 8 |
>> - st->data[4]);
>> - proto = RC_TYPE_NEC32;
>> - }
>> + code = RC_SCANCODE_NEC32(st->data[1] << 24 |
>> + st->data[2] << 16 |
>> + st->data[3] << 8 |
>> + st->data[4]);
>> 
>> - rc_keydown(d->rc_dev, proto, code, st->data[5]);
>> + rc_keydown(d->rc_dev, RC_TYPE_NEC, code, st->data[5]);
>> 
>> return 0;
>> }
>> @@ -241,7 +228,7 @@ static int az6007_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc
>> *rc)
>> {
>> pr_debug("Getting az6007 Remote Control properties\n");
>> 
>> - rc->allowed_protos = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32;
>> + rc->allowed_protos = RC_BIT_NEC;
>> rc->query = az6007_rc_query;
>> rc->interval = 400;
>> 
>> diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c
>> index 924adfdb660d..860e9cf2ee4e 100644
>> --- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
>> +++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
>> @@ -349,8 +349,7 @@ static void lme2510_int_response(struct urb *lme_urb)
>> ibuf[5]);
>> 
>> deb_info(1, "INT Key = 0x%08x", key);
>> - rc_keydown(adap_to_d(adap)->rc_dev, RC_TYPE_NEC32, key,
>> - 0);
>> + rc_keydown(adap_to_d(adap)->rc_dev, RC_TYPE_NEC, key, 0);
>> break;
>> case 0xbb:
>> switch (st->tuner_config) {
>> @@ -1233,7 +1232,7 @@ static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
>> static int lme2510_get_rc_config(struct dvb_usb_device *d,
>> struct dvb_usb_rc *rc)
>> {
>> - rc->allowed_protos = RC_BIT_NEC32;
>> + rc->allowed_protos = RC_BIT_NEC;
>> return 0;
>> }
>> 
>> diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> index e16ca07acf1d..06219abaef7b 100644
>> --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
>> @@ -1597,7 +1597,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
>> int ret, i;
>> struct rtl28xxu_dev *dev = d->priv;
>> u8 buf[5];
>> - u32 rc_code;
>> + u64 rc_code;
>> struct rtl28xxu_reg_val rc_nec_tab[] = {
>> { 0x3033, 0x80 },
>> { 0x3020, 0x43 },
>> @@ -1631,27 +1631,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
>> goto err;
>> 
>> if (buf[4] & 0x01) {
>> - enum rc_type proto;
>> + rc_code = RC_SCANCODE_NEC32(buf[0] << 24 |
>> + buf[1] << 16 |
>> + buf[2] << 8 |
>> + buf[3]);
>> 
>> - if (buf[2] == (u8) ~buf[3]) {
>> - if (buf[0] == (u8) ~buf[1]) {
>> - /* NEC standard (16 bit) */
>> - rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
>> - proto = RC_TYPE_NEC;
>> - } else {
>> - /* NEC extended (24 bit) */
>> - rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
>> - buf[2]);
>> - proto = RC_TYPE_NECX;
>> - }
>> - } else {
>> - /* NEC full (32 bit) */
>> - rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
>> - buf[2] << 8 | buf[3]);
>> - proto = RC_TYPE_NEC32;
>> - }
>> -
>> - rc_keydown(d->rc_dev, proto, rc_code, 0);
>> + rc_keydown(d->rc_dev, RC_TYPE_NEC, rc_code, 0);
>> 
>> ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
>> if (ret)
>> @@ -1673,7 +1658,7 @@ static int rtl2831u_get_rc_config(struct dvb_usb_device *d,
>> struct dvb_usb_rc *rc)
>> {
>> rc->map_name = RC_MAP_EMPTY;
>> - rc->allowed_protos = RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32;
>> + rc->allowed_protos = RC_BIT_NEC;
>> rc->query = rtl2831u_rc_query;
>> rc->interval = 400;
>> 
>> diff --git a/drivers/media/usb/dvb-usb/dib0700_core.c b/drivers/media/usb/dvb-usb/dib0700_core.c
>> index 08acdd32e412..3267bc7ea9c5 100644
>> --- a/drivers/media/usb/dvb-usb/dib0700_core.c
>> +++ b/drivers/media/usb/dvb-usb/dib0700_core.c
>> @@ -734,6 +734,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)
>> 
>> switch (d->props.rc.core.protocol) {
>> case RC_BIT_NEC:
>> + protocol = RC_TYPE_NEC;
>> toggle = 0;
>> 
>> /* NEC protocol sends repeat code as 0 0 0 FF */
>> @@ -746,26 +747,10 @@ static void dib0700_rc_urb_completion(struct urb *purb)
>> goto resubmit;
>> }
>> 
>> - if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
>> - deb_data("NEC32 protocol\n");
>> - keycode = RC_SCANCODE_NEC32(poll_reply->nec.system << 24 |
>> - poll_reply->nec.not_system << 16 |
>> - poll_reply->nec.data << 8 |
>> - poll_reply->nec.not_data);
>> - protocol = RC_TYPE_NEC32;
>> - } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
>> - deb_data("NEC extended protocol\n");
>> - keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
>> - poll_reply->nec.not_system,
>> - poll_reply->nec.data);
>> -
>> - protocol = RC_TYPE_NECX;
>> - } else {
>> - deb_data("NEC normal protocol\n");
>> - keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
>> - poll_reply->nec.data);
>> - protocol = RC_TYPE_NEC;
>> - }
>> + keycode = RC_SCANCODE_NEC32(poll_reply->nec.system << 24 |
>> + poll_reply->nec.not_system << 16 |
>> + poll_reply->nec.data << 8 |
>> + poll_reply->nec.not_data);
>> 
>> break;
>> default:
>> diff --git a/drivers/media/usb/dvb-usb/dtt200u.c b/drivers/media/usb/dvb-usb/dtt200u.c
>> index fcbff7fb0c4e..ffe987f72590 100644
>> --- a/drivers/media/usb/dvb-usb/dtt200u.c
>> +++ b/drivers/media/usb/dvb-usb/dtt200u.c
>> @@ -89,7 +89,6 @@ static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
>> static int dtt200u_rc_query(struct dvb_usb_device *d)
>> {
>> struct dtt200u_state *st = d->priv;
>> - u32 scancode;
>> int ret;
>> 
>> mutex_lock(&d->data_mutex);
>> @@ -100,23 +99,13 @@ static int dtt200u_rc_query(struct dvb_usb_device *d)
>> goto ret;
>> 
>> if (st->data[0] == 1) {
>> - enum rc_type proto = RC_TYPE_NEC;
>> -
>> - scancode = st->data[1];
>> - if ((u8) ~st->data[1] != st->data[2]) {
>> - /* Extended NEC */
>> - scancode = scancode << 8;
>> - scancode |= st->data[2];
>> - proto = RC_TYPE_NECX;
>> - }
>> - scancode = scancode << 8;
>> - scancode |= st->data[3];
>> -
>> - /* Check command checksum is ok */
>> - if ((u8) ~st->data[3] == st->data[4])
>> - rc_keydown(d->rc_dev, proto, scancode, 0);
>> - else
>> - rc_keyup(d->rc_dev);
>> + u32 scancode;
>> +
>> + scancode = RC_SCANCODE_NEC32((st->data[1] << 24) |
>> + (st->data[2] << 16) |
>> + (st->data[3] << 8) |
>> + (st->data[4] << 0));
>> + rc_keydown(d->rc_dev, RC_TYPE_NEC, scancode, 0);
>> } else if (st->data[0] == 2) {
>> rc_repeat(d->rc_dev);
>> } else {
>> diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
>> index eba75736e654..93c3fca7849a 100644
>> --- a/drivers/media/usb/em28xx/em28xx-input.c
>> +++ b/drivers/media/usb/em28xx/em28xx-input.c
>> @@ -259,21 +259,11 @@ static int em2874_polling_getkey(struct em28xx_IR *ir,
>> break;
>> 
>> case RC_BIT_NEC:
>> - poll_result->scancode = msg[1] << 8 | msg[2];
>> - if ((msg[3] ^ msg[4]) != 0xff) { /* 32 bits NEC */
>> - poll_result->protocol = RC_TYPE_NEC32;
>> - poll_result->scancode = RC_SCANCODE_NEC32((msg[1] << 24) |
>> - (msg[2] << 16) |
>> - (msg[3] << 8) |
>> - (msg[4]));
>> - } else if ((msg[1] ^ msg[2]) != 0xff) { /* 24 bits NEC */
>> - poll_result->protocol = RC_TYPE_NECX;
>> - poll_result->scancode = RC_SCANCODE_NECX(msg[1] << 8 |
>> - msg[2], msg[3]);
>> - } else { /* Normal NEC */
>> - poll_result->protocol = RC_TYPE_NEC;
>> - poll_result->scancode = RC_SCANCODE_NEC(msg[1], msg[3]);
>> - }
>> + poll_result->protocol = RC_TYPE_NEC;
>> + poll_result->scancode = RC_SCANCODE_NEC32((msg[1] << 24) |
>> + (msg[2] << 16) |
>> + (msg[3] << 8) |
>> + (msg[4]));
>> break;
>> 
>> case RC_BIT_RC6_0:
>> @@ -780,7 +770,7 @@ static int em28xx_ir_init(struct em28xx *dev)
>> case CHIP_ID_EM28178:
>> ir->get_key = em2874_polling_getkey;
>> rc->allowed_protocols = RC_BIT_RC5 | RC_BIT_NEC |
>> - RC_BIT_NECX | RC_BIT_NEC32 | RC_BIT_RC6_0;
>> + RC_BIT_RC6_0;
>> break;
>> default:
>> err = -ENODEV;
>> diff --git a/include/media/rc-map.h b/include/media/rc-map.h
>> index 1a815a572fa1..e5d0559dc523 100644
>> --- a/include/media/rc-map.h
>> +++ b/include/media/rc-map.h
>> @@ -24,8 +24,6 @@
>> * @RC_TYPE_SONY15: Sony 15 bit protocol
>> * @RC_TYPE_SONY20: Sony 20 bit protocol
>> * @RC_TYPE_NEC: NEC protocol
>> - * @RC_TYPE_NECX: Extended NEC protocol
>> - * @RC_TYPE_NEC32: NEC 32 bit protocol
>> * @RC_TYPE_SANYO: Sanyo protocol
>> * @RC_TYPE_MCIR2_KBD: RC6-ish MCE keyboard
>> * @RC_TYPE_MCIR2_MSE: RC6-ish MCE mouse
>> @@ -49,21 +47,20 @@ enum rc_type {
>> RC_TYPE_SONY15 = 7,
>> RC_TYPE_SONY20 = 8,
>> RC_TYPE_NEC = 9,
>> - RC_TYPE_NECX = 10,
>> - RC_TYPE_NEC32 = 11,
>> - RC_TYPE_SANYO = 12,
>> - RC_TYPE_MCIR2_KBD = 13,
>> - RC_TYPE_MCIR2_MSE = 14,
>> - RC_TYPE_RC6_0 = 15,
>> - RC_TYPE_RC6_6A_20 = 16,
>> - RC_TYPE_RC6_6A_24 = 17,
>> - RC_TYPE_RC6_6A_32 = 18,
>> - RC_TYPE_RC6_MCE = 19,
>> - RC_TYPE_SHARP = 20,
>> - RC_TYPE_XMP = 21,
>> - RC_TYPE_CEC = 22,
>> + RC_TYPE_SANYO = 10,
>> + RC_TYPE_MCIR2_KBD = 11,
>> + RC_TYPE_MCIR2_MSE = 12,
>> + RC_TYPE_RC6_0 = 13,
>> + RC_TYPE_RC6_6A_20 = 14,
>> + RC_TYPE_RC6_6A_24 = 15,
>> + RC_TYPE_RC6_6A_32 = 16,
>> + RC_TYPE_RC6_MCE = 17,
>> + RC_TYPE_SHARP = 18,
>> + RC_TYPE_XMP = 19,
>> + RC_TYPE_CEC = 20,
>> };
>> 
>> +#define rc_bitmap_to_type(x) (fls64(x) - 1)
>> #define RC_BIT_NONE 0ULL
>> #define RC_BIT_UNKNOWN BIT_ULL(RC_TYPE_UNKNOWN)
>> #define RC_BIT_OTHER BIT_ULL(RC_TYPE_OTHER)
>> @@ -75,8 +72,6 @@ enum rc_type {
>> #define RC_BIT_SONY15 BIT_ULL(RC_TYPE_SONY15)
>> #define RC_BIT_SONY20 BIT_ULL(RC_TYPE_SONY20)
>> #define RC_BIT_NEC BIT_ULL(RC_TYPE_NEC)
>> -#define RC_BIT_NECX BIT_ULL(RC_TYPE_NECX)
>> -#define RC_BIT_NEC32 BIT_ULL(RC_TYPE_NEC32)
>> #define RC_BIT_SANYO BIT_ULL(RC_TYPE_SANYO)
>> #define RC_BIT_MCIR2_KBD BIT_ULL(RC_TYPE_MCIR2_KBD)
>> #define RC_BIT_MCIR2_MSE BIT_ULL(RC_TYPE_MCIR2_MSE)
>> @@ -93,7 +88,7 @@ enum rc_type {
>> RC_BIT_RC5 | RC_BIT_RC5X_20 | RC_BIT_RC5_SZ | \
>> RC_BIT_JVC | \
>> RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20 | \
>> - RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32 | \
>> + RC_BIT_NEC | \
>> RC_BIT_SANYO | \
>> RC_BIT_MCIR2_KBD | RC_BIT_MCIR2_MSE | \
>> RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | \
>> @@ -104,7 +99,7 @@ enum rc_type {
>> (RC_BIT_RC5 | RC_BIT_RC5X_20 | RC_BIT_RC5_SZ | \
>> RC_BIT_JVC | \
>> RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20 | \
>> - RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32 | \
>> + RC_BIT_NEC | \
>> RC_BIT_SANYO | RC_BIT_MCIR2_KBD | RC_BIT_MCIR2_MSE | \
>> RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | \
>> RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | RC_BIT_SHARP | \
>> @@ -114,7 +109,7 @@ enum rc_type {
>> (RC_BIT_RC5 | RC_BIT_RC5X_20 | RC_BIT_RC5_SZ | \
>> RC_BIT_JVC | \
>> RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20 | \
>> - RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32 | \
>> + RC_BIT_NEC | \
>> RC_BIT_SANYO | RC_BIT_MCIR2_KBD | RC_BIT_MCIR2_MSE | \
>> RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | \
>> RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | \
>> @@ -122,13 +117,20 @@ enum rc_type {
>> 
>> #define RC_SCANCODE_UNKNOWN(x) (x)
>> #define RC_SCANCODE_OTHER(x) (x)
>> -#define RC_SCANCODE_NEC(addr, cmd) (((addr) << 8) | (cmd))
>> -#define RC_SCANCODE_NECX(addr, cmd) (((addr) << 8) | (cmd))
>> -#define RC_SCANCODE_NEC32(data) ((data) & 0xffffffff)
>> #define RC_SCANCODE_RC5(sys, cmd) (((sys) << 8) | (cmd))
>> #define RC_SCANCODE_RC5_SZ(sys, cmd) (((sys) << 8) | (cmd))
>> #define RC_SCANCODE_RC6_0(sys, cmd) (((sys) << 8) | (cmd))
>> #define RC_SCANCODE_RC6_6A(vendor, sys, cmd) (((vendor) << 16) | ((sys) << 8) | (cmd))
>> +#define RC_SCANCODE_NEC(addr, cmd) \
>> + ((((addr) & 0xff) << 24) | \
>> + ((~(addr) & 0xff) << 16) | \
>> + (((cmd) & 0xff) << 8 ) | \
>> + ((~(cmd) & 0xff) << 0 ))
>> +#define RC_SCANCODE_NECX(addr, cmd) \
>> + ((((addr) & 0xffff) << 16) | \
>> + (((cmd) & 0x00ff) << 8) | \
>> + ((~(cmd) & 0x00ff) << 0))
>> +#define RC_SCANCODE_NEC32(data) ((data) & 0xffffffff)
>> 
>> /**
>> * struct rc_map_table - represents a scancode/keycode pair




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux