1. ARM PrimeCell MMCI PL18x 驱动解析
MMCI(MultiMedia Card Interface)是ARM PrimeCell系列中的一个IP核,用于实现MMC/SD/SDIO主机控制器功能。PL18x是其中一款常见型号,被广泛应用于各种嵌入式系统中。这个驱动模块位于Linux内核的drivers/mmc/host目录下,主要负责与硬件寄存器交互、数据传输和中断处理。
在Linux内核中,MMCI驱动采用分层架构设计:
- 顶层是MMC核心层,提供统一的MMC/SD/SDIO协议支持
- 中间是主机控制器驱动层(如本驱动)
- 底层是硬件具体的寄存器操作
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键数据结构分析
2.1 mmci_host 结构体
这是驱动中最核心的数据结构,代表一个MMCI主机控制器实例,主要包含:
c复制struct mmci_host {
void __iomem *base; // 寄存器基地址
struct mmc_host *mmc; // 关联的MMC主机
struct variant_data *variant; // 变体特定数据
// 电源管理
u32 pwr_reg;
u32 clk_reg;
// 数据传输
struct mmc_data *data;
unsigned int size;
// DMA相关
bool use_dma;
bool dma_in_progress;
void *dma_priv;
// 中断处理
spinlock_t lock;
struct mmc_request *mrq;
struct mmc_command *cmd;
};
2.2 variant_data 结构体
这个结构体封装了不同硬件变体之间的差异:
c复制struct variant_data {
unsigned int clkreg; // 时钟寄存器设置
unsigned int clkreg_enable; // 时钟使能位
unsigned int datactrl_mask_ddrmode; // DDR模式掩码
unsigned int pwrreg_powerup; // 上电寄存器值
// 硬件特性标志
bool busy_detect;
bool datactrl_first;
bool st_sdio;
};
3. 驱动初始化流程
3.1 探测和初始化
驱动初始化主要完成以下工作:
- 获取平台资源(IO内存、中断等)
- 初始化MMC主机结构
- 设置DMA通道(如果支持)
- 注册中断处理程序
- 配置硬件变体特定参数
