Edit online

请求处理流程

15 Nov 2024
Read time: 1 minute(s)

对于应用程序,通过读写的接口访问文件系统,文件系统访问块设备,MMC 设备在内核中被注册为一个块设备,当读写的操作传入到 MMC 块设备后,通过 MMC 子系统处理相关操作,对于 MMC 子系统其处理皆以请求的方式实现。

块层以上系统读写调用流程

在块层以上,通常是用户空间调用读写接口访问 MMC 设备,主要流程如下:


blkdev_access_flow

1. 通用块设备的访问流程
  1. 在用户空间,应用程序调用 read/write 接口
  2. 然后通过虚拟文件系统
  3. 调用通用块层的接口对块设备进行 IO 请求
  4. IO 调度层负责使用特定算法对这些请求进行调度
  5. 块设备驱动层调用具体的块设备接口访问设备

MMC 子系统请求处理流程

MMC 子系统被抽象成一个块设备,通用块层将 IO 请求调用到具体的块设备驱动层,在 MMC 块设备驱动中的请求处理流程如下:


mmc_request_flow

2. MMC 数据请求的处理流程
  1. 由于会有多个请求,在 block 中以队列的形式处理,在请求到达时,唤醒 mmc_queue_thread。
  2. 调用 block 的请求处理,发出 request。
  3. block 的 request 会由 core 来实现。
  4. core 层会根据当前 host 驱动调用对应 host 的 ops 中的 request 接口去操作 controller。

函数调用关系:

mmc_wait_for_req
|--__mmc_start_req
|--init_completion
            |--mmc_start_request
                |--mmc_mrq_prep
                |--__mmc_start_request
                    |--trace_mmc_request_start
                    |--host->ops->request (即 request)

Host 层驱动请求处理流程

在访问 MMC 外设时,都是通过发送 CMD 的方式,在 host 层驱动中需要通过操作 controller 去实现 core 层的 request,主要流程如下:


host_request_flow

3. Host 层驱动的请求处理流程
  1. 检测卡设备,需要判断当前卡设备是否被拔出。
  2. 判断传输状态,如果当前传输状态不是 idle,那么将会将该请求放在请求队列里。
  3. 处理 data,如果当前请求需要处理数据,则将数据先行处理,如果不需要处理数据则跳过。
  4. 发送 CMD,解析请求中的 CMD 和参数,将其写入寄存器,然后触发 CMD 的发送。
  5. 中断处理,在发送完 CMD 后,后续的工作需要等待中断的触发,在中断处理中会对外设返回的数据和状态进行处理。
  6. 如果需要,发送 stop 命令,结束该次传输。
Host 层函数调用关系:
artinchip_mmc_request
|--artinchip_mmc_get_cd
|--artinchip_mmc_queue_request
|--artinchip_mmc_start_request
        |--artinchip_mmc_prepare_command
        |--artinchip_mmc_submit_data
        |--artinchip_mmc_start_command
        |--artinchip_mmc_prep_stop_abort