SDMMC 驱动程序架构

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

启动

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

SD/eMMC 核心驱动程序

SD/eMMC 块驱动程序会创建用于为用户数据分区实现 fuchsia.hardware.block.BlockImplfuchsia.hardware.block.partition 的设备,以及为 boot0 和 boot1 分区实现的设备(如果已启用)。如果设备支持,则创建了实现 fuchsia.hardware.rpmb 的设备(仅限 eMMC,基于 JEDEC 标准 JESD84-B51 第 6.6.22 节)。

SDIO 核心驱动程序

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

SDIO 客户端绑定

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

设备示意图

SDMMC 设备示意图