//Leith_20080708
首先使能END_CMD_RES命令中断处理函数pxamci_irq,当命令发送完成之后pxamci_irq进一步检查该命令是否有跟随的数据部分,如果有,那么
将在irq处理函数中使能pxamci_enable_irq(host, DATA_TRAN_DONE);数据完成中断,sd的cmd命令有3中模式,
1)cmd发送完成之后,没有response返回
2)cmd发送完成之后,有response返回
3)cmd发送完成之后,继续有数据需要发送
mmc的host控制器会自动根据具体的cmd,进行自动化处理.
host->dma = pxa_request_dma(DRIVER_NAME, DMA_PRIO_LOW,
pxamci_dma_irq, host);
将获取一个空闲的DMA通道(pxa有32个DMA通道可以使用)
static void pxamci_dma_irq(int dma, void *devid)
{
...
if (dcsr & DCSR_ENDINTR) {
writel(BUF_PART_FULL, host->base + MMC_PRTBUF);//这里将使MMC的data中断使能,触发pxamci_irq的DATA_TRAN_DONE中断
...
}
mmc_request=>wake_up_process(mq->thread);=>mmc_queue_thread()=>mq->issue_fn(mq, req);
=>md->queue.issue_fn = mmc_blk_issue_rq;执行真正的命令发送
=>mmc_wait_for_req()等待mrq->done被调用.
mmc_wait_for_cmd将命令发送出去,并且等待起发送完成,如果命令跟随数据,那么同样等待直到数据发送完毕=>mmc_wait_for_req
mmc_wait_for_req=>
mmc_start_request=>host->ops->request(host, mrq);启动,然后等待
wait_for_completion(&complete);
所以mmc_wait_for_cmd和mmc_wait_for_req是提交数据给sd控制器的被其他函数引用的函数.
阅读(4203) | 评论(0) | 转发(1) |