hid-uclogic-params-test.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * HID driver for UC-Logic devices not fully compliant with HID standard
  4. *
  5. * Copyright (c) 2022 José Expósito <[email protected]>
  6. */
  7. #include <kunit/test.h>
  8. #include "./hid-uclogic-params.h"
  9. #include "./hid-uclogic-rdesc.h"
  10. #define MAX_STR_DESC_SIZE 14
  11. struct uclogic_parse_ugee_v2_desc_case {
  12. const char *name;
  13. int res;
  14. const __u8 str_desc[MAX_STR_DESC_SIZE];
  15. size_t str_desc_size;
  16. const s32 desc_params[UCLOGIC_RDESC_PH_ID_NUM];
  17. enum uclogic_params_frame_type frame_type;
  18. };
  19. static struct uclogic_parse_ugee_v2_desc_case uclogic_parse_ugee_v2_desc_cases[] = {
  20. {
  21. .name = "invalid_str_desc",
  22. .res = -EINVAL,
  23. .str_desc = {},
  24. .str_desc_size = 0,
  25. .desc_params = {},
  26. .frame_type = UCLOGIC_PARAMS_FRAME_BUTTONS,
  27. },
  28. {
  29. .name = "resolution_with_value_0",
  30. .res = 0,
  31. .str_desc = {
  32. 0x0E, 0x03,
  33. 0x70, 0xB2,
  34. 0x10, 0x77,
  35. 0x08,
  36. 0x00,
  37. 0xFF, 0x1F,
  38. 0x00, 0x00,
  39. },
  40. .str_desc_size = 12,
  41. .desc_params = {
  42. [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xB270,
  43. [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0,
  44. [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0x7710,
  45. [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0,
  46. [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0x1FFF,
  47. [UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0x08,
  48. },
  49. .frame_type = UCLOGIC_PARAMS_FRAME_BUTTONS,
  50. },
  51. /* XP-PEN Deco L str_desc: Frame with 8 buttons */
  52. {
  53. .name = "frame_type_buttons",
  54. .res = 0,
  55. .str_desc = {
  56. 0x0E, 0x03,
  57. 0x70, 0xB2,
  58. 0x10, 0x77,
  59. 0x08,
  60. 0x00,
  61. 0xFF, 0x1F,
  62. 0xD8, 0x13,
  63. },
  64. .str_desc_size = 12,
  65. .desc_params = {
  66. [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xB270,
  67. [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0x2320,
  68. [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0x7710,
  69. [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0x1770,
  70. [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0x1FFF,
  71. [UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0x08,
  72. },
  73. .frame_type = UCLOGIC_PARAMS_FRAME_BUTTONS,
  74. },
  75. /* PARBLO A610 PRO str_desc: Frame with 9 buttons and dial */
  76. {
  77. .name = "frame_type_dial",
  78. .res = 0,
  79. .str_desc = {
  80. 0x0E, 0x03,
  81. 0x96, 0xC7,
  82. 0xF9, 0x7C,
  83. 0x09,
  84. 0x01,
  85. 0xFF, 0x1F,
  86. 0xD8, 0x13,
  87. },
  88. .str_desc_size = 12,
  89. .desc_params = {
  90. [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xC796,
  91. [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0x2749,
  92. [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0x7CF9,
  93. [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0x1899,
  94. [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0x1FFF,
  95. [UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0x09,
  96. },
  97. .frame_type = UCLOGIC_PARAMS_FRAME_DIAL,
  98. },
  99. /* XP-PEN Deco Pro S str_desc: Frame with 8 buttons and mouse */
  100. {
  101. .name = "frame_type_mouse",
  102. .res = 0,
  103. .str_desc = {
  104. 0x0E, 0x03,
  105. 0xC8, 0xB3,
  106. 0x34, 0x65,
  107. 0x08,
  108. 0x02,
  109. 0xFF, 0x1F,
  110. 0xD8, 0x13,
  111. },
  112. .str_desc_size = 12,
  113. .desc_params = {
  114. [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xB3C8,
  115. [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0x2363,
  116. [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0x6534,
  117. [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0x13EC,
  118. [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0x1FFF,
  119. [UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0x08,
  120. },
  121. .frame_type = UCLOGIC_PARAMS_FRAME_MOUSE,
  122. },
  123. };
  124. static void uclogic_parse_ugee_v2_desc_case_desc(struct uclogic_parse_ugee_v2_desc_case *t,
  125. char *desc)
  126. {
  127. strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
  128. }
  129. KUNIT_ARRAY_PARAM(uclogic_parse_ugee_v2_desc, uclogic_parse_ugee_v2_desc_cases,
  130. uclogic_parse_ugee_v2_desc_case_desc);
  131. static void uclogic_parse_ugee_v2_desc_test(struct kunit *test)
  132. {
  133. int res;
  134. s32 desc_params[UCLOGIC_RDESC_PH_ID_NUM];
  135. enum uclogic_params_frame_type frame_type;
  136. const struct uclogic_parse_ugee_v2_desc_case *params = test->param_value;
  137. res = uclogic_params_parse_ugee_v2_desc(params->str_desc,
  138. params->str_desc_size,
  139. desc_params,
  140. ARRAY_SIZE(desc_params),
  141. &frame_type);
  142. KUNIT_ASSERT_EQ(test, res, params->res);
  143. if (res)
  144. return;
  145. KUNIT_EXPECT_EQ(test,
  146. params->desc_params[UCLOGIC_RDESC_PEN_PH_ID_X_LM],
  147. desc_params[UCLOGIC_RDESC_PEN_PH_ID_X_LM]);
  148. KUNIT_EXPECT_EQ(test,
  149. params->desc_params[UCLOGIC_RDESC_PEN_PH_ID_X_PM],
  150. desc_params[UCLOGIC_RDESC_PEN_PH_ID_X_PM]);
  151. KUNIT_EXPECT_EQ(test,
  152. params->desc_params[UCLOGIC_RDESC_PEN_PH_ID_Y_LM],
  153. desc_params[UCLOGIC_RDESC_PEN_PH_ID_Y_LM]);
  154. KUNIT_EXPECT_EQ(test,
  155. params->desc_params[UCLOGIC_RDESC_PEN_PH_ID_Y_PM],
  156. desc_params[UCLOGIC_RDESC_PEN_PH_ID_Y_PM]);
  157. KUNIT_EXPECT_EQ(test,
  158. params->desc_params[UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM],
  159. desc_params[UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM]);
  160. KUNIT_EXPECT_EQ(test,
  161. params->desc_params[UCLOGIC_RDESC_FRAME_PH_ID_UM],
  162. desc_params[UCLOGIC_RDESC_FRAME_PH_ID_UM]);
  163. KUNIT_EXPECT_EQ(test, params->frame_type, frame_type);
  164. }
  165. static struct kunit_case hid_uclogic_params_test_cases[] = {
  166. KUNIT_CASE_PARAM(uclogic_parse_ugee_v2_desc_test,
  167. uclogic_parse_ugee_v2_desc_gen_params),
  168. {}
  169. };
  170. static struct kunit_suite hid_uclogic_params_test_suite = {
  171. .name = "hid_uclogic_params_test",
  172. .test_cases = hid_uclogic_params_test_cases,
  173. };
  174. kunit_test_suite(hid_uclogic_params_test_suite);
  175. MODULE_DESCRIPTION("KUnit tests for the UC-Logic driver");
  176. MODULE_LICENSE("GPL");
  177. MODULE_AUTHOR("José Expósito <[email protected]>");