ZHCACO6A january   2011  – may 2023

 

  1.   1
  2. 1MSP430™ USB HID Windows API 编程人员指南
  3. 2引言
  4. 3实现
    1. 3.1 概述
    2. 3.2 文件组织
    3. 3.3 系统要求
    4. 3.4 MSP430 USB API 堆栈
    5. 3.5 Windows 如何将物理 USB HID 器件映射到主机应用程序
    6. 3.6 在系统上查找特定 HID 器件/接口并将其打开
    7. 3.7 发送/接收数据
    8. 3.8 检测 HID 器件的动态连接/断开
  5. 4函数调用参考
    1. 4.1 器件连接管理和初始化调用
      1. 4.1.1 VOID HID_Init(struct strHidDevice* pstrHidDevice)
      2. 4.1.2 DWORD HID_GetSerNums(WORD vid, WORD pid, struct strTrackSerialNumbers *serialNumList)
      3. 4.1.3 DWORD HID_GetNumOfInterfaces(WORD vid, WORD pid, DWORD numSerNums)
      4. 4.1.4 BYTE HID_Open(struct strHidDevice* pstrHidDevice, WORD vid, WORD pid, DWORD deviceIndex, char serialNumber[SERNUM_LEN], DWORD totalDevNum, DWORD totalSerNum)
      5. 4.1.5 BYTE HID_Close(struct strHidDevice* pstrHidDevice)
      6. 4.1.6 BYTE HID_GetVersionNumber(struct strHidDevice* pstrHidDevice, USHORT * VersionNumber)
    2. 4.2 发送/接收数据
      1. 4.2.1 BYTE HID_WriteFile(struct strHidDevice* pstrHidDevice, BYTE* buffer, DWORD bufferSize, DWORD* bytesSent)
      2. 4.2.2 BYTE HID_ReadFile(struct strHidDevice* pStrHidDevice, BYTE* buffer, DWORD bufferSize, DWORD* bytesReturned)
    3. 4.3 即插即用管理
      1. 4.3.1 BYTE HID_RegisterForDeviceNotification(HWND hWnd, HDEVNOTIFY* diNotifyHandle)
      2. 4.3.2 BYTE HID_UnregisterForDeviceNotification(HDEVNOTIFY* diNotifyHandle)
      3. 4.3.3 BOOL IsDeviceAffected(struct strHidDevice* pstrHidDevice)
  6. 5演示应用程序
  7. 6MSP430 USB 工具套件
  8.   HID 接口数据结构:strHidDevice
  9.   HID 数据管道器件上的报告格式
  10.   C 参考文献
  11.   C 修订历史记录

Windows 如何将物理 USB HID 器件映射到主机应用程序

每个 USB 器件都包含一个供应商 ID (VID) 和一个米6体育平台手机版_好二三四 ID (PID)。USB 主机使用 VID/PID 组合来识别米6体育平台手机版_好二三四类型。按理说,来自给定 VID 供应商且具有给定 PID 的所有米6体育平台手机版_好二三四在功能上都是相同的。主机会将具有该 VID/PID 的所有器件关联到特定的 USB 器件类别,例如 HID 或 CDC。每次遇到此 VID/PID 时,它都会加载该特定的驱动程序。

在 Windows HID 驱动程序之上,情况看起来略有不同。HID 驱动程序会维护一个“HID 器件”列表,其中包含总线的所有“HID 器件”,且器件可通过通用索引进行选择,并使该列表可供其上面的主机应用程序使用。此列表中的“HID 器件”是逻辑实体,而不是物理 USB 器件。这些逻辑实体不一定直接映射到总线上的物理器件。

例如,可能会向主机应用程序报告多个具有给定 VID/PID 的“HID 器件”。这可能意味着该主机上连接了多个给定米6体育平台手机版_好二三四类型的物理器件;也可能是一个复合器件具有多个 HID 接口(可被视为逻辑器件)。此外,如果有 4 个以上的“HID 器件”,则可能同时存在这两个情况,如图 3-2 所示。

GUID-81CB5D7E-4D24-4DBA-866B-0A5AD8A59A36-low.gif图 3-2 Windows 系统上“HID 接口”到“HID 器件”的映射

在此图中,Windows 应用程序无法立即知道这些“HID 器件”在现实世界中代表什么。

如果主机应用程序想要在这种多器件情况下正常工作,或者更进一步,想要充分利用物理器件上的多个 HID 数据管道,则需要进一步进行探索。它需要从每个 HID 器件收集的一个重要信息是序列号(在图 3-2 中标记为“sernum”)。USB 器件可以选择报告序列号,序列号用于标识一个唯一的物理设备,使其与包含相同 VID/PID 的所有其他物理设备区分开来。(如果选择使用描述符工具来实现这一点,MSP430 USB API 堆栈可以自动报告序列号。)

在获得总线上每个 HID 器件的 VID、PID 和序列号后,主机应用程序就可以开始了解总线上的情况。如果它找到两个具有给定 VID/PID 的 HID 器件,并且其序列号也相同,那么它就知道这是一个具有两个 HID 接口的复合 HID 器件。相反,如果这两个 HID 器件具有不同的序列号,应用程序就知道这是两个单接口 HID 物理器件。

借助这些技术,开发人员可以设计具有多个 HID 接口的器件,将每个接口用作特定类型信息的数据管道,相当于具有多个 COM 端口。除了其他优点外,这还有助于克服单个 HID 接口的带宽限制 (64kbps)。一个 MSP430 上可以并行运行多达 8 个 HID 接口,从而可以提供 512kbps 的带宽。

需要补充的是,如果 Windows 在初始枚举期间通过 USB 描述符识别出此器件是鼠标或键盘,则 Windows 本身将成为该 HID 器件的“主机应用程序”。它会发出报告请求并使用数据来控制屏幕上的鼠标或输入数据以进行文本输入。