在调用mmc_start_request()前,mrq->done=mmc_wait_data_done就确定了,是request完成之后的回调函数。 函数开始就不断的对mrq->cmd和mrq->data结构做判断,mmc_start_request其实是个通用函数,我们知道mmc命令有些是单命令,有些是命令数据合并型,对于有数据传输要求的命令,要对mmc->data结构错误判断。 如无意外...
1.如果是MMC_BLK_SUCCESS或者MMC_BLK_PARTIAL,需要调用blk_end_request通知block设备层,完成了本次读写request。 2.如果是MMC_BLK_CMD_ERR,那么调用mmc_blk_reset复位host。调用mmc_blk_cmd_err尝试blk_end_request,如果发现reuqest未完成,说明本次操作失败,反之成功start_new_req ...
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_blk_rw_rq_prep:正常情况下执行mmc_blk_rw_rq_prep函数,从request构造mmc_request,毕竟下发给host请求,是mmc_request,而不是block层通用的request。 如果支持packed功能,那么就用pack_list来构造mmc_request 3. mmc_start_req:mmc_start_req 启动一个非阻塞的request,这个函数会等待前一个request完成,然...
__mmc_start_request(host, mrq); //mmc/core/core.c mmc_retune(host); //mmc/core/host.c if (!host->need_retune || host->doing_retune || !host->card) return 0; host->ops->request(host, mrq); 控制器代码分析 控制器入口 ...
(struct mmc_host*host,struct mmc_request*req,bool is_first_req);void(*request)(struct mmc_host*host,struct mmc_request*req);// host处理mmc请求的方法,在mmc_start_request中会调用void(*set_ios)(struct mmc_host*host,struct mmc_ios*ios);// 设置host的总线的io settingint(*get_ro)(struct ...
drivers/MMC/core/core.c:169 [MMC_core]MMC_Request_Done =p "%s":已传输%d 个字节:%d\012" drivers/MMC/core/core.c:177 [MMC_core]MMC_Request_Done =p "%s":(cmd%u):%d:%08x %08x %08x %08x\012" drivers/MMC/core/core.c:201 [MMC_core]MMC_START_REQUEST =p "<%s:启动 CMD%...
--》mmc_start_host --》mmc_gpiod_request_cd_irq //中断处理函数mmc_gpio_cd_irqt 当卡插入时,产生中断,就会调用中断处理函数mmc_gpio_cd_irqt staticirqreturn_tmmc_gpio_cd_irqt(intirq,void*dev_id){/* Schedule a card detection after a debounce timeout */structmmc_host*host...
4.4.2.卡中数据读写涉及到的函数 mmc_blk_issue_rq(card/block.c) mmc_wait_for_req(core/core.c) mmc_start_request(core/core.c) host->ops->requset(host,mrq) //tcc_sdhc.c中的tcc_mmc_request
mmc_start_request(core/core.c) host->ops->request(host, mrq) // s3cmci 中 s3cmci_request MMC/SD 卡的驱动分析完了,是不是有些复杂,不过这样设计的目的是为了分层,让具体平台的驱动编写更加省事。 4、这里主要详解一下s3cmci_ops 中包含了四个函数: static struct mmc_host_ops s3cmci_ops = { ...