• Home
  • Raw
  • Download

Lines Matching +full:pen +full:- +full:up

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
61 * -EPIPE, if the descriptor was not found, or
73 rc = -EINVAL; in uclogic_params_get_str_desc()
81 rc = -ENOMEM; in uclogic_params_get_str_desc()
90 if (rc == -EPIPE) { in uclogic_params_get_str_desc()
111 * uclogic_params_pen_cleanup - free resources used by struct
112 * uclogic_params_pen (tablet interface's pen input parameters).
115 * @pen: Pen input parameters to cleanup. Cannot be NULL.
117 static void uclogic_params_pen_cleanup(struct uclogic_params_pen *pen) in uclogic_params_pen_cleanup() argument
119 kfree(pen->desc_ptr); in uclogic_params_pen_cleanup()
120 memset(pen, 0, sizeof(*pen)); in uclogic_params_pen_cleanup()
124 * uclogic_params_pen_init_v1() - initialize tablet interface pen
127 * @pen: Pointer to the pen parameters to initialize (to be
128 * cleaned up with uclogic_params_pen_cleanup()). Not modified in
139 static int uclogic_params_pen_init_v1(struct uclogic_params_pen *pen, in uclogic_params_pen_init_v1() argument
150 /* Pen report descriptor template parameters */ in uclogic_params_pen_init_v1()
155 if (pen == NULL || pfound == NULL || hdev == NULL) { in uclogic_params_pen_init_v1()
156 rc = -EINVAL; in uclogic_params_pen_init_v1()
161 * Read string descriptor containing pen input parameters. in uclogic_params_pen_init_v1()
164 * NOTE: This enables fully-functional tablet mode. in uclogic_params_pen_init_v1()
167 if (rc == -EPIPE) { in uclogic_params_pen_init_v1()
169 "string descriptor with pen parameters not found, assuming not compatible\n"); in uclogic_params_pen_init_v1()
172 hid_err(hdev, "failed retrieving pen parameters: %d\n", rc); in uclogic_params_pen_init_v1()
176 …"string descriptor with pen parameters has invalid length (got %d, expected %d), assuming not comp… in uclogic_params_pen_init_v1()
206 * Generate pen report descriptor in uclogic_params_pen_init_v1()
213 rc = -ENOMEM; in uclogic_params_pen_init_v1()
218 * Fill-in the parameters in uclogic_params_pen_init_v1()
220 memset(pen, 0, sizeof(*pen)); in uclogic_params_pen_init_v1()
221 pen->desc_ptr = desc_ptr; in uclogic_params_pen_init_v1()
223 pen->desc_size = uclogic_rdesc_pen_v1_template_size; in uclogic_params_pen_init_v1()
224 pen->id = UCLOGIC_RDESC_PEN_V1_ID; in uclogic_params_pen_init_v1()
225 pen->inrange = UCLOGIC_PARAMS_PEN_INRANGE_INVERTED; in uclogic_params_pen_init_v1()
237 * uclogic_params_get_le24() - get a 24-bit little-endian number from a
252 * uclogic_params_pen_init_v2() - initialize tablet interface pen
255 * @pen: Pointer to the pen parameters to initialize (to be
256 * cleaned up with uclogic_params_pen_cleanup()). Not modified in
267 static int uclogic_params_pen_init_v2(struct uclogic_params_pen *pen, in uclogic_params_pen_init_v2() argument
278 /* Pen report descriptor template parameters */ in uclogic_params_pen_init_v2()
283 if (pen == NULL || pfound == NULL || hdev == NULL) { in uclogic_params_pen_init_v2()
284 rc = -EINVAL; in uclogic_params_pen_init_v2()
289 * Read string descriptor containing pen input parameters. in uclogic_params_pen_init_v2()
292 * NOTE: This enables fully-functional tablet mode. in uclogic_params_pen_init_v2()
295 if (rc == -EPIPE) { in uclogic_params_pen_init_v2()
297 "string descriptor with pen parameters not found, assuming not compatible\n"); in uclogic_params_pen_init_v2()
300 hid_err(hdev, "failed retrieving pen parameters: %d\n", rc); in uclogic_params_pen_init_v2()
304 …"string descriptor with pen parameters has invalid length (got %d, expected %d), assuming not comp… in uclogic_params_pen_init_v2()
310 * Check it's not just a catch-all UTF-16LE-encoded ASCII in uclogic_params_pen_init_v2()
320 "string descriptor with pen parameters seems to contain only text, assuming not compatible\n"); in uclogic_params_pen_init_v2()
350 * Generate pen report descriptor in uclogic_params_pen_init_v2()
357 rc = -ENOMEM; in uclogic_params_pen_init_v2()
362 * Fill-in the parameters in uclogic_params_pen_init_v2()
364 memset(pen, 0, sizeof(*pen)); in uclogic_params_pen_init_v2()
365 pen->desc_ptr = desc_ptr; in uclogic_params_pen_init_v2()
367 pen->desc_size = uclogic_rdesc_pen_v2_template_size; in uclogic_params_pen_init_v2()
368 pen->id = UCLOGIC_RDESC_PEN_V2_ID; in uclogic_params_pen_init_v2()
369 pen->inrange = UCLOGIC_PARAMS_PEN_INRANGE_NONE; in uclogic_params_pen_init_v2()
370 pen->fragmented_hires = true; in uclogic_params_pen_init_v2()
382 * uclogic_params_frame_cleanup - free resources used by struct
390 kfree(frame->desc_ptr); in uclogic_params_frame_cleanup()
395 * uclogic_params_frame_init_with_desc() - initialize tablet's frame control
399 * up with uclogic_params_frame_cleanup()). Not modified in case
418 return -EINVAL; in uclogic_params_frame_init_with_desc()
422 return -ENOMEM; in uclogic_params_frame_init_with_desc()
425 frame->desc_ptr = copy_desc_ptr; in uclogic_params_frame_init_with_desc()
426 frame->desc_size = desc_size; in uclogic_params_frame_init_with_desc()
427 frame->id = id; in uclogic_params_frame_init_with_desc()
432 * uclogic_params_frame_init_v1_buttonpad() - initialize abstract buttonpad
436 * up with uclogic_params_frame_cleanup()). Not modified in case
460 rc = -EINVAL; in uclogic_params_frame_init_v1_buttonpad()
471 rc = -ENOMEM; in uclogic_params_frame_init_v1_buttonpad()
476 if (rc == -EPIPE) { in uclogic_params_frame_init_v1_buttonpad()
478 "generic button -enabling string descriptor not found\n"); in uclogic_params_frame_init_v1_buttonpad()
505 * uclogic_params_cleanup - free resources used by struct uclogic_params
513 if (!params->invalid) { in uclogic_params_cleanup()
514 kfree(params->desc_ptr); in uclogic_params_cleanup()
515 if (!params->pen_unused) in uclogic_params_cleanup()
516 uclogic_params_pen_cleanup(&params->pen); in uclogic_params_cleanup()
517 uclogic_params_frame_cleanup(&params->frame); in uclogic_params_cleanup()
527 * @pdesc: Location for the resulting, kmalloc-allocated report
537 * -EINVAL, if invalid arguments are supplied.
538 * -ENOMEM, if failed to allocate memory.
552 return -EINVAL; in uclogic_params_get_desc()
556 common_present = (params->desc_ptr != NULL); in uclogic_params_get_desc()
557 pen_present = (!params->pen_unused && params->pen.desc_ptr != NULL); in uclogic_params_get_desc()
558 frame_present = (params->frame.desc_ptr != NULL); in uclogic_params_get_desc()
561 size += params->desc_size; in uclogic_params_get_desc()
563 size += params->pen.desc_size; in uclogic_params_get_desc()
565 size += params->frame.desc_size; in uclogic_params_get_desc()
572 return -ENOMEM; in uclogic_params_get_desc()
576 memcpy(p, params->desc_ptr, in uclogic_params_get_desc()
577 params->desc_size); in uclogic_params_get_desc()
578 p += params->desc_size; in uclogic_params_get_desc()
581 memcpy(p, params->pen.desc_ptr, in uclogic_params_get_desc()
582 params->pen.desc_size); in uclogic_params_get_desc()
583 p += params->pen.desc_size; in uclogic_params_get_desc()
586 memcpy(p, params->frame.desc_ptr, in uclogic_params_get_desc()
587 params->frame.desc_size); in uclogic_params_get_desc()
588 p += params->frame.desc_size; in uclogic_params_get_desc()
601 * uclogic_params_init_invalid() - initialize tablet interface parameters,
609 params->invalid = true; in uclogic_params_init_invalid()
613 * uclogic_params_init_with_opt_desc() - initialize tablet interface
630 * Zero, if successful. -EINVAL if an invalid argument was passed.
631 * -ENOMEM, if failed to allocate memory.
646 rc = -EINVAL; in uclogic_params_init_with_opt_desc()
651 if (hdev->dev_rsize == orig_desc_size) { in uclogic_params_init_with_opt_desc()
656 rc = -ENOMEM; in uclogic_params_init_with_opt_desc()
663 hdev->dev_rsize, orig_desc_size); in uclogic_params_init_with_opt_desc()
670 params->desc_ptr = desc_copy_ptr; in uclogic_params_init_with_opt_desc()
672 params->desc_size = desc_copy_size; in uclogic_params_init_with_opt_desc()
681 * uclogic_params_init_with_pen_unused() - initialize tablet interface
683 * disabling pen usage.
692 params->pen_unused = true; in uclogic_params_init_with_pen_unused()
696 * uclogic_params_init() - initialize a Huion tablet interface and discover
724 rc = -EINVAL; in uclogic_params_huion_init()
729 iface = to_usb_interface(hdev->dev.parent); in uclogic_params_huion_init()
730 bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber; in uclogic_params_huion_init()
732 /* If it's not a pen interface */ in uclogic_params_huion_init()
742 rc = -ENOMEM; in uclogic_params_huion_init()
746 if (rc == -EPIPE) { in uclogic_params_huion_init()
757 "transition firmware detected, not probing pen v2 parameters\n"); in uclogic_params_huion_init()
759 /* Try to probe v2 pen parameters */ in uclogic_params_huion_init()
760 rc = uclogic_params_pen_init_v2(&p.pen, &found, hdev); in uclogic_params_huion_init()
763 "failed probing pen v2 parameters: %d\n", rc); in uclogic_params_huion_init()
766 hid_dbg(hdev, "pen v2 parameters found\n"); in uclogic_params_huion_init()
779 /* Set bitmask marking frame reports in pen reports */ in uclogic_params_huion_init()
783 hid_dbg(hdev, "pen v2 parameters not found\n"); in uclogic_params_huion_init()
786 /* Try to probe v1 pen parameters */ in uclogic_params_huion_init()
787 rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev); in uclogic_params_huion_init()
790 "failed probing pen v1 parameters: %d\n", rc); in uclogic_params_huion_init()
793 hid_dbg(hdev, "pen v1 parameters found\n"); in uclogic_params_huion_init()
810 hid_dbg(hdev, "pen v1 parameters not found\n"); in uclogic_params_huion_init()
826 * uclogic_params_init() - initialize a tablet interface and discover its
833 * parameters from. Cannot be NULL. Must be using the USB low-level
853 rc = -EINVAL; in uclogic_params_init()
858 bNumInterfaces = udev->config->desc.bNumInterfaces; in uclogic_params_init()
859 iface = to_usb_interface(hdev->dev.parent); in uclogic_params_init()
860 bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber; in uclogic_params_init()
895 switch (VID_PID(hdev->vendor, hdev->product)) { in uclogic_params_init()
910 if (hdev->dev_rsize == UCLOGIC_RDESC_WP5540U_V2_ORIG_SIZE) { in uclogic_params_init()
912 /* Try to probe v1 pen parameters */ in uclogic_params_init()
913 rc = uclogic_params_pen_init_v1(&p.pen, in uclogic_params_init()
917 "pen probing failed: %d\n", in uclogic_params_init()
923 "pen parameters not found"); in uclogic_params_init()
969 * If it is not a three-interface version, which is known to in uclogic_params_init()
1020 /* If this is the pen interface */ in uclogic_params_init()
1022 /* Probe v1 pen parameters */ in uclogic_params_init()
1023 rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev); in uclogic_params_init()
1025 hid_err(hdev, "pen probing failed: %d\n", rc); in uclogic_params_init()
1029 hid_warn(hdev, "pen parameters not found"); in uclogic_params_init()
1039 /* If this is the pen and frame interface */ in uclogic_params_init()
1041 /* Probe v1 pen parameters */ in uclogic_params_init()
1042 rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev); in uclogic_params_init()
1044 hid_err(hdev, "pen probing failed: %d\n", rc); in uclogic_params_init()
1062 /* Ignore non-pen interfaces */ in uclogic_params_init()
1068 rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev); in uclogic_params_init()
1070 hid_err(hdev, "pen probing failed: %d\n", rc); in uclogic_params_init()
1089 hid_warn(hdev, "pen parameters not found"); in uclogic_params_init()
1096 /* Ignore non-pen interfaces */ in uclogic_params_init()
1102 rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev); in uclogic_params_init()
1104 hid_err(hdev, "pen probing failed: %d\n", rc); in uclogic_params_init()
1119 hid_warn(hdev, "pen parameters not found"); in uclogic_params_init()