| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* ir-mce_kbd-decoder.c - A decoder for the RC6-ish keyboard/mouse IR protocol |
|---|
| 2 | 3 | * used by the Microsoft Remote Keyboard for Windows Media Center Edition, |
|---|
| 3 | 4 | * referred to by Microsoft's Windows Media Center remote specification docs |
|---|
| 4 | 5 | * as "an internal protocol called MCIR-2". |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Copyright (C) 2011 by Jarod Wilson <jarod@redhat.com> |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 9 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 10 | | - * the Free Software Foundation version 2 of the License. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 13 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 14 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 15 | | - * GNU General Public License for more details. |
|---|
| 16 | 8 | */ |
|---|
| 17 | 9 | #include <linux/module.h> |
|---|
| 18 | 10 | |
|---|
| .. | .. |
|---|
| 29 | 21 | * input device for the remote, rather than the keyboard/mouse one. |
|---|
| 30 | 22 | */ |
|---|
| 31 | 23 | |
|---|
| 32 | | -#define MCIR2_UNIT 333333 /* ns */ |
|---|
| 24 | +#define MCIR2_UNIT 333 /* us */ |
|---|
| 33 | 25 | #define MCIR2_HEADER_NBITS 5 |
|---|
| 34 | 26 | #define MCIR2_MOUSE_NBITS 29 |
|---|
| 35 | 27 | #define MCIR2_KEYBOARD_NBITS 32 |
|---|
| .. | .. |
|---|
| 129 | 121 | if (time_is_before_eq_jiffies(raw->mce_kbd.rx_timeout.expires)) { |
|---|
| 130 | 122 | for (i = 0; i < 7; i++) { |
|---|
| 131 | 123 | maskcode = kbd_keycodes[MCIR2_MASK_KEYS_START + i]; |
|---|
| 132 | | - input_report_key(raw->mce_kbd.idev, maskcode, 0); |
|---|
| 124 | + input_report_key(raw->dev->input_dev, maskcode, 0); |
|---|
| 133 | 125 | } |
|---|
| 134 | 126 | |
|---|
| 135 | 127 | for (i = 0; i < MCIR2_MASK_KEYS_START; i++) |
|---|
| 136 | | - input_report_key(raw->mce_kbd.idev, kbd_keycodes[i], 0); |
|---|
| 128 | + input_report_key(raw->dev->input_dev, kbd_keycodes[i], |
|---|
| 129 | + 0); |
|---|
| 137 | 130 | |
|---|
| 138 | | - input_sync(raw->mce_kbd.idev); |
|---|
| 131 | + input_sync(raw->dev->input_dev); |
|---|
| 139 | 132 | } |
|---|
| 140 | 133 | spin_unlock_irqrestore(&raw->mce_kbd.keylock, flags); |
|---|
| 141 | 134 | } |
|---|
| .. | .. |
|---|
| 154 | 147 | |
|---|
| 155 | 148 | static void ir_mce_kbd_process_keyboard_data(struct rc_dev *dev, u32 scancode) |
|---|
| 156 | 149 | { |
|---|
| 157 | | - struct mce_kbd_dec *data = &dev->raw->mce_kbd; |
|---|
| 158 | 150 | u8 keydata1 = (scancode >> 8) & 0xff; |
|---|
| 159 | 151 | u8 keydata2 = (scancode >> 16) & 0xff; |
|---|
| 160 | 152 | u8 shiftmask = scancode & 0xff; |
|---|
| .. | .. |
|---|
| 170 | 162 | keystate = 1; |
|---|
| 171 | 163 | else |
|---|
| 172 | 164 | keystate = 0; |
|---|
| 173 | | - input_report_key(data->idev, maskcode, keystate); |
|---|
| 165 | + input_report_key(dev->input_dev, maskcode, keystate); |
|---|
| 174 | 166 | } |
|---|
| 175 | 167 | |
|---|
| 176 | 168 | if (keydata1) |
|---|
| 177 | | - input_report_key(data->idev, kbd_keycodes[keydata1], 1); |
|---|
| 169 | + input_report_key(dev->input_dev, kbd_keycodes[keydata1], 1); |
|---|
| 178 | 170 | if (keydata2) |
|---|
| 179 | | - input_report_key(data->idev, kbd_keycodes[keydata2], 1); |
|---|
| 171 | + input_report_key(dev->input_dev, kbd_keycodes[keydata2], 1); |
|---|
| 180 | 172 | |
|---|
| 181 | 173 | if (!keydata1 && !keydata2) { |
|---|
| 182 | 174 | for (i = 0; i < MCIR2_MASK_KEYS_START; i++) |
|---|
| 183 | | - input_report_key(data->idev, kbd_keycodes[i], 0); |
|---|
| 175 | + input_report_key(dev->input_dev, kbd_keycodes[i], 0); |
|---|
| 184 | 176 | } |
|---|
| 185 | 177 | } |
|---|
| 186 | 178 | |
|---|
| 187 | 179 | static void ir_mce_kbd_process_mouse_data(struct rc_dev *dev, u32 scancode) |
|---|
| 188 | 180 | { |
|---|
| 189 | | - struct mce_kbd_dec *data = &dev->raw->mce_kbd; |
|---|
| 190 | 181 | /* raw mouse coordinates */ |
|---|
| 191 | 182 | u8 xdata = (scancode >> 7) & 0x7f; |
|---|
| 192 | 183 | u8 ydata = (scancode >> 14) & 0x7f; |
|---|
| .. | .. |
|---|
| 208 | 199 | dev_dbg(&dev->dev, "mouse: x = %d, y = %d, btns = %s%s\n", |
|---|
| 209 | 200 | x, y, left ? "L" : "", right ? "R" : ""); |
|---|
| 210 | 201 | |
|---|
| 211 | | - input_report_rel(data->idev, REL_X, x); |
|---|
| 212 | | - input_report_rel(data->idev, REL_Y, y); |
|---|
| 202 | + input_report_rel(dev->input_dev, REL_X, x); |
|---|
| 203 | + input_report_rel(dev->input_dev, REL_Y, y); |
|---|
| 213 | 204 | |
|---|
| 214 | | - input_report_key(data->idev, BTN_LEFT, left); |
|---|
| 215 | | - input_report_key(data->idev, BTN_RIGHT, right); |
|---|
| 205 | + input_report_key(dev->input_dev, BTN_LEFT, left); |
|---|
| 206 | + input_report_key(dev->input_dev, BTN_RIGHT, right); |
|---|
| 216 | 207 | } |
|---|
| 217 | 208 | |
|---|
| 218 | 209 | /** |
|---|
| .. | .. |
|---|
| 240 | 231 | |
|---|
| 241 | 232 | again: |
|---|
| 242 | 233 | dev_dbg(&dev->dev, "started at state %i (%uus %s)\n", |
|---|
| 243 | | - data->state, TO_US(ev.duration), TO_STR(ev.pulse)); |
|---|
| 234 | + data->state, ev.duration, TO_STR(ev.pulse)); |
|---|
| 244 | 235 | |
|---|
| 245 | 236 | if (!geq_margin(ev.duration, MCIR2_UNIT, MCIR2_UNIT / 2)) |
|---|
| 246 | 237 | return 0; |
|---|
| .. | .. |
|---|
| 329 | 320 | data->body); |
|---|
| 330 | 321 | spin_lock(&data->keylock); |
|---|
| 331 | 322 | if (scancode) { |
|---|
| 332 | | - delay = nsecs_to_jiffies(dev->timeout) + |
|---|
| 323 | + delay = usecs_to_jiffies(dev->timeout) + |
|---|
| 333 | 324 | msecs_to_jiffies(100); |
|---|
| 334 | 325 | mod_timer(&data->rx_timeout, jiffies + delay); |
|---|
| 335 | 326 | } else { |
|---|
| .. | .. |
|---|
| 353 | 344 | } |
|---|
| 354 | 345 | |
|---|
| 355 | 346 | lsc.scancode = scancode; |
|---|
| 356 | | - ir_lirc_scancode_event(dev, &lsc); |
|---|
| 347 | + lirc_scancode_event(dev, &lsc); |
|---|
| 357 | 348 | data->state = STATE_INACTIVE; |
|---|
| 358 | | - input_event(data->idev, EV_MSC, MSC_SCAN, scancode); |
|---|
| 359 | | - input_sync(data->idev); |
|---|
| 349 | + input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode); |
|---|
| 350 | + input_sync(dev->input_dev); |
|---|
| 360 | 351 | return 0; |
|---|
| 361 | 352 | } |
|---|
| 362 | 353 | |
|---|
| 363 | 354 | out: |
|---|
| 364 | 355 | dev_dbg(&dev->dev, "failed at state %i (%uus %s)\n", |
|---|
| 365 | | - data->state, TO_US(ev.duration), TO_STR(ev.pulse)); |
|---|
| 356 | + data->state, ev.duration, TO_STR(ev.pulse)); |
|---|
| 366 | 357 | data->state = STATE_INACTIVE; |
|---|
| 367 | 358 | return -EINVAL; |
|---|
| 368 | 359 | } |
|---|
| .. | .. |
|---|
| 370 | 361 | static int ir_mce_kbd_register(struct rc_dev *dev) |
|---|
| 371 | 362 | { |
|---|
| 372 | 363 | struct mce_kbd_dec *mce_kbd = &dev->raw->mce_kbd; |
|---|
| 373 | | - struct input_dev *idev; |
|---|
| 374 | | - int i, ret; |
|---|
| 375 | | - |
|---|
| 376 | | - idev = input_allocate_device(); |
|---|
| 377 | | - if (!idev) |
|---|
| 378 | | - return -ENOMEM; |
|---|
| 379 | | - |
|---|
| 380 | | - snprintf(mce_kbd->name, sizeof(mce_kbd->name), |
|---|
| 381 | | - "MCE IR Keyboard/Mouse (%s)", dev->driver_name); |
|---|
| 382 | | - strlcat(mce_kbd->phys, "/input0", sizeof(mce_kbd->phys)); |
|---|
| 383 | | - |
|---|
| 384 | | - idev->name = mce_kbd->name; |
|---|
| 385 | | - idev->phys = mce_kbd->phys; |
|---|
| 386 | | - |
|---|
| 387 | | - /* Keyboard bits */ |
|---|
| 388 | | - set_bit(EV_KEY, idev->evbit); |
|---|
| 389 | | - set_bit(EV_REP, idev->evbit); |
|---|
| 390 | | - for (i = 0; i < sizeof(kbd_keycodes); i++) |
|---|
| 391 | | - set_bit(kbd_keycodes[i], idev->keybit); |
|---|
| 392 | | - |
|---|
| 393 | | - /* Mouse bits */ |
|---|
| 394 | | - set_bit(EV_REL, idev->evbit); |
|---|
| 395 | | - set_bit(REL_X, idev->relbit); |
|---|
| 396 | | - set_bit(REL_Y, idev->relbit); |
|---|
| 397 | | - set_bit(BTN_LEFT, idev->keybit); |
|---|
| 398 | | - set_bit(BTN_RIGHT, idev->keybit); |
|---|
| 399 | | - |
|---|
| 400 | | - /* Report scancodes too */ |
|---|
| 401 | | - set_bit(EV_MSC, idev->evbit); |
|---|
| 402 | | - set_bit(MSC_SCAN, idev->mscbit); |
|---|
| 403 | 364 | |
|---|
| 404 | 365 | timer_setup(&mce_kbd->rx_timeout, mce_kbd_rx_timeout, 0); |
|---|
| 405 | 366 | spin_lock_init(&mce_kbd->keylock); |
|---|
| 406 | | - |
|---|
| 407 | | - input_set_drvdata(idev, mce_kbd); |
|---|
| 408 | | - |
|---|
| 409 | | -#if 0 |
|---|
| 410 | | - /* Adding this reference means two input devices are associated with |
|---|
| 411 | | - * this rc-core device, which ir-keytable doesn't cope with yet */ |
|---|
| 412 | | - idev->dev.parent = &dev->dev; |
|---|
| 413 | | -#endif |
|---|
| 414 | | - |
|---|
| 415 | | - ret = input_register_device(idev); |
|---|
| 416 | | - if (ret < 0) { |
|---|
| 417 | | - input_free_device(idev); |
|---|
| 418 | | - return -EIO; |
|---|
| 419 | | - } |
|---|
| 420 | | - |
|---|
| 421 | | - mce_kbd->idev = idev; |
|---|
| 422 | 367 | |
|---|
| 423 | 368 | return 0; |
|---|
| 424 | 369 | } |
|---|
| .. | .. |
|---|
| 426 | 371 | static int ir_mce_kbd_unregister(struct rc_dev *dev) |
|---|
| 427 | 372 | { |
|---|
| 428 | 373 | struct mce_kbd_dec *mce_kbd = &dev->raw->mce_kbd; |
|---|
| 429 | | - struct input_dev *idev = mce_kbd->idev; |
|---|
| 430 | 374 | |
|---|
| 431 | 375 | del_timer_sync(&mce_kbd->rx_timeout); |
|---|
| 432 | | - input_unregister_device(idev); |
|---|
| 433 | 376 | |
|---|
| 434 | 377 | return 0; |
|---|
| 435 | 378 | } |
|---|