如何使用 SetupDiGetClassDevs() 函数访问 Windows 10 上的 GPIO、I²C、SPI 和 PWM,这里 GUID 的重要性是什么?

How to access GPIO, I²C, SPI, and PWM on Windows 10 using SetupDiGetClassDevs() function and what is the importance of GUID over here?

如何在Windows环境下访问GPIO、I²C、SPI、PWM等?

目前我有两块Intel NUC5i5MYBE主板。一块板有 WindRiver Linux,另一块板有 Windows 10 Enterprise。

在 Linux 上,我在访问上述所有内容时没有任何问题,但 Windows 环境有问题。

在Windows中,我的目标是利用Windows的CreateFile功能来打开这样的接口

但在我调用这个函数之前,我需要为这个函数提供一个设备路径。为此,我的目标是使用以下函数以及数据结构来找出设备路径。

SetupDiGetClassDevs()

SetupDiEnumDeviceInterfaces()

SetupDiGetDeviceInterfaceDetail()

HDEVINFO

SP_DEVINFO_DATA

PSP_DEVICE_INTERFACE_DETAIL_DATA

但主要的问题和未知的事情是如何向 SetupDiGetClassDevs 提供 GUID 作为第一个参数?

SetupDiGetClassDevs 的 Windows 原型如下。

HDEVINFO SetupDiGetClassDevs(
  _In_opt_ const GUID   *ClassGuid,
  _In_opt_       PCTSTR Enumerator,
  _In_opt_       HWND   hwndParent,
  _In_           DWORD  Flags
);

对于 known/specific 设备,您可以从其 INF 文件或从注册表中找到 Class Guid - 如此 post 建议 - Obtaining GUID for Existing USB Device on Windows XP。 然后在对 SetupDiGetClassDevs

的调用中使用此 Class Guid

来自 INF 文件的指南: 要访问 INF 文件条目,请使用 SetupOpenInfFile、SetupFindFirstLine 和 SetupGetStringField - 按照此 msdn 文档 https://msdn.microsoft.com/en-us/library/windows/hardware/ff549402(v=vs.85).aspx

来自注册表的 Guid:有很多 post 可以访问这样的注册表项 SO post - How to read a value from the Windows registry

最后记得在使用完 DeviceInfo 后销毁它们,如下所示:

    if (hdevinfo) {
    SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    }