SD卡驱动之中断函数

本文详细介绍了SD卡驱动的中断处理函数s3cmci_irq,包括读取和清除中断状态,处理SDIO中断、命令超时、响应接收、FIFO错误等情况,确保数据传输的正确性和完整性。
摘要由CSDN通过智能技术生成
 

static irqreturn_t s3cmci_irq(int irq, void *dev_id)
{
 struct s3cmci_host *host = dev_id;
 struct mmc_command *cmd;

//SDI命令状态寄存器,数据状态寄存器,FIFO状态寄存器,数据持续计数器寄存器,中断屏蔽寄存器。
 u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt, mci_imsk;


 u32 mci_cclear = 0, mci_dclear;
 unsigned long iflags;

//获取数据状态寄存器和中断屏蔽寄存器的值

 mci_dsta = readl(host->base + S3C2410_SDIDSTA);
 mci_imsk = readl(host->base + host->sdiimsk);

 

 if (mci_dsta & S3C2410_SDIDSTA_SDIOIRQDETECT) {//如果发生了中断继续下一步
  if (mci_imsk & S3C2410_SDIIMSK_SDIOIRQ) {//IntDet 中断使能。

       mci_dclear = S3C2410_SDIDSTA_SDIOIRQDETECT;//清除中断发现的值
       writel(mci_dclear, host->base + S3C2410_SDIDSTA);

   mmc_signal_sdio_irq(host->mmc);//发现了SD后的相关程序
   return IRQ_HANDLED;
  }
 }

 spin_lock_irqsave(&host->complete_lock, iflags);//获取锁和中断状态

 mci_csta = readl(host->base + S3C2410_SDICMDSTAT);//获取命令状态状态寄存器
 mci_dcnt = readl(host->base + S3C2410_SDIDCNT);//获取数据持续计数寄存器
 mci_fsta = readl(host->base + S3C2410_SDIFSTA);//获取FIFO状态寄存器
 mci_dclear = 0;

 if ((host->complete_what == COMPLETION_NONE) ||
     (host->complete_what == COMPLETION_FINALIZE)) {
  host->status = "nothing to complete";//如果host->complete_what的值等于COMPLETION_NON

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值