本文档深入探讨了EMMC (Embedded MultiMediaCard) 的工作流程和相关代码解析,重点关注在嵌入式系统中MMC(MultiMedia Card)控制器的交互及其组件间的协作。首先,我们了解一下主要的角色:
1. **Host Controller**:由卜婷婷主持,作为驱动的核心部分,它负责与EMMC卡通信,包括控制寄存器的访问、卡片检测插入/拔出、数据的读写等。在设备模型层面,主机会在卡片插入时检测并注册MMCcard设备,通过MMCbus进行数据传输,其中MMCbus是MMC协议的虚拟抽象,它管理MMCcard设备及其对应的驱动程序。
2. **MMC Core**:处于架构的中心位置,它是MMC框架的核心实现,为上层提供统一的编程接口,让开发者更容易创建Host控制器驱动。它将抽象出host、bus和card等概念,使得硬件驱动开发更加模块化。
3. **MMC Host Controller Driver**:这是底层驱动,依赖于MMC core提供的框架,直接控制硬件MMC控制器,执行实际的硬件操作。
4. **MMC Card Driver**:位于系统的顶层,它驱动MMC core虚拟化的card设备,并与其他内核框架(如块设备、TTY和无线模块等)集成,实现特定功能。
文章的核心内容聚焦于EMMC的初始化流程,包括以下几个关键步骤:
- **mmc_attach_mmc**:这个函数用于检测卡片的插入,确保系统能够识别和连接到EMMC卡。
- **mmc_add_card**:初始化卡片,设置必要的参数和配置,进行必要的安全检查和初始化操作。
此外,文档还提及了寄存器的解析,特别是CSD (Card Specific Data) 和CID (Card Identification) 寄存器,这两个寄存器提供了关于卡片类型、容量、速度等重要信息。在某些芯片如MSM8953和SDM450中,它们使用一个单一的19.2MHz晶体振荡器(XO)作为所有PLLs的源,以及生成其他时钟,比如32.768kHz的睡眠时钟。睡眠时钟由XO生成,通过特定的分频器设置(如586),然后通过乘法器和除数调整频率,例如,800MHz PLL通过除以8转换为100MHz。
本文档详述了EMMC的工作原理,从硬件驱动到软件框架,以及关键的初始化过程和寄存器解读,为开发人员理解和实现EMMC驱动提供了深入的见解。