1 /* 2 * Roccat Kone driver for Linux 3 * 4 * Copyright (c) 2010 Stefan Achatz <erazor_de@users.sourceforge.net> 5 */ 6 7 /* 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the Free 10 * Software Foundation; either version 2 of the License, or (at your option) 11 * any later version. 12 */ 13 14 /* 15 * Roccat Kone is a gamer mouse which consists of a mouse part and a keyboard 16 * part. The keyboard part enables the mouse to execute stored macros with mixed 17 * key- and button-events. 18 * 19 * TODO implement on-the-fly polling-rate change 20 * The windows driver has the ability to change the polling rate of the 21 * device on the press of a mousebutton. 22 * Is it possible to remove and reinstall the urb in raw-event- or any 23 * other handler, or to defer this action to be executed somewhere else? 24 * 25 * TODO is it possible to overwrite group for sysfs attributes via udev? 26 */ 27 28 #include <linux/device.h> 29 #include <linux/input.h> 30 #include <linux/hid.h> 31 #include <linux/module.h> 32 #include <linux/slab.h> 33 #include <linux/hid-roccat.h> 34 #include "hid-ids.h" 35 #include "hid-roccat-common.h" 36 #include "hid-roccat-kone.h" 37 38 static uint profile_numbers[5] = {0, 1, 2, 3, 4}; 39 40 static void kone_profile_activated(struct kone_device *kone, uint new_profile) 41 { 42 kone->actual_profile = new_profile; 43 kone->actual_dpi = kone->profiles[new_profile - 1].startup_dpi; 44 } 45 46 static void kone_profile_report(struct kone_device *kone, uint new_profile) 47 { 48 struct kone_roccat_report roccat_report; 49 roccat_report.event = kone_mouse_event_switch_profile; 50 roccat_report.value = new_profile; 51 roccat_report.key = 0; 52 roccat_report_event(kone->chrdev_minor, (uint8_t *)&roccat_report); 53 } 54 55 static int kone_receive(struct usb_device *usb_dev, uint usb_command, 56 void *data, uint size) 57 { 58 char *buf; 59 int len; 60 61 buf = kmalloc(size, GFP_KERNEL); 62 if (buf == NULL) 63 return -ENOMEM; 64 65 len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0), 66 HID_REQ_GET_REPORT, 67 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 68 usb_command, 0, buf, size, USB_CTRL_SET_TIMEOUT); 69 70 memcpy(data, buf, size); 71 kfree(buf); 72 return ((len < 0) ? len : ((len != size) ? -EIO : 0)); 73 } 74 75 static int kone_send(struct usb_device *usb_dev, uint usb_command, 76 void const *data, uint size) 77 { 78 char *buf; 79 int len; 80 81 buf = kmemdup(data, size, GFP_KERNEL); 82 if (buf == NULL) 83 return -ENOMEM; 84 85 len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), 86 HID_REQ_SET_REPORT, 87 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, 88 usb_command, 0, buf, size, USB_CTRL_SET_TIMEOUT); 89 90 kfree(buf); 91 return ((len < 0) ? len : ((len != size) ? -EIO : 0)); 92 } 93 94 /* kone_class is used for creating sysfs attributes via roccat char device */ 95 static struct class *kone_class; 96 97 static void kone_set_settings_checksum(struct kone_settings *settings) 98 { 99 uint16_t checksum = 0; 100 unsigned char *address = (unsigned char *)settings; 101 int i; 102 103 for (i = 0; i < sizeof(struct kone_settings) - 2; ++i, ++address) 104 checksum += *address; 105 settings->checksum = cpu_to_le16(checksum); 106 } 107 108 /* 109 * Checks success after writing data to mouse 110 * On success returns 0 111 * On failure returns errno 112 */ 113 static int kone_check_write(struct usb_device *usb_dev) 114 { 115 int retval; 116 uint8_t data; 117 118 do { 119 /* 120 * Mouse needs 50 msecs until it says ok, but there are 121 * 30 more msecs needed for next write to work. 122 */ 123 msleep(80); 124 125 retval = kone_receive(usb_dev, 126 kone_command_confirm_write, &data, 1); 127 if (retval) 128 return retval; 129 130 /* 131 * value of 3 seems to mean something like 132 * "not finished yet, but it looks good" 133 * So check again after a moment. 134 */ 135 } while (data == 3); 136 137 if (data == 1) /* everything alright */ 138 return 0; 139 140 /* unknown answer */ 141 dev_err(&usb_dev->dev, "got retval %d when checking write\n", data); 142 return -EIO; 143 } 144 145 /* 146 * Reads settings from mouse and stores it in @buf 147 * On success returns 0 148 * On failure returns errno 149 */ 150 static int kone_get_settings(struct usb_device *usb_dev, 151 struct kone_settings *buf) 152 { 153 return kone_receive(usb_dev, kone_command_settings, buf, 154 sizeof(struct kone_settings)); 155 } 156 157 /* 158 * Writes settings from @buf to mouse 159 * On success returns 0 160 * On failure returns errno 161 */ 162 static int kone_set_settings(struct usb_device *usb_dev, 163 struct kone_settings const *settings) 164 { 165 int retval; 166 retval = kone_send(usb_dev, kone_command_settings, 167 settings, sizeof(struct kone_settings)); 168 if (retval) 169 return retval; 170 return kone_check_write(usb_dev); 171 } 172 173 /* 174 * Reads profile data from mouse and stores it in @buf 175 * @number: profile number to read 176 * On success returns 0 177 * On failure returns errno 178 */ 179 static int kone_get_profile(struct usb_device *usb_dev, 180 struct kone_profile *buf, int number) 181 { 182 int len; 183 184 if (number < 1 || number > 5) 185 return -EINVAL; 186 187 len = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0), 188 USB_REQ_CLEAR_FEATURE, 189 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 190 kone_command_profile, number, buf, 191 sizeof(struct kone_profile), USB_CTRL_SET_TIMEOUT); 192 193 if (len != sizeof(struct kone_profile)) 194 return -EIO; 195 196 return 0; 197 } 198 199 /* 200 * Writes profile data to mouse. 201 * @number: profile number to write 202 * On success returns 0 203 * On failure returns errno 204 */ 205 static int kone_set_profile(struct usb_device *usb_dev, 206 struct kone_profile const *profile, int number) 207 { 208 int len; 209 210 if (number < 1 || number > 5) 211 return -EINVAL; 212 213 len = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), 214 USB_REQ_SET_CONFIGURATION, 215 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, 216 kone_command_profile, number, (void *)profile, 217 sizeof(struct kone_profile), 218 USB_CTRL_SET_TIMEOUT); 219 220 if (len != sizeof(struct kone_profile)) 221 return len; 222 223 if (kone_check_write(usb_dev)) 224 return -EIO; 225 226 return 0; 227 } 228 229 /* 230 * Reads value of "fast-clip-weight" and stores it in @result 231 * On success returns 0 232 * On failure returns errno 233 */ 234 static int kone_get_weight(struct usb_device *usb_dev, int *result) 235 { 236 int retval; 237 uint8_t data; 238 239 retval = kone_receive(usb_dev, kone_command_weight, &data, 1); 240 241 if (retval) 242 return retval; 243 244 *result = (int)data; 245 return 0; 246 } 247 248 /* 249 * Reads firmware_version of mouse and stores it in @result 250 * On success returns 0 251 * On failure returns errno 252 */ 253 static int kone_get_firmware_version(struct usb_device *usb_dev, int *result) 254 { 255 int retval; 256 uint16_t data; 257 258 retval = kone_receive(usb_dev, kone_command_firmware_version, 259 &data, 2); 260 if (retval) 261 return retval; 262 263 *result = le16_to_cpu(data); 264 return 0; 265 } 266 267 static ssize_t kone_sysfs_read_settings(struct file *fp, struct kobject *kobj, 268 struct bin_attribute *attr, char *buf, 269 loff_t off, size_t count) { 270 struct device *dev = 271 container_of(kobj, struct device, kobj)->parent->parent; 272 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 273 274 if (off >= sizeof(struct kone_settings)) 275 return 0; 276 277 if (off + count > sizeof(struct kone_settings)) 278 count = sizeof(struct kone_settings) - off; 279 280 mutex_lock(&kone->kone_lock); 281 memcpy(buf, ((char const *)&kone->settings) + off, count); 282 mutex_unlock(&kone->kone_lock); 283 284 return count; 285 } 286 287 /* 288 * Writing settings automatically activates startup_profile. 289 * This function keeps values in kone_device up to date and assumes that in 290 * case of error the old data is still valid 291 */ 292 static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj, 293 struct bin_attribute *attr, char *buf, 294 loff_t off, size_t count) { 295 struct device *dev = 296 container_of(kobj, struct device, kobj)->parent->parent; 297 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 298 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 299 int retval = 0, difference, old_profile; 300 301 /* I need to get my data in one piece */ 302 if (off != 0 || count != sizeof(struct kone_settings)) 303 return -EINVAL; 304 305 mutex_lock(&kone->kone_lock); 306 difference = memcmp(buf, &kone->settings, sizeof(struct kone_settings)); 307 if (difference) { 308 retval = kone_set_settings(usb_dev, 309 (struct kone_settings const *)buf); 310 if (retval) { 311 mutex_unlock(&kone->kone_lock); 312 return retval; 313 } 314 315 old_profile = kone->settings.startup_profile; 316 memcpy(&kone->settings, buf, sizeof(struct kone_settings)); 317 318 kone_profile_activated(kone, kone->settings.startup_profile); 319 320 if (kone->settings.startup_profile != old_profile) 321 kone_profile_report(kone, kone->settings.startup_profile); 322 } 323 mutex_unlock(&kone->kone_lock); 324 325 return sizeof(struct kone_settings); 326 } 327 static BIN_ATTR(settings, 0660, kone_sysfs_read_settings, 328 kone_sysfs_write_settings, sizeof(struct kone_settings)); 329 330 static ssize_t kone_sysfs_read_profilex(struct file *fp, 331 struct kobject *kobj, struct bin_attribute *attr, 332 char *buf, loff_t off, size_t count) { 333 struct device *dev = 334 container_of(kobj, struct device, kobj)->parent->parent; 335 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 336 337 if (off >= sizeof(struct kone_profile)) 338 return 0; 339 340 if (off + count > sizeof(struct kone_profile)) 341 count = sizeof(struct kone_profile) - off; 342 343 mutex_lock(&kone->kone_lock); 344 memcpy(buf, ((char const *)&kone->profiles[*(uint *)(attr->private)]) + off, count); 345 mutex_unlock(&kone->kone_lock); 346 347 return count; 348 } 349 350 /* Writes data only if different to stored data */ 351 static ssize_t kone_sysfs_write_profilex(struct file *fp, 352 struct kobject *kobj, struct bin_attribute *attr, 353 char *buf, loff_t off, size_t count) { 354 struct device *dev = 355 container_of(kobj, struct device, kobj)->parent->parent; 356 struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); 357 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); 358 struct kone_profile *profile; 359 int retval = 0, difference; 360 361 /* I need to get my data in one piece */ 362 if (off != 0 || count != sizeof(struct kone_profile)) 363 return -EINVAL; 364 365 profile = &kone->profiles[*(uint *)(attr->private)]; 366 367 mutex_lock(&kone->kone_lock); 368 difference = memcmp(buf, profile, sizeof(struct kone_profile)); 369 if (difference) { 370 retval = kone_set_profile(usb_dev, 371 (struct kone_profile const *)buf, 372 *(uint *)(attr->private) + 1); 373 if (!retval) 374 memcpy(profile, buf, sizeof(struct kone_profile)); 375 } 376 mutex_unlock(&kone->kone_lock); 377 378 if (retval) 379 return retval; 380 381 return sizeof(struct kone_profile); 382 } 383 #define PROFILE_ATTR(number) \ 384 static struct bin_attribute bin_attr_profile##number = { \ 385 .attr = { .name = "profile" #number, .mode = 0660 }, \ 386 .size = sizeof(struct kone_profile), \ 387 .read = kone_sysfs_read_profilex, \ 388 .write = kone_sysfs_write_profilex, \ 389 .private = &profile_numbers[number-1], \ 390 }; 391 PROFILE_ATTR(1); 392 PROFILE_ATTR(2); 393 PROFILE_ATTR(3); 394 PROFILE_ATTR(4); 395 PROFILE_ATTR(5); 396 397 static ssize_t kone_sysfs_show_actual_profile(struct device *dev, 398 struct device_attribute *attr, char *buf) 399 { 400 struct kone_device *kone = 401 hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); 402 return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile); 403 } 404 static DEVICE_ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL); 405 406 static ssize_t kone_sysfs_show_actual_dpi(struct device *dev, 407 struct device_attribute *attr, char *buf) 408 { 409 struct kone_device *kone = 410 hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); 411 return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi); 412 } 413 static DEVICE_ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL); 414 415 /* weight is read each time, since we don't get informed when it's changed */ 416 static ssize_t kone_sysfs_show_weight(struct device *dev, 417 struct device_attribute *attr, char *buf) 418 { 419 struct kone_device *kone; 420 struct usb_device *usb_dev; 421 int weight = 0; 422 int retval; 423 424 dev = dev->parent->parent; 425 kone = hid_get_drvdata(dev_get_drvdata(dev)); 426 usb_dev = interface_to_usbdev(to_usb_interface(dev)); 427 428 mutex_lock(&kone->kone_lock); 429 retval = kone_get_weight(usb_dev, &weight); 430 mutex_unlock(&kone->kone_lock); 431 432 if (retval) 433 return retval; 434 return snprintf(buf, PAGE_SIZE, "%d\n", weight); 435 } 436 static DEVICE_ATTR(weight, 0440, kone_sysfs_show_weight, NULL); 437 438 static ssize_t kone_sysfs_show_firmware_version(struct device *dev, 439 struct device_attribute *attr, char *buf) 440 { 441 struct kone_device *kone = 442 hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); 443 return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version); 444 } 445 static DEVICE_ATTR(firmware_version, 0440, kone_sysfs_show_firmware_version, 446 NULL); 447 448 static ssize_t kone_sysfs_show_tcu(struct device *dev, 449 struct device_attribute *attr, char *buf) 450 { 451 struct kone_device *kone = 452 hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); 453 return snprintf(buf, PAGE_SIZE, "%d\n", kone->settings.tcu); 454 } 455 456 static int kone_tcu_command(struct usb_device *usb_dev, int number) 457 { 458 unsigned char value; 459 value = number; 460 return kone_send(usb_dev, kone_command_calibrate, &value, 1); 461 } 462 463 /* 464 * Calibrating the tcu is the only action that changes settings data inside the 465 * mouse, so this data needs to be reread 466 */ 467 static ssize_t kone_sysfs_set_tcu(struct device *dev, 468 struct device_attribute *attr, char const *buf, size_t size) 469 { 470 struct kone_device *kone; 471 struct usb_device *usb_dev; 472 int retval; 473 unsigned long state; 474 475 dev = dev->parent->parent; 476 kone = hid_get_drvdata(dev_get_drvdata(dev)); 477 usb_dev = interface_to_usbdev(to_usb_interface(dev)); 478 479 retval = kstrtoul(buf, 10, &state); 480 if (retval) 481 return retval; 482 483 if (state != 0 && state != 1) 484 return -EINVAL; 485 486 mutex_lock(&kone->kone_lock); 487 488 if (state == 1) { /* state activate */ 489 retval = kone_tcu_command(usb_dev, 1); 490 if (retval) 491 goto exit_unlock; 492 retval = kone_tcu_command(usb_dev, 2); 493 if (retval) 494 goto exit_unlock; 495 ssleep(5); /* tcu needs this time for calibration */ 496 retval = kone_tcu_command(usb_dev, 3); 497 if (retval) 498 goto exit_unlock; 499 retval = kone_tcu_command(usb_dev, 0); 500 if (retval) 501 goto exit_unlock; 502 retval = kone_tcu_command(usb_dev, 4); 503 if (retval) 504 goto exit_unlock; 505 /* 506 * Kone needs this time to settle things. 507 * Reading settings too early will result in invalid data. 508 * Roccat's driver waits 1 sec, maybe this time could be 509 * shortened. 510 */ 511 ssleep(1); 512 } 513 514 /* calibration changes values in settings, so reread */ 515 retval = kone_get_settings(usb_dev, &kone->settings); 516 if (retval) 517 goto exit_no_settings; 518 519 /* only write settings back if activation state is different */ 520 if (kone->settings.tcu != state) { 521 kone->settings.tcu = state; 522 kone_set_settings_checksum(&kone->settings); 523 524 retval = kone_set_settings(usb_dev, &kone->settings); 525 if (retval) { 526 dev_err(&usb_dev->dev, "couldn't set tcu state\n"); 527 /* 528 * try to reread valid settings into buffer overwriting 529 * first error code 530 */ 531 retval = kone_get_settings(usb_dev, &kone->settings); 532 if (retval) 533 goto exit_no_settings; 534 goto exit_unlock; 535 } 536 /* calibration resets profile */ 537 kone_profile_activated(kone, kone->settings.startup_profile); 538 } 539 540 retval = size; 541 exit_no_settings: 542 dev_err(&usb_dev->dev, "couldn't read settings\n"); 543 exit_unlock: 544 mutex_unlock(&kone->kone_lock); 545 return retval; 546 } 547 static DEVICE_ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu); 548 549 static ssize_t kone_sysfs_show_startup_profile(struct device *dev, 550 struct device_attribute *attr, char *buf) 551 { 552 struct kone_device *kone = 553 hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); 554 return snprintf(buf, PAGE_SIZE, "%d\n", kone->settings.startup_profile); 555 } 556 557 static ssize_t kone_sysfs_set_startup_profile(struct device *dev, 558 struct device_attribute *attr, char const *buf, size_t size) 559 { 560 struct kone_device *kone; 561 struct usb_device *usb_dev; 562 int retval; 563 unsigned long new_startup_profile; 564 565 dev = dev->parent->parent; 566 kone = hid_get_drvdata(dev_get_drvdata(dev)); 567 usb_dev = interface_to_usbdev(to_usb_interface(dev)); 568 569 retval = kstrtoul(buf, 10, &new_startup_profile); 570 if (retval) 571 return retval; 572 573 if (new_startup_profile < 1 || new_startup_profile > 5) 574 return -EINVAL; 575 576 mutex_lock(&kone->kone_lock); 577 578 kone->settings.startup_profile = new_startup_profile; 579 kone_set_settings_checksum(&kone->settings); 580 581 retval = kone_set_settings(usb_dev, &kone->settings); 582 if (retval) { 583 mutex_unlock(&kone->kone_lock); 584 return retval; 585 } 586 587 /* changing the startup profile immediately activates this profile */ 588 kone_profile_activated(kone, new_startup_profile); 589 kone_profile_report(kone, new_startup_profile); 590 591 mutex_unlock(&kone->kone_lock); 592 return size; 593 } 594 static DEVICE_ATTR(startup_profile, 0660, kone_sysfs_show_startup_profile, 595 kone_sysfs_set_startup_profile); 596 597 static struct attribute *kone_attrs[] = { 598 /* 599 * Read actual dpi settings. 600 * Returns raw value for further processing. Refer to enum 601 * kone_polling_rates to get real value. 602 */ 603 &dev_attr_actual_dpi.attr, 604 &dev_attr_actual_profile.attr, 605 606 /* 607 * The mouse can be equipped with one of four supplied weights from 5 608 * to 20 grams which are recognized and its value can be read out. 609 * This returns the raw value reported by the mouse for easy evaluation 610 * by software. Refer to enum kone_weights to get corresponding real 611 * weight. 612 */ 613 &dev_attr_weight.attr, 614 615 /* 616 * Prints firmware version stored in mouse as integer. 617 * The raw value reported by the mouse is returned for easy evaluation, 618 * to get the real version number the decimal point has to be shifted 2 619 * positions to the left. E.g. a value of 138 means 1.38. 620 */ 621 &dev_attr_firmware_version.attr, 622 623 /* 624 * Prints state of Tracking Control Unit as number where 0 = off and 625 * 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and 626 * activates the tcu 627 */ 628 &dev_attr_tcu.attr, 629 630 /* Prints and takes the number of the profile the mouse starts with */ 631 &dev_attr_startup_profile.attr, 632 NULL, 633 }; 634 635 static struct bin_attribute *kone_bin_attributes[] = { 636 &bin_attr_settings, 637 &bin_attr_profile1, 638 &bin_attr_profile2, 639 &bin_attr_profile3, 640 &bin_attr_profile4, 641 &bin_attr_profile5, 642 NULL, 643 }; 644 645 static const struct attribute_group kone_group = { 646 .attrs = kone_attrs, 647 .bin_attrs = kone_bin_attributes, 648 }; 649 650 static const struct attribute_group *kone_groups[] = { 651 &kone_group, 652 NULL, 653 }; 654 655 static int kone_init_kone_device_struct(struct usb_device *usb_dev, 656 struct kone_device *kone) 657 { 658 uint i; 659 int retval; 660 661 mutex_init(&kone->kone_lock); 662 663 for (i = 0; i < 5; ++i) { 664 retval = kone_get_profile(usb_dev, &kone->profiles[i], i + 1); 665 if (retval) 666 return retval; 667 } 668 669 retval = kone_get_settings(usb_dev, &kone->settings); 670 if (retval) 671 return retval; 672 673 retval = kone_get_firmware_version(usb_dev, &kone->firmware_version); 674 if (retval) 675 return retval; 676 677 kone_profile_activated(kone, kone->settings.startup_profile); 678 679 return 0; 680 } 681 682 /* 683 * Since IGNORE_MOUSE quirk moved to hid-apple, there is no way to bind only to 684 * mousepart if usb_hid is compiled into the kernel and kone is compiled as 685 * module. 686 * Secial behaviour is bound only to mousepart since only mouseevents contain 687 * additional notifications. 688 */ 689 static int kone_init_specials(struct hid_device *hdev) 690 { 691 struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 692 struct usb_device *usb_dev = interface_to_usbdev(intf); 693 struct kone_device *kone; 694 int retval; 695 696 if (intf->cur_altsetting->desc.bInterfaceProtocol 697 == USB_INTERFACE_PROTOCOL_MOUSE) { 698 699 kone = kzalloc(sizeof(*kone), GFP_KERNEL); 700 if (!kone) { 701 hid_err(hdev, "can't alloc device descriptor\n"); 702 return -ENOMEM; 703 } 704 hid_set_drvdata(hdev, kone); 705 706 retval = kone_init_kone_device_struct(usb_dev, kone); 707 if (retval) { 708 hid_err(hdev, "couldn't init struct kone_device\n"); 709 goto exit_free; 710 } 711 712 retval = roccat_connect(kone_class, hdev, 713 sizeof(struct kone_roccat_report)); 714 if (retval < 0) { 715 hid_err(hdev, "couldn't init char dev\n"); 716 /* be tolerant about not getting chrdev */ 717 } else { 718 kone->roccat_claimed = 1; 719 kone->chrdev_minor = retval; 720 } 721 } else { 722 hid_set_drvdata(hdev, NULL); 723 } 724 725 return 0; 726 exit_free: 727 kfree(kone); 728 return retval; 729 } 730 731 static void kone_remove_specials(struct hid_device *hdev) 732 { 733 struct usb_interface *intf = to_usb_interface(hdev->dev.parent); 734 struct kone_device *kone; 735 736 if (intf->cur_altsetting->desc.bInterfaceProtocol 737 == USB_INTERFACE_PROTOCOL_MOUSE) { 738 kone = hid_get_drvdata(hdev); 739 if (kone->roccat_claimed) 740 roccat_disconnect(kone->chrdev_minor); 741 kfree(hid_get_drvdata(hdev)); 742 } 743 } 744 745 static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id) 746 { 747 int retval; 748 749 retval = hid_parse(hdev); 750 if (retval) { 751 hid_err(hdev, "parse failed\n"); 752 goto exit; 753 } 754 755 retval = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 756 if (retval) { 757 hid_err(hdev, "hw start failed\n"); 758 goto exit; 759 } 760 761 retval = kone_init_specials(hdev); 762 if (retval) { 763 hid_err(hdev, "couldn't install mouse\n"); 764 goto exit_stop; 765 } 766 767 return 0; 768 769 exit_stop: 770 hid_hw_stop(hdev); 771 exit: 772 return retval; 773 } 774 775 static void kone_remove(struct hid_device *hdev) 776 { 777 kone_remove_specials(hdev); 778 hid_hw_stop(hdev); 779 } 780 781 /* handle special events and keep actual profile and dpi values up to date */ 782 static void kone_keep_values_up_to_date(struct kone_device *kone, 783 struct kone_mouse_event const *event) 784 { 785 switch (event->event) { 786 case kone_mouse_event_switch_profile: 787 kone->actual_dpi = kone->profiles[event->value - 1]. 788 startup_dpi; 789 case kone_mouse_event_osd_profile: 790 kone->actual_profile = event->value; 791 break; 792 case kone_mouse_event_switch_dpi: 793 case kone_mouse_event_osd_dpi: 794 kone->actual_dpi = event->value; 795 break; 796 } 797 } 798 799 static void kone_report_to_chrdev(struct kone_device const *kone, 800 struct kone_mouse_event const *event) 801 { 802 struct kone_roccat_report roccat_report; 803 804 switch (event->event) { 805 case kone_mouse_event_switch_profile: 806 case kone_mouse_event_switch_dpi: 807 case kone_mouse_event_osd_profile: 808 case kone_mouse_event_osd_dpi: 809 roccat_report.event = event->event; 810 roccat_report.value = event->value; 811 roccat_report.key = 0; 812 roccat_report_event(kone->chrdev_minor, 813 (uint8_t *)&roccat_report); 814 break; 815 case kone_mouse_event_call_overlong_macro: 816 case kone_mouse_event_multimedia: 817 if (event->value == kone_keystroke_action_press) { 818 roccat_report.event = event->event; 819 roccat_report.value = kone->actual_profile; 820 roccat_report.key = event->macro_key; 821 roccat_report_event(kone->chrdev_minor, 822 (uint8_t *)&roccat_report); 823 } 824 break; 825 } 826 827 } 828 829 /* 830 * Is called for keyboard- and mousepart. 831 * Only mousepart gets informations about special events in its extended event 832 * structure. 833 */ 834 static int kone_raw_event(struct hid_device *hdev, struct hid_report *report, 835 u8 *data, int size) 836 { 837 struct kone_device *kone = hid_get_drvdata(hdev); 838 struct kone_mouse_event *event = (struct kone_mouse_event *)data; 839 840 /* keyboard events are always processed by default handler */ 841 if (size != sizeof(struct kone_mouse_event)) 842 return 0; 843 844 if (kone == NULL) 845 return 0; 846 847 /* 848 * Firmware 1.38 introduced new behaviour for tilt and special buttons. 849 * Pressed button is reported in each movement event. 850 * Workaround sends only one event per press. 851 */ 852 if (memcmp(&kone->last_mouse_event.tilt, &event->tilt, 5)) 853 memcpy(&kone->last_mouse_event, event, 854 sizeof(struct kone_mouse_event)); 855 else 856 memset(&event->tilt, 0, 5); 857 858 kone_keep_values_up_to_date(kone, event); 859 860 if (kone->roccat_claimed) 861 kone_report_to_chrdev(kone, event); 862 863 return 0; /* always do further processing */ 864 } 865 866 static const struct hid_device_id kone_devices[] = { 867 { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, 868 { } 869 }; 870 871 MODULE_DEVICE_TABLE(hid, kone_devices); 872 873 static struct hid_driver kone_driver = { 874 .name = "kone", 875 .id_table = kone_devices, 876 .probe = kone_probe, 877 .remove = kone_remove, 878 .raw_event = kone_raw_event 879 }; 880 881 static int __init kone_init(void) 882 { 883 int retval; 884 885 /* class name has to be same as driver name */ 886 kone_class = class_create(THIS_MODULE, "kone"); 887 if (IS_ERR(kone_class)) 888 return PTR_ERR(kone_class); 889 kone_class->dev_groups = kone_groups; 890 891 retval = hid_register_driver(&kone_driver); 892 if (retval) 893 class_destroy(kone_class); 894 return retval; 895 } 896 897 static void __exit kone_exit(void) 898 { 899 hid_unregister_driver(&kone_driver); 900 class_destroy(kone_class); 901 } 902 903 module_init(kone_init); 904 module_exit(kone_exit); 905 906 MODULE_AUTHOR("Stefan Achatz"); 907 MODULE_DESCRIPTION("USB Roccat Kone driver"); 908 MODULE_LICENSE("GPL v2"); 909