xref: /DragonOS/kernel/src/common/hid.h (revision 2813126e3190c9b3c1a836a647b259a7adbe0cf3)
1*2813126eSlogin #pragma once
2*2813126eSlogin #include <common/stddef.h>
3*2813126eSlogin 
4*2813126eSlogin #define __HID_USAGE_TABLE_SIZE 64 // usage stack的大小
5*2813126eSlogin #define HID_MAX_REPORT 300        // 最大允许的hid report数目(包括feature、input、output)
6*2813126eSlogin #define HID_MAX_PATH_SIZE 16      // maximum depth for path
7*2813126eSlogin 
8*2813126eSlogin // 这部分请参考hid_1_11.pdf Section 6.2.2.4
9*2813126eSlogin 
10*2813126eSlogin #define HID_ITEM_COLLECTION 0xA0
11*2813126eSlogin #define HID_ITEM_END_COLLECTION 0xC0
12*2813126eSlogin #define HID_ITEM_FEATURE 0xB0
13*2813126eSlogin #define HID_ITEM_INPUT 0x80
14*2813126eSlogin #define HID_ITEM_OUTPUT 0x90
15*2813126eSlogin 
16*2813126eSlogin /**
17*2813126eSlogin  * @brief 枚举hid的usage page列表。
18*2813126eSlogin  * 原始数据请见<HID Usage Tables FOR Universal Serial Bus (USB)>。
19*2813126eSlogin  * 该文件可从usb.org下载
20*2813126eSlogin  */
21*2813126eSlogin enum HID_USAGE_PAGE_TYPES
22*2813126eSlogin {
23*2813126eSlogin     HID_USAGE_PAGE_GEN_DESKTOP = 0x1,
24*2813126eSlogin     HID_USAGE_PAGE_SIMU_CTRL,               // simulation controls
25*2813126eSlogin     HID_USAGE_PAGE_VR_CTRL,                 // vr controls page
26*2813126eSlogin     HID_USAGE_PAGE_SPORT_CTRL,              // sport controls
27*2813126eSlogin     HID_USAGE_PAGE_GAME_CTRL,               // game controls
28*2813126eSlogin     HID_USAGE_PAGE_GEN_DEVICE_CTRL,         // general device controls
29*2813126eSlogin     HID_USAGE_PAGE_KBD_KPD,                     // keyboard/ keypad page
30*2813126eSlogin     HID_USAGE_PAGE_LED,                     // LED
31*2813126eSlogin     HID_USAGE_PAGE_BUTTON,                  // button page
32*2813126eSlogin     HID_USAGE_PAGE_ORDINAL,                 // ordinal page
33*2813126eSlogin     HID_USAGE_PAGE_TEL_DEVICE,              // telephony device
34*2813126eSlogin     HID_USAGE_PAGE_CONSUMER,                // consumer page
35*2813126eSlogin     HID_USAGE_PAGE_DIGITIZER,               // digitizers page
36*2813126eSlogin     HID_USAGE_PAGE_HAPTICS,                 // haptics page
37*2813126eSlogin     HID_USAGE_PAGE_PHY_INPUT_DEVICE,        // physical input device page
38*2813126eSlogin     HID_USAGE_PAGE_UNICODE = 0x10,          // unicode page
39*2813126eSlogin     HID_USAGE_PAGE_EYE_HEAD_TRACKER = 0x12, // eye and head trackers page
40*2813126eSlogin     HID_USAGE_PAGE_AUX_DISPLAY = 0x14,      // auxiliary display page
41*2813126eSlogin     HID_USAGE_PAGE_SENSORS = 0x20,          // sensors page
42*2813126eSlogin     HID_USAGE_PAGE_MEDICAL = 0x40,          // medical instruments
43*2813126eSlogin     HID_USAGE_PAGE_BRAILLE_DISPLAY,         // barille display
44*2813126eSlogin     HID_USAGE_PAGE_LIGHTNING_ILLU = 0x59,   // lighting and illumination page
45*2813126eSlogin     HID_USAGE_PAGE_MONITOR = 0x80,          // monitor page
46*2813126eSlogin     HID_USAGE_PAGE_MONITOR_ENUMERATED,      // monitor enumerated page
47*2813126eSlogin     HID_USAGE_PAGE_VESA_VIRT_CTRL,          // VESA virtual controls page
48*2813126eSlogin     HID_USAGE_PAGE_POWER = 0x84,            // power page
49*2813126eSlogin     HID_USAGE_PAGE_BATTERY_SYSTEM,          // battery system page
50*2813126eSlogin     HID_USAGE_PAGE_BARCODE_SCANNER = 0x8c,  // barcode scanner page
51*2813126eSlogin     HID_USAGE_PAGE_SCALES,                  // scales page
52*2813126eSlogin     HID_USAGE_PAGE_MAGNET_STRIPE_READER,    // magnetic stript reader page
53*2813126eSlogin     HID_USAGE_PAGE_CAMERA_CONTROL = 0x90,   // camera control page
54*2813126eSlogin     HID_USAGE_PAGE_ARCADE,                  // arcade page
55*2813126eSlogin     HID_USAGE_PAGE_GAMING_DEVICE,           // gaming device page
56*2813126eSlogin     HID_USAGE_PAGE_FIDO_ALLIANCE = 0xf1d0,  // FIDO alliance page
57*2813126eSlogin };
58*2813126eSlogin 
59*2813126eSlogin /**
60*2813126eSlogin  * @brief usage type for HID_USAGE_PAGE_GEN_DESKTOP page
61*2813126eSlogin  *
62*2813126eSlogin  */
63*2813126eSlogin enum USAGE_TYPE_GENDESK
64*2813126eSlogin {
65*2813126eSlogin     HID_USAGE_GENDESK_UNDEF = 0, // undefined
66*2813126eSlogin     HID_USAGE_GENDESK_POINTER,
67*2813126eSlogin     HID_USAGE_GENDESK_MOUSE,
68*2813126eSlogin     HID_USAGE_GENDESK_KEYBOARD = 0x6,
69*2813126eSlogin     HID_USAGE_GENDESK_POINTER_X = 0x30,
70*2813126eSlogin     HID_USAGE_GENDESK_POINTER_Y,
71*2813126eSlogin     HID_USAGE_GENDESK_WHEEL = 0x38,
72*2813126eSlogin     HID_USAGE_GENDESK_NOTHING = 0xff,
73*2813126eSlogin };
74*2813126eSlogin 
75*2813126eSlogin /**
76*2813126eSlogin  * @brief 描述hid path中的一个节点
77*2813126eSlogin  *
78*2813126eSlogin  */
79*2813126eSlogin struct hid_node_t
80*2813126eSlogin {
81*2813126eSlogin     int u_page;
82*2813126eSlogin     int usage;
83*2813126eSlogin };
84*2813126eSlogin 
85*2813126eSlogin /**
86*2813126eSlogin  * @brief 描述一条hid path
87*2813126eSlogin  *
88*2813126eSlogin  */
89*2813126eSlogin struct hid_path_t
90*2813126eSlogin {
91*2813126eSlogin     int size; // 路径中的节点数目
92*2813126eSlogin     struct hid_node_t node[HID_MAX_PATH_SIZE];
93*2813126eSlogin };
94*2813126eSlogin 
95*2813126eSlogin /**
96*2813126eSlogin  * @brief Describe a HID Data with its location in report
97*2813126eSlogin  *
98*2813126eSlogin  */
99*2813126eSlogin struct hid_data_t
100*2813126eSlogin {
101*2813126eSlogin     int value;              // hid对象的值
102*2813126eSlogin     struct hid_path_t path; // hid path
103*2813126eSlogin 
104*2813126eSlogin     int report_count; // count of reports for this usage type
105*2813126eSlogin     int offset;       // offset of data in report
106*2813126eSlogin     int size;         // size of data in bits
107*2813126eSlogin 
108*2813126eSlogin     uint8_t report_id; // report id(from incoming report)
109*2813126eSlogin     uint8_t type;      // 数据类型:FEATURE / INPUT / OUTPUT
110*2813126eSlogin     uint8_t attribute; // report field attribute. (2 = (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position))
111*2813126eSlogin                        //                           (6 = (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position))
112*2813126eSlogin     int8_t unit_exp;   // unit exponent;
113*2813126eSlogin 
114*2813126eSlogin     uint32_t unit; // HID unit
115*2813126eSlogin 
116*2813126eSlogin     int logical_min; // Logical min
117*2813126eSlogin     int logical_max; // Logical max
118*2813126eSlogin     int phys_min;    // Physical min
119*2813126eSlogin     int phys_max;    // Physical max
120*2813126eSlogin };
121*2813126eSlogin 
122*2813126eSlogin /**
123*2813126eSlogin  * @brief hid解析器
124*2813126eSlogin  *
125*2813126eSlogin  */
126*2813126eSlogin struct hid_parser
127*2813126eSlogin {
128*2813126eSlogin     const uint8_t *report_desc; // 指向report descriptor的指针
129*2813126eSlogin     int report_desc_size;       // report descriptor的大小(字节)
130*2813126eSlogin     int pos;                    // report_desc中,当前正在处理的位置
131*2813126eSlogin     uint8_t item;               // 暂存当前的item
132*2813126eSlogin     uint32_t value;             // 暂存当前的值
133*2813126eSlogin 
134*2813126eSlogin     struct hid_data_t data; // 存储当前的环境
135*2813126eSlogin 
136*2813126eSlogin     int offset_table[HID_MAX_REPORT][3]; // 存储 hid report的ID、type、offset
137*2813126eSlogin     int report_count;                    // hid report的数量
138*2813126eSlogin     int count;                           // local items的计数
139*2813126eSlogin 
140*2813126eSlogin     uint32_t u_page;
141*2813126eSlogin     struct hid_node_t usage_table[__HID_USAGE_TABLE_SIZE]; // Usage stack
142*2813126eSlogin     int usage_size;                                        // usage的数量
143*2813126eSlogin     int usage_min;
144*2813126eSlogin     int usage_max;
145*2813126eSlogin 
146*2813126eSlogin     int cnt_objects; // report descriptor中的对象数目
147*2813126eSlogin 
148*2813126eSlogin     int cnt_report; // report desc中的report数目
149*2813126eSlogin };
150*2813126eSlogin 
151*2813126eSlogin struct hid_usage_types_string
152*2813126eSlogin {
153*2813126eSlogin     int value;
154*2813126eSlogin     const char *string;
155*2813126eSlogin };
156*2813126eSlogin 
157*2813126eSlogin struct hid_usage_pages_string
158*2813126eSlogin {
159*2813126eSlogin     int value;
160*2813126eSlogin     struct hid_usage_types_string *types;
161*2813126eSlogin     const char *string;
162*2813126eSlogin };
163*2813126eSlogin 
164*2813126eSlogin int hid_parse_report(const void *report_data, const int len);
165*2813126eSlogin 
166*2813126eSlogin bool hid_parse_find_object(const void *hid_report, const int report_size, struct hid_data_t *data);