免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1178 | 回复: 0
打印 上一主题 下一主题

sd驱动写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-29 18:16 |只看该作者 |倒序浏览

                               
               
                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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP