有块设备知道,实际块设备就是把对设备的操作先存到请求队列里,然后在执行请求队列,以实现相同的请求可以一次性操作完,提高效率。
MMC卡分为了:
块设备层:用户操作MMC卡,文件系统就会转化为对ll_wr_block的调用,把操作封装为BIO结构体,然后放到请求队列,最后调用用户提供的请求队列处理函数来统一操作。
核心层:实现MMC协议相关内存,如卡初始化。
Host层:这个层实际实现主机控制器mmc_host,这部分和硬件嘻息息相关,如发送命令、说数据的硬件操作之类就在这里实现的,他也是协议真正让卡运行起来的基底。Host层通过调用核心层的协议让卡运行起来。
我们队MMC卡的操作势必会调用到块设备的请求处理函数来解决:mq->queue = blk_init_queue(mmc_request, lock);
现在我们最关键的就是如何从块设备层数据操作一直提交到协议层的操作,协议层最终通过Host主机控制层实现硬件上的直接操作,这个搞懂了就基本熟悉MMC的架构了。
static void mmc_request(struct request_queue *q)
{
if (!mq) {
while ((req = blk_fetch_request(q)) != NULL) {
req->cmd_flags |= REQ_QUIET;
__b