通过编程方式对SDIO设备执行上下电复位是否可行?如何实现?
SDIO 设备的自动化上下电复位技术上完全可实现,分平台具体方案如下:
Linux 平台实现
- 依赖条件:不需要定制SDIO设备固件,只要宿主系统的SD/MMC控制器驱动支持电源管理回调即可,主流Linux内核的mmc子系统已经内置相关接口,默认支持该能力。
- 命令行工具:使用
mmc-utils工具包即可完成操作,首先找到目标设备对应的MMC总线编号(一般位于/sys/class/mmc_host/mmcX/路径下,X为总线编号),执行下述命令完成硬复位:
部分嵌入式平台也可直接操作SD插槽对应的供电GPIO节点,直接控制电源通断实现复位。mmc power off mmcX mmc power on mmcX # 可选:重新扫描总线枚举设备 mmc rescan mmcX - C语言调用:可直接链接libmmc库调用官方接口,也可直接读写sysfs节点实现电源控制,不需要额外引入第三方依赖。
Windows 平台实现
- 依赖条件:Windows 10 1809及以上版本的系统自带SD类驱动
sdport.sys已经内置复位接口,只要你的SDIO设备驱动遵循WDF电源管理规范、宿主SD主控制器驱动支持标准复位接口,不需要额外修改驱动即可实现。 - 命令行工具:使用系统自带的
pnputil工具即可实现,首先在设备管理器中找到目标SDIO设备的硬件实例ID,执行下述命令完成上下电复位:
也可以用pnputil /disable-device <你的设备硬件ID> pnputil /enable-device <你的设备硬件ID>devcon工具执行devcon restart <硬件ID>实现软复位,上下电的硬复位优先用pnputil的禁用启用操作,效果和手动拔插完全一致。 - C语言调用:直接调用Windows原生的SetupAPI系列接口即可,链接
setupapi.lib后,先枚举拿到SDIO设备的实例ID,调用CM_Disable_DevNode、CM_Enable_DevNode即可完成复位;需要更底层操作的话也可以向SD总线驱动发送IOCTL_SD_BUS_RESET控制指令实现总线级复位。
特殊情况说明
少数笔记本内置的SDIO设备(比如内置WiFi、蓝牙模块)会被BIOS锁定电源控制权限,无法通过软件触发断电,外置SD插槽接入的SDIO设备基本都支持上述操作。如果你的设备有自定义初始化逻辑,复位后调用自有驱动的初始化接口重新枚举设备即可。
内容的提问来源于stack exchange,提问作者user3587600
相关产品推荐
相关产品推荐

