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);