1 /* ir-nec-decoder.c - handle NEC IR Pulse/Space protocol 2 * 3 * Copyright (C) 2010 by Mauro Carvalho Chehab 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation version 2 of the License. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 15 #include <linux/bitrev.h> 16 #include <linux/module.h> 17 #include "rc-core-priv.h" 18 19 #define NEC_NBITS 32 20 #define NEC_UNIT 562500 /* ns */ 21 #define NEC_HEADER_PULSE (16 * NEC_UNIT) 22 #define NECX_HEADER_PULSE (8 * NEC_UNIT) /* Less common NEC variant */ 23 #define NEC_HEADER_SPACE (8 * NEC_UNIT) 24 #define NEC_REPEAT_SPACE (4 * NEC_UNIT) 25 #define NEC_BIT_PULSE (1 * NEC_UNIT) 26 #define NEC_BIT_0_SPACE (1 * NEC_UNIT) 27 #define NEC_BIT_1_SPACE (3 * NEC_UNIT) 28 #define NEC_TRAILER_PULSE (1 * NEC_UNIT) 29 #define NEC_TRAILER_SPACE (10 * NEC_UNIT) /* even longer in reality */ 30 #define NECX_REPEAT_BITS 1 31 32 enum nec_state { 33 STATE_INACTIVE, 34 STATE_HEADER_SPACE, 35 STATE_BIT_PULSE, 36 STATE_BIT_SPACE, 37 STATE_TRAILER_PULSE, 38 STATE_TRAILER_SPACE, 39 }; 40 41 /** 42 * ir_nec_decode() - Decode one NEC pulse or space 43 * @dev: the struct rc_dev descriptor of the device 44 * @duration: the struct ir_raw_event descriptor of the pulse/space 45 * 46 * This function returns -EINVAL if the pulse violates the state machine 47 */ 48 static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) 49 { 50 struct nec_dec *data = &dev->raw->nec; 51 u32 scancode; 52 enum rc_proto rc_proto; 53 u8 address, not_address, command, not_command; 54 55 if (!is_timing_event(ev)) { 56 if (ev.reset) 57 data->state = STATE_INACTIVE; 58 return 0; 59 } 60 61 IR_dprintk(2, "NEC decode started at state %d (%uus %s)\n", 62 data->state, TO_US(ev.duration), TO_STR(ev.pulse)); 63 64 switch (data->state) { 65 66 case STATE_INACTIVE: 67 if (!ev.pulse) 68 break; 69 70 if (eq_margin(ev.duration, NEC_HEADER_PULSE, NEC_UNIT * 2)) { 71 data->is_nec_x = false; 72 data->necx_repeat = false; 73 } else if (eq_margin(ev.duration, NECX_HEADER_PULSE, NEC_UNIT / 2)) 74 data->is_nec_x = true; 75 else 76 break; 77 78 data->count = 0; 79 data->state = STATE_HEADER_SPACE; 80 return 0; 81 82 case STATE_HEADER_SPACE: 83 if (ev.pulse) 84 break; 85 86 if (eq_margin(ev.duration, NEC_HEADER_SPACE, NEC_UNIT)) { 87 data->state = STATE_BIT_PULSE; 88 return 0; 89 } else if (eq_margin(ev.duration, NEC_REPEAT_SPACE, NEC_UNIT / 2)) { 90 rc_repeat(dev); 91 IR_dprintk(1, "Repeat last key\n"); 92 data->state = STATE_TRAILER_PULSE; 93 return 0; 94 } 95 96 break; 97 98 case STATE_BIT_PULSE: 99 if (!ev.pulse) 100 break; 101 102 if (!eq_margin(ev.duration, NEC_BIT_PULSE, NEC_UNIT / 2)) 103 break; 104 105 data->state = STATE_BIT_SPACE; 106 return 0; 107 108 case STATE_BIT_SPACE: 109 if (ev.pulse) 110 break; 111 112 if (data->necx_repeat && data->count == NECX_REPEAT_BITS && 113 geq_margin(ev.duration, 114 NEC_TRAILER_SPACE, NEC_UNIT / 2)) { 115 IR_dprintk(1, "Repeat last key\n"); 116 rc_repeat(dev); 117 data->state = STATE_INACTIVE; 118 return 0; 119 120 } else if (data->count > NECX_REPEAT_BITS) 121 data->necx_repeat = false; 122 123 data->bits <<= 1; 124 if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2)) 125 data->bits |= 1; 126 else if (!eq_margin(ev.duration, NEC_BIT_0_SPACE, NEC_UNIT / 2)) 127 break; 128 data->count++; 129 130 if (data->count == NEC_NBITS) 131 data->state = STATE_TRAILER_PULSE; 132 else 133 data->state = STATE_BIT_PULSE; 134 135 return 0; 136 137 case STATE_TRAILER_PULSE: 138 if (!ev.pulse) 139 break; 140 141 if (!eq_margin(ev.duration, NEC_TRAILER_PULSE, NEC_UNIT / 2)) 142 break; 143 144 data->state = STATE_TRAILER_SPACE; 145 return 0; 146 147 case STATE_TRAILER_SPACE: 148 if (ev.pulse) 149 break; 150 151 if (!geq_margin(ev.duration, NEC_TRAILER_SPACE, NEC_UNIT / 2)) 152 break; 153 154 address = bitrev8((data->bits >> 24) & 0xff); 155 not_address = bitrev8((data->bits >> 16) & 0xff); 156 command = bitrev8((data->bits >> 8) & 0xff); 157 not_command = bitrev8((data->bits >> 0) & 0xff); 158 159 scancode = ir_nec_bytes_to_scancode(address, not_address, 160 command, not_command, 161 &rc_proto); 162 163 if (data->is_nec_x) 164 data->necx_repeat = true; 165 166 rc_keydown(dev, rc_proto, scancode, 0); 167 data->state = STATE_INACTIVE; 168 return 0; 169 } 170 171 IR_dprintk(1, "NEC decode failed at count %d state %d (%uus %s)\n", 172 data->count, data->state, TO_US(ev.duration), TO_STR(ev.pulse)); 173 data->state = STATE_INACTIVE; 174 return -EINVAL; 175 } 176 177 /** 178 * ir_nec_scancode_to_raw() - encode an NEC scancode ready for modulation. 179 * @protocol: specific protocol to use 180 * @scancode: a single NEC scancode. 181 * @raw: raw data to be modulated. 182 */ 183 static u32 ir_nec_scancode_to_raw(enum rc_proto protocol, u32 scancode) 184 { 185 unsigned int addr, addr_inv, data, data_inv; 186 187 data = scancode & 0xff; 188 189 if (protocol == RC_PROTO_NEC32) { 190 /* 32-bit NEC (used by Apple and TiVo remotes) */ 191 /* scan encoding: aaAAddDD */ 192 addr_inv = (scancode >> 24) & 0xff; 193 addr = (scancode >> 16) & 0xff; 194 data_inv = (scancode >> 8) & 0xff; 195 } else if (protocol == RC_PROTO_NECX) { 196 /* Extended NEC */ 197 /* scan encoding AAaaDD */ 198 addr = (scancode >> 16) & 0xff; 199 addr_inv = (scancode >> 8) & 0xff; 200 data_inv = data ^ 0xff; 201 } else { 202 /* Normal NEC */ 203 /* scan encoding: AADD */ 204 addr = (scancode >> 8) & 0xff; 205 addr_inv = addr ^ 0xff; 206 data_inv = data ^ 0xff; 207 } 208 209 /* raw encoding: ddDDaaAA */ 210 return data_inv << 24 | 211 data << 16 | 212 addr_inv << 8 | 213 addr; 214 } 215 216 static const struct ir_raw_timings_pd ir_nec_timings = { 217 .header_pulse = NEC_HEADER_PULSE, 218 .header_space = NEC_HEADER_SPACE, 219 .bit_pulse = NEC_BIT_PULSE, 220 .bit_space[0] = NEC_BIT_0_SPACE, 221 .bit_space[1] = NEC_BIT_1_SPACE, 222 .trailer_pulse = NEC_TRAILER_PULSE, 223 .trailer_space = NEC_TRAILER_SPACE, 224 .msb_first = 0, 225 }; 226 227 /** 228 * ir_nec_encode() - Encode a scancode as a stream of raw events 229 * 230 * @protocol: protocol to encode 231 * @scancode: scancode to encode 232 * @events: array of raw ir events to write into 233 * @max: maximum size of @events 234 * 235 * Returns: The number of events written. 236 * -ENOBUFS if there isn't enough space in the array to fit the 237 * encoding. In this case all @max events will have been written. 238 */ 239 static int ir_nec_encode(enum rc_proto protocol, u32 scancode, 240 struct ir_raw_event *events, unsigned int max) 241 { 242 struct ir_raw_event *e = events; 243 int ret; 244 u32 raw; 245 246 /* Convert a NEC scancode to raw NEC data */ 247 raw = ir_nec_scancode_to_raw(protocol, scancode); 248 249 /* Modulate the raw data using a pulse distance modulation */ 250 ret = ir_raw_gen_pd(&e, max, &ir_nec_timings, NEC_NBITS, raw); 251 if (ret < 0) 252 return ret; 253 254 return e - events; 255 } 256 257 static struct ir_raw_handler nec_handler = { 258 .protocols = RC_PROTO_BIT_NEC | RC_PROTO_BIT_NECX | 259 RC_PROTO_BIT_NEC32, 260 .decode = ir_nec_decode, 261 .encode = ir_nec_encode, 262 }; 263 264 static int __init ir_nec_decode_init(void) 265 { 266 ir_raw_handler_register(&nec_handler); 267 268 printk(KERN_INFO "IR NEC protocol handler initialized\n"); 269 return 0; 270 } 271 272 static void __exit ir_nec_decode_exit(void) 273 { 274 ir_raw_handler_unregister(&nec_handler); 275 } 276 277 module_init(ir_nec_decode_init); 278 module_exit(ir_nec_decode_exit); 279 280 MODULE_LICENSE("GPL"); 281 MODULE_AUTHOR("Mauro Carvalho Chehab"); 282 MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)"); 283 MODULE_DESCRIPTION("NEC IR protocol decoder"); 284