HID(Human Interface Device)即人機介面設備,是指能夠通過USB、PS/2等介面進行傳輸的輸入和輸出設備,如鍵盤、滑鼠、遊戲手柄、掃描儀等。
一、HID設備通訊協議
HID設備通訊協議有兩種,分別是HID Boot Protocol和HID Report Protocol。其中HID Boot Protocol是一種通用協議,可用於交換所有HID設備的數據,但是它不支持多個並發數據輸入輸出;而HID Report Protocol是一種自定義協議,不同的HID設備可以使用不同格式的報告描述符和報告協議來進行數據傳輸,並支持多個並發數據輸入輸出。
HID Boot Protocol的報告描述符如下所示:
// HID Boot Protocol Report Descriptor 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x02, // Usage (Mouse) 0xA1, 0x01, // Collection (Application) 0x09, 0x01, // Usage (Pointer) 0xA1, 0x00, // Collection (Physical) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (01) 0x29, 0x03, // Usage Maximum (03) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x95, 0x03, // Report Count (3) 0x75, 0x01, // Report Size (1) 0x81, 0x02, // Input (Data,Var,Abs) 0x95, 0x01, // Report Count (1) 0x75, 0x05, // Report Size (5) 0x81, 0x01, // Input (Cnst,Ary,Abs) 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x15, 0x81, // Logical Minimum (-127) 0x25, 0x7F, // Logical Maximum (127) 0x75, 0x08, // Report Size (8) 0x95, 0x02, // Report Count (2) 0x81, 0x06, // Input (Data,Var,Rel) 0xC0, // End Collection 0xC0 // End Collection
而HID Report Protocol的報告描述符,則是根據HID設備的具體情況而定,下面以滑鼠為例,列出其報告描述符:
// Mouse HID Report Descriptor 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xA1, 0x01, // COLLECTION (Application) 0x09, 0x01, // USAGE (Pointer) 0xA1, 0x00, // COLLECTION (Physical) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x03, // USAGE_MAXIMUM (Button 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x03, // REPORT_COUNT (3) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x05, // REPORT_SIZE (5) 0x81, 0x01, // INPUT (Constant) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x09, 0x38, // USAGE (Wheel) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7F, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x03, // REPORT_COUNT (3) 0x81, 0x06, // INPUT (Data,Var,Rel) 0xC0, // END_COLLECTION 0xC0 // END_COLLECTION
二、HID設備驅動程序
HID設備需要特定的驅動程序才能被計算機識別和使用。通常情況下,Windows操作系統內置了很多常見的HID設備驅動程序,可直接使用。而對於某些不常見的HID設備,則需要手動安裝其對應的驅動程序。
三、HID設備數據傳輸
HID設備的數據傳輸主要是通過輸入報告和輸出報告進行的。
輸入報告是指從HID設備向計算機發送數據的報告,一般用於傳輸HID設備的輸入信號,如鍵盤的按鍵、滑鼠的位置等信息。輸出報告則是指從計算機向HID設備發送數據的報告,一般用於傳輸HID設備的輸出信號,如LED燈的亮度和顏色等信息。
下面是一個使用WINAPI函數來進行HID設備輸入輸出的例子:
// WinHidIO.c - Windows HID I/O test program #include #include #include const UINT32 g_OutReportSize = 16; const UINT32 g_InReportSize = 16; HANDLE g_hDev = NULL; BYTE g_OutBuf[g_OutReportSize]; BYTE g_InBuf[g_InReportSize]; BOOL OpenDevice() { GUID guid; HDEVINFO hdevInfo; SP_DEVICE_INTERFACE_DATA ifaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData; // Get the HID GUID class if (!SetupDiClassGuidsFromName(TEXT("HIDClass"), &guid, 1, NULL)) return FALSE; // Get devices matching HID GUID class hdevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hdevInfo == INVALID_HANDLE_VALUE) return FALSE; // Enumerate all devices ifaceData.cbSize = sizeof(ifaceData); detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + MAX_PATH); detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); for (DWORD i = 0; SetupDiEnumDeviceInterfaces(hdevInfo, NULL, &guid, i, &ifaceData); ++i) { DWORD dwSize = 0; BOOL bRet = SetupDiGetDeviceInterfaceDetail(hdevInfo, &ifaceData, detailData, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + MAX_PATH, &dwSize, NULL); if (bRet) { // Open HID device with read/write access g_hDev = CreateFile(detailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (g_hDev != INVALID_HANDLE_VALUE) { // Set feature report HIDD_ATTRIBUTES attr; ATTR_AND_STRING as[] = {{&attr.ProductID, 0, 0}, {&attr.VendorID, 0, 0}}; HidD_GetAttributes(g_hDev, &attr); printf("Found HID device (vid=%04X, pid=%04X)\n", attr.VendorID, attr.ProductID); // Write output report bRet = HidD_SetOutputReport(g_hDev, g_OutBuf, g_OutReportSize); if (bRet) { // Read input report memset(g_InBuf, 0, g_InReportSize); bRet = HidD_GetInputReport(g_hDev, g_InBuf, g_InReportSize); if (bRet) { // Process input report data for (UINT32 j = 0; j < g_InReportSize; ++j) printf("InBuf[%d] = %02X\n", j, g_InBuf[j]); } } CloseHandle(g_hDev); g_hDev = NULL; } } } free(detailData); SetupDiDestroyDeviceInfoList(hdevInfo); return TRUE; } int main() { // Fill output report buffer memset(g_OutBuf, 0, g_OutReportSize); g_OutBuf[0] = 0x01; // Open HID device and perform I/O operations if (OpenDevice()) printf("Test completed successfully\n"); return 0; }
四、HID設備應用場景
HID設備可以廣泛應用於各種互動式設備上,如電腦、手機、平板等。下面是一些常見的應用場景:
1.鍵盤和滑鼠
鍵盤和滑鼠是最常見的HID設備之一,可以用於輸入文字、控制游標等操作。
2.遊戲手柄和方向盤
遊戲手柄和方向盤是常見的遊戲控制器,可以實現遊戲中的各種操作,如移動、跳躍、射擊等。
3.觸摸屏
觸摸屏可以用於移動設備上的交互,如點擊、滑動、縮放等操作。
4.掃描儀
掃描儀可以用於將文檔或圖片數字化,便於存儲和傳輸。
5.電視遙控器
電視遙控器可以通過HID設備來實現對電視的遙控操作,包括調節音量、切換頻道等。
五、總結
HID設備是一種重要的人機介面設備,其通訊協議、驅動程序、數據傳輸等方面都需要進行詳細的了解和應用。常見的HID設備包括鍵盤、滑鼠、遊戲手柄、觸摸屏、掃描儀、電視遙控器等。通過對HID設備的應用,可以實現各種交互性設備操作,方便用戶的使用。
原創文章,作者:DPEUM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332716.html