移植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
相关产品推荐
相关产品推荐

