Lines Matching +full:tablet +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
3 * HID driver for UC-Logic devices not fully compliant with HID standard
4 * - tablet initialization and parameter retrieval
16 #include "hid-uclogic-params.h"
17 #include "hid-uclogic-rdesc.h"
19 #include "hid-ids.h"
24 * Convert a pen in-range reporting type to a string.
26 * @inrange: The in-range reporting type to convert.
47 * uclogic_params_get_str_desc - retrieve a string descriptor from a HID
48 * device interface, putting it into a kmalloc-allocated buffer as is, without
51 * @pbuf: Location for the kmalloc-allocated buffer pointer containing
54 * @hdev: The HID device of the tablet interface to retrieve the string
61 * -EPIPE, if the descriptor was not found, or
73 rc = -EINVAL; in uclogic_params_get_str_desc()
79 rc = -ENOMEM; in uclogic_params_get_str_desc()
88 if (rc == -EPIPE) { in uclogic_params_get_str_desc()
109 * uclogic_params_pen_cleanup - free resources used by struct
110 * uclogic_params_pen (tablet interface's pen input parameters).
117 kfree(pen->desc_ptr); in uclogic_params_pen_cleanup()
122 * uclogic_params_pen_init_v1() - initialize tablet interface pen
131 * @hdev: The HID device of the tablet interface to initialize and get
154 rc = -EINVAL; in uclogic_params_pen_init_v1()
162 * NOTE: This enables fully-functional tablet mode. in uclogic_params_pen_init_v1()
165 if (rc == -EPIPE) { in uclogic_params_pen_init_v1()
211 rc = -ENOMEM; in uclogic_params_pen_init_v1()
216 * Fill-in the parameters in uclogic_params_pen_init_v1()
219 pen->desc_ptr = desc_ptr; in uclogic_params_pen_init_v1()
221 pen->desc_size = uclogic_rdesc_pen_v1_template_size; in uclogic_params_pen_init_v1()
222 pen->id = UCLOGIC_RDESC_PEN_V1_ID; in uclogic_params_pen_init_v1()
223 pen->inrange = UCLOGIC_PARAMS_PEN_INRANGE_INVERTED; in uclogic_params_pen_init_v1()
235 * uclogic_params_get_le24() - get a 24-bit little-endian number from a
250 * uclogic_params_pen_init_v2() - initialize tablet interface pen
259 * @hdev: The HID device of the tablet interface to initialize and get
282 rc = -EINVAL; in uclogic_params_pen_init_v2()
290 * NOTE: This enables fully-functional tablet mode. in uclogic_params_pen_init_v2()
293 if (rc == -EPIPE) { in uclogic_params_pen_init_v2()
308 * Check it's not just a catch-all UTF-16LE-encoded ASCII in uclogic_params_pen_init_v2()
355 rc = -ENOMEM; in uclogic_params_pen_init_v2()
360 * Fill-in the parameters in uclogic_params_pen_init_v2()
363 pen->desc_ptr = desc_ptr; in uclogic_params_pen_init_v2()
365 pen->desc_size = uclogic_rdesc_pen_v2_template_size; in uclogic_params_pen_init_v2()
366 pen->id = UCLOGIC_RDESC_PEN_V2_ID; in uclogic_params_pen_init_v2()
367 pen->inrange = UCLOGIC_PARAMS_PEN_INRANGE_NONE; in uclogic_params_pen_init_v2()
368 pen->fragmented_hires = true; in uclogic_params_pen_init_v2()
380 * uclogic_params_frame_cleanup - free resources used by struct
381 * uclogic_params_frame (tablet interface's frame controls input parameters).
388 kfree(frame->desc_ptr); in uclogic_params_frame_cleanup()
393 * uclogic_params_frame_init_with_desc() - initialize tablet's frame control
416 return -EINVAL; in uclogic_params_frame_init_with_desc()
420 return -ENOMEM; in uclogic_params_frame_init_with_desc()
423 frame->desc_ptr = copy_desc_ptr; in uclogic_params_frame_init_with_desc()
424 frame->desc_size = desc_size; in uclogic_params_frame_init_with_desc()
425 frame->id = id; in uclogic_params_frame_init_with_desc()
430 * uclogic_params_frame_init_v1_buttonpad() - initialize abstract buttonpad
431 * on a v1 tablet interface.
439 * @hdev: The HID device of the tablet interface to initialize and get
458 rc = -EINVAL; in uclogic_params_frame_init_v1_buttonpad()
463 * Enable generic button mode in uclogic_params_frame_init_v1_buttonpad()
467 rc = -ENOMEM; in uclogic_params_frame_init_v1_buttonpad()
472 if (rc == -EPIPE) { in uclogic_params_frame_init_v1_buttonpad()
474 "generic button -enabling string descriptor not found\n"); in uclogic_params_frame_init_v1_buttonpad()
501 * uclogic_params_cleanup - free resources used by struct uclogic_params
502 * (tablet interface's parameters).
509 if (!params->invalid) { in uclogic_params_cleanup()
510 kfree(params->desc_ptr); in uclogic_params_cleanup()
511 if (!params->pen_unused) in uclogic_params_cleanup()
512 uclogic_params_pen_cleanup(¶ms->pen); in uclogic_params_cleanup()
513 uclogic_params_frame_cleanup(¶ms->frame); in uclogic_params_cleanup()
519 * Get a replacement report descriptor for a tablet's interface.
521 * @params: The parameters of a tablet interface to get report
523 * @pdesc: Location for the resulting, kmalloc-allocated report
533 * -EINVAL, if invalid arguments are supplied.
534 * -ENOMEM, if failed to allocate memory.
548 return -EINVAL; in uclogic_params_get_desc()
552 common_present = (params->desc_ptr != NULL); in uclogic_params_get_desc()
553 pen_present = (!params->pen_unused && params->pen.desc_ptr != NULL); in uclogic_params_get_desc()
554 frame_present = (params->frame.desc_ptr != NULL); in uclogic_params_get_desc()
557 size += params->desc_size; in uclogic_params_get_desc()
559 size += params->pen.desc_size; in uclogic_params_get_desc()
561 size += params->frame.desc_size; in uclogic_params_get_desc()
568 return -ENOMEM; in uclogic_params_get_desc()
572 memcpy(p, params->desc_ptr, in uclogic_params_get_desc()
573 params->desc_size); in uclogic_params_get_desc()
574 p += params->desc_size; in uclogic_params_get_desc()
577 memcpy(p, params->pen.desc_ptr, in uclogic_params_get_desc()
578 params->pen.desc_size); in uclogic_params_get_desc()
579 p += params->pen.desc_size; in uclogic_params_get_desc()
582 memcpy(p, params->frame.desc_ptr, in uclogic_params_get_desc()
583 params->frame.desc_size); in uclogic_params_get_desc()
584 p += params->frame.desc_size; in uclogic_params_get_desc()
597 * uclogic_params_init_invalid() - initialize tablet interface parameters,
605 params->invalid = true; in uclogic_params_init_invalid()
609 * uclogic_params_init_with_opt_desc() - initialize tablet interface
617 * @hdev: The HID device of the tablet interface create the
626 * Zero, if successful. -EINVAL if an invalid argument was passed.
627 * -ENOMEM, if failed to allocate memory.
642 rc = -EINVAL; in uclogic_params_init_with_opt_desc()
647 if (hdev->dev_rsize == orig_desc_size) { in uclogic_params_init_with_opt_desc()
652 rc = -ENOMEM; in uclogic_params_init_with_opt_desc()
659 hdev->dev_rsize, orig_desc_size); in uclogic_params_init_with_opt_desc()
666 params->desc_ptr = desc_copy_ptr; in uclogic_params_init_with_opt_desc()
668 params->desc_size = desc_copy_size; in uclogic_params_init_with_opt_desc()
677 * uclogic_params_init_with_pen_unused() - initialize tablet interface
688 params->pen_unused = true; in uclogic_params_init_with_pen_unused()
692 * uclogic_params_init() - initialize a Huion tablet interface and discover
698 * @hdev: The HID device of the tablet interface to initialize and get
709 struct usb_interface *iface = to_usb_interface(hdev->dev.parent); in uclogic_params_huion_init()
710 __u8 bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber; in uclogic_params_huion_init()
720 rc = -EINVAL; in uclogic_params_huion_init()
734 rc = -ENOMEM; in uclogic_params_huion_init()
738 if (rc == -EPIPE) { in uclogic_params_huion_init()
818 * uclogic_params_init() - initialize a tablet interface and discover its
824 * @hdev: The HID device of the tablet interface to initialize and get
825 * parameters from. Cannot be NULL. Must be using the USB low-level
826 * driver, i.e. be an actual USB tablet.
836 __u8 bNumInterfaces = udev->config->desc.bNumInterfaces; in uclogic_params_init()
837 struct usb_interface *iface = to_usb_interface(hdev->dev.parent); in uclogic_params_init()
838 __u8 bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber; in uclogic_params_init()
845 rc = -EINVAL; in uclogic_params_init()
882 switch (VID_PID(hdev->vendor, hdev->product)) { in uclogic_params_init()
897 if (hdev->dev_rsize == UCLOGIC_RDESC_WP5540U_V2_ORIG_SIZE) { in uclogic_params_init()
956 * If it is not a three-interface version, which is known to in uclogic_params_init()
1049 /* Ignore non-pen interfaces */ in uclogic_params_init()
1083 /* Ignore non-pen interfaces */ in uclogic_params_init()