目录
分成同步的mmc请求和异步的mmc请求。差别如下:
1、流程上的差别:
(1)会阻塞的处理流程:
mmc_wait_for_req
——》__mmc_start_req // 发起请求
————》init_completion(&mrq->completion);
————》mrq->done = mmc_wait_done
————》mmc_start_request(host, mrq); // 实际发起请求的操作
——》mmc_wait_for_req_done // 阻塞等待请求处理完成
——》返回
(2)不阻塞等待该命令的处理流程:
(注意:并不是说调用这个接口并不会阻塞,而是不会为了等待当前请求处理完成而阻塞,但是可能会等待上一次请求处理完成而阻塞)
mmc_start_areq
——》mmc_finalize_areq // 阻塞等待上一次的请求处理
——》__mmc_start_data_req // 发起异步请求
————》mrq->done = mmc_wait_data_done
————》mmc_start_request // 实际发起请求的操作
——》返回
最后都是调用了mmc_start_request使host向MMC发起请求。
1. 数据结构说明
一个mmc请求分成两部分内容,分别是命令部分和数据部分。
1.1 struct mmc_command
struct mmc_command {
u32 opcode;// 命令的操作码&