按键驱动编程

回顾裸机中断处理流程

  • 中断处理入口
  • 事先注册中断处理程序
  • 根据中断源编号调用中断处理程序

Linux中

  1. irq_svc:
  2. 拿到产生中断的编号(中断号)
  3. 根据中断号找到irq_desc
  4. 取出事先注册好的中断处理程序

驱动实现什么:

  1. 注册中断
  2. 实现中断处理程序
  3. 注销处理

注册中断处理程序:使用request_irq

int request_irq(unsigned int irq,void (*handler)(int, void*, structpt_regs *),
        unsigned long flags,const char *devname,void *dev_id)
返回0表示成功,或者返回一个错误码

irq : 中断编号
void (*handler)(int, void*, structpt_regs *) : 中断处理函数
unsigned long flags : 与中断处理有关的相关选项 比如:IRQF_DISABLED说明是快速中断
const char *devname : 设备名
void *dev_id : 共享中断时使用

中断处理函数的两个原则:

  • 不能使用可能引起阻塞的函数
  • 不能使用可能引起调度的函数

注销中断:

当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们注销, 使用函数:
void free_irq(unsigned int irq, void *dev_id)