SDMMC 驱动程序架构

SDMMC 驱动程序堆栈分为两个主要组件:直接与控制器硬件通信的平台驱动程序,以及处理特定于协议的设备初始化和通信的核心驱动程序。核心驱动程序进一步分为 SDIO 驱动程序和块驱动程序(适用于 SD 和 eMMC)。每个 SDMMC 控制器都有不同的平台驱动程序,而核心驱动程序则在所有平台上使用。

启动

使用新的 SDMMC 控制器启动 SoC 需要编写新的平台驱动程序。如果控制器实现了 SDHCI 规范,则此驱动程序应实现 fuchsia.hardware.sdhci,否则应实现 fuchsia.hardware.sdmmc。在硬件的基本功能得到验证之前,通过 SdmmcHostInfo 和 SdmmcHostPrefs 停用 DMA 和更高速模式可能很有帮助。如需了解详情,请参阅 SDHCI 和 SDMMC 协议定义。

SD/eMMC 核心驱动程序

SD/eMMC 块驱动程序可为用户数据分区以及 boot1 和 boot2 分区(如果已启用,仅限 eMMC)提供 fuchsia.hardware.block.volume.Service 实例。如果设备支持 fuchsia.hardware.rpmb.Service,则会创建该服务(仅限 eMMC,基于 JEDEC 标准 JESD84-B51 第 6.6.22 节)。如果启用了命令排队(仅限 eMMC),驱动程序会改为创建一个提供 fuchsia.hardware.cqhci.Service 的子节点,而子 cqhci 驱动程序会提供分区和 RPMB 服务。

SDIO 核心驱动程序

SDIO 核心驱动程序会创建实现 fuchsia.hardware.sdio 的设备,每个 IO 功能对应一个设备。SD/eMMC 块驱动程序的唯一预期客户端是存储堆栈,而 SDIO 驱动程序将具有不同的客户端,具体取决于检测到的 SDIO 卡类型。客户端驱动程序使用下表中指定的绑定变量绑定到 SDIO 核心驱动程序。使用多个 IO 函数的客户端驱动程序应绑定到将每个功能设备作为 fragment 的复合设备。请注意,对于组合卡(例如蓝牙和 WiFi),可能存在多个并发 SDIO 客户端驱动程序,在这种情况下,对总线的访问将通过核心驱动程序共享。客户端也无法直接访问功能 0,以防止可能干扰其他客户端。如需了解详情,请参阅 SDIO 协议定义。

SDIO 客户端绑定

绑定变量 含义
BIND_SDIO_VID 从 FBR 读取的 IO 功能的制造商 ID
BIND_SDIO_PID 从 FBR 读取的 IO 函数的产品 ID
BIND_SDIO_FUNCTION IO 功能编号(1 到 7)

设备图

SDMMC 设备示意图