Skip to content

Commit cb4dfa4

Browse files
committed
uclogic: Detect transition Huion firmware
This adds support for Huion WH1409.
1 parent 444b55b commit cb4dfa4

File tree

1 file changed

+48
-18
lines changed

1 file changed

+48
-18
lines changed

hid-uclogic-params.c

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,15 @@ static int uclogic_params_huion_init(struct uclogic_params *params,
712712
struct hid_device *hdev)
713713
{
714714
int rc;
715+
struct usb_device *udev = hid_to_usb_dev(hdev);
715716
struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
716717
__u8 bInterfaceNumber = iface->cur_altsetting->desc.bInterfaceNumber;
717718
bool found;
718719
/* The resulting parameters (noop) */
719720
struct uclogic_params p = {0, };
721+
static const char transition_ver[] = "HUION_T153_160607";
722+
char *ver_ptr = NULL;
723+
const size_t ver_len = sizeof(transition_ver) + 1;
720724

721725
/* Check arguments */
722726
if (params == NULL || hdev == NULL) {
@@ -731,30 +735,55 @@ static int uclogic_params_huion_init(struct uclogic_params *params,
731735
goto output;
732736
}
733737

734-
/* Try to probe v2 pen parameters */
735-
rc = uclogic_params_pen_init_v2(&p.pen, &found, hdev);
736-
if (rc != 0) {
738+
/* Try to get firmware version */
739+
ver_ptr = kzalloc(ver_len, GFP_KERNEL);
740+
if (ver_ptr == NULL) {
741+
rc = -ENOMEM;
742+
goto cleanup;
743+
}
744+
rc = usb_string(udev, 201, ver_ptr, ver_len);
745+
if (ver_ptr == NULL) {
746+
rc = -ENOMEM;
747+
goto cleanup;
748+
}
749+
if (rc == -EPIPE) {
750+
*ver_ptr = '\0';
751+
} else if (rc < 0) {
737752
hid_err(hdev,
738-
"failed probing pen v2 parameters: %d\n", rc);
753+
"failed retrieving Huion firmware version: %d\n", rc);
739754
goto cleanup;
740-
} else if (found) {
741-
hid_dbg(hdev, "pen v2 parameters found\n");
742-
/* Create v2 buttonpad parameters */
743-
rc = uclogic_params_frame_init_with_desc(
744-
&p.frame,
745-
uclogic_rdesc_buttonpad_v2_arr,
746-
uclogic_rdesc_buttonpad_v2_size,
747-
UCLOGIC_RDESC_BUTTONPAD_V2_ID);
755+
}
756+
757+
/* If this is a transition firmware */
758+
if (strcmp(ver_ptr, transition_ver) == 0) {
759+
hid_dbg(hdev, "transition firmware detected, "
760+
"not probing pen v2 parameters\n");
761+
} else {
762+
/* Try to probe v2 pen parameters */
763+
rc = uclogic_params_pen_init_v2(&p.pen, &found, hdev);
748764
if (rc != 0) {
749-
hid_err(hdev, "failed creating v2 buttonpad "
750-
"parameters: %d\n", rc);
765+
hid_err(hdev,
766+
"failed probing pen v2 parameters: %d\n", rc);
751767
goto cleanup;
768+
} else if (found) {
769+
hid_dbg(hdev, "pen v2 parameters found\n");
770+
/* Create v2 buttonpad parameters */
771+
rc = uclogic_params_frame_init_with_desc(
772+
&p.frame,
773+
uclogic_rdesc_buttonpad_v2_arr,
774+
uclogic_rdesc_buttonpad_v2_size,
775+
UCLOGIC_RDESC_BUTTONPAD_V2_ID);
776+
if (rc != 0) {
777+
hid_err(hdev, "failed creating v2 buttonpad "
778+
"parameters: %d\n", rc);
779+
goto cleanup;
780+
}
781+
/* Set bitmask marking frame reports in pen reports */
782+
p.pen_frame_flag = 0x20;
783+
goto output;
752784
}
753-
/* Set bitmask marking frame reports in pen reports */
754-
p.pen_frame_flag = 0x20;
755-
goto output;
785+
hid_dbg(hdev, "pen v2 parameters not found\n");
756786
}
757-
hid_dbg(hdev, "pen v2 parameters not found\n");
758787

759788
/* Try to probe v1 pen parameters */
760789
rc = uclogic_params_pen_init_v1(&p.pen, &found, hdev);
@@ -791,6 +820,7 @@ static int uclogic_params_huion_init(struct uclogic_params *params,
791820
memset(&p, 0, sizeof(p));
792821
rc = 0;
793822
cleanup:
823+
kfree(ver_ptr);
794824
uclogic_params_cleanup(&p);
795825
return rc;
796826
}

0 commit comments

Comments
 (0)