You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移植SDIO设备驱动至Linux3.10.14后probe函数未调用求助

排查与解决SDIO驱动移植到Linux 3.10.14后probe未调用的问题

核心问题:总线架构不匹配

你当前的驱动基于SDIO总线实现(使用sdio_register_driver),但旧平台注册的是platform_device(属于platform总线)。这是两个完全独立的内核总线体系,驱动与设备必须处于同一条总线才能完成匹配,因此单纯修改sdio_driver.drv.name无效——SDIO总线的驱动不会去匹配platform总线上的设备。

具体解决步骤

1. 确认旧平台的SDIO设备注册逻辑

Linux 3.10的SDIO子系统已支持标准SDIO设备管理,但旧平台可能用platform_device模拟SDIO设备。先明确两点:

  • 旧平台内核中SDIO控制器的注册方式,是否开启了SDIO总线相关配置(如CONFIG_MMC_SDIO);
  • 若旧平台仅支持platform_device关联设备,驱动必须调整为platform_driver,而非sdio_driver。

2. 将SDIO驱动适配为platform_driver

因为旧平台用platform_device,驱动需切换到platform总线体系:

  • 把struct sdio_driver替换为struct platform_driver,注册接口从sdio_register_driver改为platform_driver_register;
  • 在platform_driver的probe函数中,从platform_device的resource数组手动获取SDIO设备的IO地址、中断号等资源,调用SDIO底层API(如mmc_io_rw_direct、mmc_io_rw_extended)完成设备初始化,替代原sdio_driver probe中的sdio_xxx系列接口;
  • 确保platform_driver的driver.name与platform_device的name完全一致(大小写、字符无差异)。

3. 检查内核配置

确认旧平台内核开启了必要的SDIO相关配置:

  • 启用CONFIG_MMC(MMC/SD/SDIO控制器基础支持);
  • 启用CONFIG_MMC_SDIO(SDIO功能支持);
  • 若设备需中断,启用CONFIG_MMC_SDIO_IRQ。

4. 调试匹配过程

若仍不匹配,可通过以下方式排查:

  • 驱动注册后,执行cat /sys/bus/platform/drivers/<你的驱动名称>,确认驱动是否注册成功;
  • 执行cat /sys/bus/platform/devices/<你的设备名称>,确认设备是否存在;
  • 查看内核日志(dmesg),搜索platform相关信息,比如是否有no driver found for xxx这类匹配失败的提示。

5. 替代方案:让旧平台支持SDIO总线注册

如果旧平台的SDIO控制器驱动支持标准SDIO总线,可修改内核将platform_device替换为标准SDIO设备注册:

  • 找到旧平台中注册platform_device的代码,替换为sdio_register_device(或让SDIO控制器驱动自动枚举SDIO设备);
  • 此方案无需修改驱动,但需要调整内核代码,难度高于适配platform_driver。

内容的提问来源于stack exchange,提问作者newbielinux_guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:15:40