SDMMC 驱动架构

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

启动

启动一个有新 SDMMC 控制器的 SoC 需要写入新的平台驱动。如果控制器实现了 SDHCI 规范,那么这个驱动也应该实现fuchsia.hardware.sdhci,否则就要实现fuchsia.hardware.sdmmc。这对禁用 DMA 和SdmmcHostInfoSdmmcHostPrefs提高速度模式直到硬件的基础功能验证,都是非常有用的。参考 SDHCI 和 SDMMC 协议定义获取更多信息。

SD/eMMC 核心驱动

SD/eMMC 块驱动对于用户数据分区创建一个设备实现fuchsia.hardware.block.BlockImplfuchsia.hardware.block.partition,如果使能的话(仅限 eMMC ),则同样创建一个设备有 boot0 和 boot1 分区。如果设备支持的话(仅限 eMMC , 基于 JEDEC 标准 JESD84-B51的章节 6.6.22),那么需要设备实现fuchsia.hardware.rpmb

SDIO 核心驱动

SDIO 核心驱动创建设备实现fuchsia.hardware.sdio,对于每个 IO 功能各一个。而 SD/eMMC 块驱动的唯一预期客户端是存储栈, SDIO 驱动将依据是哪一种 SDIO 卡被检测到而拥有不同的客户端。客户端驱动使用在下述表中的绑定变量定义绑定在 SDIO 核心驱动上。使用多余一种 IO 功能的客户端驱动需要绑定在复合设备上,这样对于每一个功能设备都有一个分块。注意这可能对于组合卡有多个同时存在的 SDIO 客户端驱动,例如蓝牙和 WIFI, 在某种情景下,通过核心驱动的共享实现访问总线。客户端同样不能直接访问功能0,这样用于避免其他客户端的干扰。参考 SDIO 协议定义来获取更多信息。

SDIO 客户端绑定

Bind variable Meaning
BIND_SDIO_VID The IO function’s manufacturer ID read from FBR
BIND_SDIO_PID The IO function’s product ID read from FBR
BIND_SDIO_FUNCTION The IO function number from 1 to 7

设备框图

SDMMC device diagram