中断处理流程
在触发中断后,需要根据目前的中断状态进行处理,其中主要为错误处理和传输处理,这些处理主要在 tasklet 中,并且基于一些状态变量来控制处理的流程。
- 状态变量。在流程的控制上,主要通过几个状态变量来控制:
-
host-> state:表示当前的操作状态,例如发送数据,发送 CMD 等等
-
host->pending_events:当前中断发生的状态
-
host->completed_events:当前完成的状态,例如 CMD 完成,DATA 完成等
-
host->cmd_status:发送 CMD 时中断的状态
-
host->data_status:传输数据时中断的状态
-
- 传输处理
-
当 CMD 发送完成中断触发后,会在 tasklet 中调用函数 complete,该函数中会读取外部 SD 设备返回给控制器的 response 数据,再根据当前的 CMD 状态对 CMD 的结果进行赋值。
-
如果使用的是 PIO 的方式,当 TX/RX FIFO 请求中断响应后,会调用对应的函数对 FIFO 进行读写操作。
-
若是采用 DMA 的方式,则在中断函数中读取内部 DMA 状态,然后释放 DMA 传输的资源,再根据 DMA 的状态,在 tsaklet 中调用 artinchip_mmc_data_complete 函数,该函数会根据目前的数据传输情况对传输结果进行赋值。
-
- 错误处理。目前 SDMC 支持的错误中断类型包括:
- CMD 错误中断
当出现 CMD 错误中断后,在中断处理函数中,会将当前中断寄存器的状态保存,然后设置 cmd 的状态为已经完成,最后在 complete 函数中将 CMD 的结果进行赋值。
- DATA 错误中断
当出现 DATA 中断后,在中断处理函数中会将当前的中断状态保存,然后设置 data 的状态为 DATA 错误,然后切入到 tasklet 函数中,在该函数中,根据 DATA 错误的状态,停止 dma,如果有需求,就发送 stop 命令。
- CMD 错误中断