19 #include <linux/device.h>
20 #include <linux/input.h>
21 #include <linux/hid.h>
22 #include <linux/module.h>
23 #include <linux/slab.h>
29 static uint profile_numbers[5] = {0, 1, 2, 3, 4};
31 static struct class *koneplus_class;
33 static void koneplus_profile_activated(
struct koneplus_device *koneplus,
39 static int koneplus_send_control(
struct usb_device *usb_dev,
uint value,
58 static int koneplus_get_info(
struct usb_device *usb_dev,
65 static int koneplus_get_profile_settings(
struct usb_device *usb_dev,
70 retval = koneplus_send_control(usb_dev, number,
79 static int koneplus_set_profile_settings(
struct usb_device *usb_dev,
87 static int koneplus_get_profile_buttons(
struct usb_device *usb_dev,
92 retval = koneplus_send_control(usb_dev, number,
101 static int koneplus_set_profile_buttons(
struct usb_device *usb_dev,
110 static int koneplus_get_actual_profile(
struct usb_device *usb_dev)
118 return retval ? retval : buf.actual_profile;
121 static int koneplus_set_actual_profile(
struct usb_device *usb_dev,
128 buf.actual_profile = new_profile;
136 char *buf, loff_t off,
size_t count,
142 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
145 if (off >= real_size)
148 if (off != 0 || count != real_size)
162 void const *buf, loff_t off,
size_t count,
163 size_t real_size,
uint command)
168 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
171 if (off != 0 || count != real_size)
185 static ssize_t koneplus_sysfs_write_talk(
struct file *fp,
187 loff_t off,
size_t count)
189 return koneplus_sysfs_write(fp, kobj, buf, off, count,
193 static ssize_t koneplus_sysfs_write_macro(
struct file *fp,
195 loff_t off,
size_t count)
197 return koneplus_sysfs_write(fp, kobj, buf, off, count,
201 static ssize_t koneplus_sysfs_read_sensor(
struct file *fp,
203 loff_t off,
size_t count)
205 return koneplus_sysfs_read(fp, kobj, buf, off, count,
209 static ssize_t koneplus_sysfs_write_sensor(
struct file *fp,
211 loff_t off,
size_t count)
213 return koneplus_sysfs_write(fp, kobj, buf, off, count,
217 static ssize_t koneplus_sysfs_write_tcu(
struct file *fp,
219 loff_t off,
size_t count)
221 return koneplus_sysfs_write(fp, kobj, buf, off, count,
225 static ssize_t koneplus_sysfs_read_tcu_image(
struct file *fp,
227 loff_t off,
size_t count)
229 return koneplus_sysfs_read(fp, kobj, buf, off, count,
233 static ssize_t koneplus_sysfs_read_profilex_settings(
struct file *fp,
235 loff_t off,
size_t count)
255 static ssize_t koneplus_sysfs_write_profile_settings(
struct file *fp,
257 loff_t off,
size_t count)
262 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
275 difference =
memcmp(buf, profile_settings,
278 retval = koneplus_set_profile_settings(usb_dev,
281 memcpy(profile_settings, buf,
292 static ssize_t koneplus_sysfs_read_profilex_buttons(
struct file *fp,
294 loff_t off,
size_t count)
314 static ssize_t koneplus_sysfs_write_profile_buttons(
struct file *fp,
316 loff_t off,
size_t count)
321 struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev));
334 difference =
memcmp(buf, profile_buttons,
337 retval = koneplus_set_profile_buttons(usb_dev,
340 memcpy(profile_buttons, buf,
351 static ssize_t koneplus_sysfs_show_actual_profile(
struct device *dev,
359 static ssize_t koneplus_sysfs_set_actual_profile(
struct device *dev,
363 struct usb_device *usb_dev;
368 dev = dev->
parent->parent;
370 usb_dev = interface_to_usbdev(to_usb_interface(dev));
381 retval = koneplus_set_actual_profile(usb_dev, profile);
387 koneplus_profile_activated(koneplus, profile);
401 static ssize_t koneplus_sysfs_show_firmware_version(
struct device *dev,
411 koneplus_sysfs_show_actual_profile,
412 koneplus_sysfs_set_actual_profile),
414 koneplus_sysfs_show_actual_profile,
415 koneplus_sysfs_set_actual_profile),
417 koneplus_sysfs_show_firmware_version,
NULL),
423 .attr = { .name =
"sensor", .mode = 0660 },
425 .
read = koneplus_sysfs_read_sensor,
426 .write = koneplus_sysfs_write_sensor
429 .attr = { .name =
"tcu", .mode = 0220 },
431 .
write = koneplus_sysfs_write_tcu
434 .attr = { .name =
"tcu_image", .mode = 0440 },
436 .
read = koneplus_sysfs_read_tcu_image
439 .attr = { .name =
"profile_settings", .mode = 0220 },
441 .
write = koneplus_sysfs_write_profile_settings
444 .attr = { .name =
"profile1_settings", .mode = 0440 },
446 .
read = koneplus_sysfs_read_profilex_settings,
447 .private = &profile_numbers[0]
450 .attr = { .name =
"profile2_settings", .mode = 0440 },
452 .
read = koneplus_sysfs_read_profilex_settings,
453 .private = &profile_numbers[1]
456 .attr = { .name =
"profile3_settings", .mode = 0440 },
458 .
read = koneplus_sysfs_read_profilex_settings,
459 .private = &profile_numbers[2]
462 .attr = { .name =
"profile4_settings", .mode = 0440 },
464 .
read = koneplus_sysfs_read_profilex_settings,
465 .private = &profile_numbers[3]
468 .attr = { .name =
"profile5_settings", .mode = 0440 },
470 .
read = koneplus_sysfs_read_profilex_settings,
471 .private = &profile_numbers[4]
474 .attr = { .name =
"profile_buttons", .mode = 0220 },
476 .
write = koneplus_sysfs_write_profile_buttons
479 .attr = { .name =
"profile1_buttons", .mode = 0440 },
481 .
read = koneplus_sysfs_read_profilex_buttons,
482 .private = &profile_numbers[0]
485 .attr = { .name =
"profile2_buttons", .mode = 0440 },
487 .
read = koneplus_sysfs_read_profilex_buttons,
488 .private = &profile_numbers[1]
491 .attr = { .name =
"profile3_buttons", .mode = 0440 },
493 .
read = koneplus_sysfs_read_profilex_buttons,
494 .private = &profile_numbers[2]
497 .attr = { .name =
"profile4_buttons", .mode = 0440 },
499 .
read = koneplus_sysfs_read_profilex_buttons,
500 .private = &profile_numbers[3]
503 .attr = { .name =
"profile5_buttons", .mode = 0440 },
505 .
read = koneplus_sysfs_read_profilex_buttons,
506 .private = &profile_numbers[4]
509 .attr = { .name =
"macro", .mode = 0220 },
511 .
write = koneplus_sysfs_write_macro
514 .attr = { .name =
"talk", .mode = 0220 },
516 .
write = koneplus_sysfs_write_talk
521 static int koneplus_init_koneplus_device_struct(
struct usb_device *usb_dev,
529 retval = koneplus_get_info(usb_dev, &koneplus->
info);
533 for (i = 0; i < 5; ++
i) {
535 retval = koneplus_get_profile_settings(usb_dev,
541 retval = koneplus_get_profile_buttons(usb_dev,
548 retval = koneplus_get_actual_profile(usb_dev);
551 koneplus_profile_activated(koneplus, retval);
556 static int koneplus_init_specials(
struct hid_device *hdev)
559 struct usb_device *usb_dev = interface_to_usbdev(intf);
563 if (intf->cur_altsetting->desc.bInterfaceProtocol
566 koneplus = kzalloc(
sizeof(*koneplus),
GFP_KERNEL);
568 hid_err(hdev,
"can't alloc device descriptor\n");
571 hid_set_drvdata(hdev, koneplus);
573 retval = koneplus_init_koneplus_device_struct(usb_dev, koneplus);
575 hid_err(hdev,
"couldn't init struct koneplus_device\n");
582 hid_err(hdev,
"couldn't init char dev\n");
588 hid_set_drvdata(hdev,
NULL);
597 static void koneplus_remove_specials(
struct hid_device *hdev)
602 if (intf->cur_altsetting->desc.bInterfaceProtocol
604 koneplus = hid_get_drvdata(hdev);
611 static int koneplus_probe(
struct hid_device *hdev,
616 retval = hid_parse(hdev);
618 hid_err(hdev,
"parse failed\n");
624 hid_err(hdev,
"hw start failed\n");
628 retval = koneplus_init_specials(hdev);
630 hid_err(hdev,
"couldn't install mouse\n");
642 static void koneplus_remove(
struct hid_device *hdev)
644 koneplus_remove_specials(hdev);
648 static void koneplus_keep_values_up_to_date(
struct koneplus_device *koneplus,
656 switch (button_report->
type) {
658 koneplus_profile_activated(koneplus, button_report->
data1 - 1);
665 static void koneplus_report_to_chrdev(
struct koneplus_device const *koneplus,
689 static int koneplus_raw_event(
struct hid_device *hdev,
695 if (intf->cur_altsetting->desc.bInterfaceProtocol
699 if (koneplus ==
NULL)
702 koneplus_keep_values_up_to_date(koneplus, data);
705 koneplus_report_to_chrdev(koneplus, data);
719 .id_table = koneplus_devices,
720 .probe = koneplus_probe,
721 .remove = koneplus_remove,
722 .raw_event = koneplus_raw_event
725 static int __init koneplus_init(
void)
731 if (IS_ERR(koneplus_class))
732 return PTR_ERR(koneplus_class);
733 koneplus_class->
dev_attrs = koneplus_attributes;
742 static void __exit koneplus_exit(
void)