@@ -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 ;
793822cleanup :
823+ kfree (ver_ptr );
794824 uclogic_params_cleanup (& p );
795825 return rc ;
796826}
0 commit comments