ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows 驱动实例分析系列:libwdi 驱动分析 - 应用篇(二)

Windows 驱动实例分析系列:libwdi 驱动分析 - 应用篇(二) 子文档二开源与嵌入式项目中的 libwdi 集成实践libwdi 在开源社区和嵌入式开发领域有着深厚的根基。许多知名的开源项目都将 libwdi 作为其 Windows 平台驱动安装的标准方案。本节将深入分析几个代表性项目如何集成和使用 libwdi。2.1 QMK 固件libwdi 的分支与定制QMKQuantum Mechanical Keyboard是一个开源的键盘固件项目支持数百种机械键盘。QMK 用户需要通过 USB 将固件刷写到键盘的微控制器上这要求 Windows 能够识别处于刷写模式bootloader 模式的键盘设备。QMK 的解决方案是qmk_driver_installer——一个基于 libwdi 的分支项目。qmk_driver_installer 并不是简单地调用 libwdi API而是对 libwdi 进行了定制化改造添加了 QMK 支持设备的配置文件预置了各种键盘的 VID/PID新增了专门针对 QMK bootloader 设备的安装逻辑在 libwdi 的基础上增加了新的可执行文件这种“Fork 定制”的模式在开源社区中非常典型。QMK 选择 fork libwdi 而非直接使用是因为QMK 需要支持大量数百种键盘设备每种设备可能有不同的 VID/PID 和 bootloader 行为QMK 的驱动安装工具需要与 QMK ToolboxQMK 的图形化刷写工具深度集成QMK 团队希望对驱动安装流程有完全的控制权从使用模式上看qmk_driver_installer 在 libwdi 的基础上增加了设备白名单机制只有 VID/PID 在配置文件中的设备才会被识别和安装驱动。这避免了误装驱动的风险也提升了用户体验——用户不需要手动选择设备工具会自动识别。这个案例告诉我们libwdi 的开源许可证LGPL v3允许开发者 fork 和修改代码使得它成为开源项目构建定制化驱动安装工具的“地基”。QMK 没有从零开始写驱动安装逻辑而是站在 libwdi 的肩膀上快速构建了满足自己需求的工具。2.2 OpenOCD 与嵌入式调试工具链OpenOCDOpen On-Chip Debugger是嵌入式开发中最常用的调试工具之一支持 JTAG/SWD 调试器如 FTDI FT2232、ST-Link、J-Link 等。在 Windows 平台上OpenOCD 需要通过 libusb 或 WinUSB 与调试器通信而这要求调试器的驱动被正确安装。OpenOCD 社区推荐使用Zadig/libwdi来为调试器安装 WinUSB 驱动。在 OpenOCD 的 Windows 构建指南中明确提到了使用 Zadig 作为驱动安装的推荐方式。更值得注意的是libwdi 的inf-wizard.exe一个基于 libwdi 的 INF 生成工具被用于为 FTDI 调试器生成定制的驱动安装包。inf-wizard.exe 内嵌了 x86 和 x64 两个版本的驱动使得 32 位和 64 位的 OpenOCD 都能正常运行。从技术角度看OpenOCD 使用 libwdi 的方式代表了嵌入式开发工具链中的一种标准实践调试器设备如 FTDI 芯片在 Windows 上默认可能被识别为串口设备或未知设备开发者使用 Zadig 或 libwdi API 将驱动切换为 WinUSB 或 libusb-win32OpenOCD 通过 libusb 或 WinUSB API 与调试器通信这种实践之所以成为标准是因为libwdi 支持的驱动类型WinUSB、libusb-win32、libusbK覆盖了嵌入式调试工具的所有需求libwdi 的跨架构支持x86、x64、ARM64与嵌入式开发的多平台需求吻合libwdi 的自动化能力降低了嵌入式开发者的入门门槛2.3 Network UPS Tools (NUT)libwdi 在系统管理中的应用Network UPS Tools (NUT)是一个跨平台的 UPS不间断电源监控和管理工具集。许多 UPS 设备通过 USB 与计算机连接NUT 需要通过 USB 与 UPS 通信以获取状态信息电池电量、输入电压、负载等。NUT 的 Windows 版本包含一个驱动安装器组件用于为 USB 连接的 UPS 设备安装驱动。这个驱动安装器使用了 libwdi 提供的wdi-simple示例程序。NUT 的构建脚本中包含了编译wdi-simple.exe的步骤并将其作为 NUT Windows 安装包的一部分。这个案例展示了 libwdi 的另一个使用模式直接使用官方提供的示例程序而非自行编写集成代码。wdi-simple是 libwdi 源码中提供的一个命令行驱动安装示例它接受命令行参数VID、PID、驱动类型等执行完整的驱动安装流程。NUT 的做法是在构建过程中编译wdi-simple.exe将编译好的wdi-simple.exe打包到 NUT 的 Windows 安装包中在 NUT 的安装或运行过程中通过命令行调用wdi-simple.exe为 UPS 设备安装驱动这种“复用示例程序”的方式非常适合那些不想在代码层面与 libwdi 深度集成的项目。wdi-simple作为一个独立的可执行文件可以被任何编程语言或脚本调用无需处理 C 语言的编译链接问题。2.4 Black Magic Probe 与 Rust 生态bmputil是 Black Magic Probe一个开源调试器的命令行工具。bmputil 使用 Rust 编写通过wdi-rslibwdi 的 Rust 绑定来调用 libwdi 的功能。wdi-rs 提供了两层 API低层 FFI 绑定直接映射 libwdi 的 C 函数高层 Builder API封装了常见的驱动安装模式如“按 VID/PID 安装驱动”、“使用自定义 INF 文件”等bmputil 使用 wdi-rs 的高层 API 来安装 WinUSB 驱动usewdi_rs::DriverInstaller;// 使用 VID/PID 安装 WinUSB 驱动DriverInstaller::new().vid(0x0483)// STM32 VID.pid(0x3748)// Black Magic Probe PID.install()?;或者使用自定义 INF 文件constMY_DEVICE_INF:[u8]include_bytes!(../driver/device.inf);DriverInstaller::new().vid(0x0483).pid(0x3748).inf_data(MY_DEVICE_INF).install()?;这个案例展示了 libwdi 生态的跨语言扩展能力。通过 wdi-rsRust 开发者可以安全、便捷地使用 libwdi 的全部功能。wdi-rs 的存在意味着 libwdi 的影响力已经超越了 C/C 社区进入了 Rust 等现代编程语言的生态。2.5 嵌入式开发中的典型使用流程综合以上案例嵌入式开发中使用 libwdi 的典型流程可以归纳为设备识别使用wdi_create_list枚举系统中的 USB 设备获取 VID/PID 和描述信息驱动选择根据设备类型选择合适的驱动WinUSB、libusb-win32、libusbK驱动准备调用wdi_prepare_driver生成 INF 文件并提取驱动二进制驱动安装调用wdi_install_driver执行安装可选择静默模式或带进度提示后续通信安装完成后应用程序通过 libusb 或 WinUSB API 与设备通信对于不想编写代码的场景可以直接使用 Zadig 工具完成上述所有步骤。
返回列表