CQE实现主要步骤(参考协议)
- Host system结构
command queue任务结构:
2.Theory of Operation(操作理论)
- init(初始化)
- 初始化,enable CQ
- 配置CQCFG Task Descriptor size
- 配置CQTDLBA(Command Queuing Task Descriptor List Base Address )和CQTDLBAU(Command Queuing Task Descriptor List Base Address Upper 32bits),使其指向主机内存中分配给TDL的内存位置
- 配置CQSSC1(Send Status Configuration 1)控制何时通过CQE向设备发送SEND_QUEUE_STATUS命令
- 配置CQIC(Interrupt Coalescing)寄存器控制中断合并功能:启用/禁用,设置中断计数和定时器保护
- 配置CQRMEM(Response Mode Error Mask)来控制哪些错误可能触发RED(Response Error Detection )中断(如果与重置值不同)
- Task Issuance Sequence(任务发布顺序)
- 通过读取CQTDBR(Command Queuing Task Doorbell)找到一个空的传输请求槽。空的传输请求槽在CQTDBR中将其各自的位清除为’ 0 ’
- 在空槽的第一个条目处构建任务描述符。
- 在空槽的第二个条目处构建一个传输描述符。
- 如果请求多个传输,重复步骤1-3完成所有需要的传输。
- 将CQTDBR设置为响门铃寄存器,以指示CQE一个或多个传输请求准备发送到附加设备。主机软件只在新任务对应的位上写一个“1”;CQTDBR中的所有其他位位置都应该用’ 0 '写入,这表明它们的当前值没有变化
- Task Completion Sequence(任务完成顺序)
- 读取CQTCN(Task Completion Notification)以确定哪些任务已经完成。在CQTCN中设置的每个位(通过其索引)表示一个已完成但尚未由软件服务的任务。
- 每完成一项任务:
a. 清除对应的CQTCN位
b. 将完成通知传递给请求应用程序
- Task Discard Sequence
- Error Detect and Recovery
- 读取MMC主机控制器错误中断状态寄存器并确定错误与CQE有关
- 将’ 1 '写入CQCTL。
- 等待CQCTL。停下来读“1”。在某些错误情况下,这可能不会发生,因此软件应该在足够的超时后继续执行下一步。
- 读取CQCRI(Command Response Index)和CQCRA(Command Response argument)以确定最后一个响应的索引和参数
- 读取CQTERRI(Task Error Information)以确定传输命令的索引以及与之相关的任务的索引
- 执行特定错误的恢复过程
- 将’ 0 '写入CQCTL以恢复操作
- Error Detect and Recovery