- 论坛徽章:
- 0
|
yyy_irq()
{
mmc_detect_change(host->mmc, 50);
}
xxx_irq()
{
irq_status = ...
if(irq_status & err){
...
}
if(irq_status & cmd_complete){
completion(xxx_cmd);
goto cmd;
}
if(irq_status & dma_complete){
completion(xxx_dma);
goto dma;
}
...
}
xxx_send_cmd()
{
根据上层的命令标志,填写相应寄存器
if(host->cmd.flag & MMC_RSP_PRESENT){
cmd_flags = xxx;
}
...
}
void xxx_sdio_request()
{
xxx_send_cmd();
wait_for_completion(xxx_cmd);
xxx_get_resp();
if(要读写数据){
blockaddr = ...
blockcnt =...
xxx_dma_init()
xxx_do_dma()
wait_for_completion(xxx_dma);
}
cmd_complete:
host->mrq = NULL;
host->cmd = NULL;
SDIO_DEBUG("request done.\n");
mmc_request_done(mmc, mrq);
}
//操作函数
static struct mmc_host_ops xxx_sdio_ops = {
.request = xxx_sdio_request, //处理来自块层的请求,主要是对命令的处理,把数据放在sg中,或从sg中读出
.set_ios = xxx_sdio_set_ios, //设置卡的状态,包括,1.电源开关, 2.时钟频率设置,3.总线宽度设置
.get_ro = xxx_get_ro, //卡只读属性
.get_cd = xxx_card_present, //卡是否存在
};
struct xxx_host{
unsigned int clk_rate;
struct mmc_host *mmc;
struct mmc_request *mrq;
struct mmc_command *cmd;
int irq;
struct completion complete_request;
struct completion complete_dma;
int bus_width;
unsigned int status;
...
};
probe中
{
mmc = mmc_alloc_host(sizeof(struct xxx_host), &pdev->dev);
mmc->ops = &xxx_ops;
mmc->ocr_avail = host->pdata->ocr_avail;
mmc->caps = MMC_CAP_4_BIT_DATA;
mmc->f_min = host->clk_rate / (host->clk_div * 256);
mmc->f_max = host->clk_rate / host->clk_div;
mmc->max_blk_count = 4095;
mmc->max_blk_size = 4095;
mmc->max_req_size = 4095 * 512;
mmc->max_seg_size = mmc->max_req_size;
mmc_add_host(mmc);
dev_set_drvdata(dev, mmc);
mmc->max_phys_segs = 128;
mmc->max_hw_segs = 128;
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86768/showart_2164343.html |
|