按键驱动(一)-中断

来源:互联网 发布:淘宝买黄金项链可靠吗 编辑:程序博客网 时间:2024/05/18 03:06

  想写linux的按键驱动,那么需要补充许多的基础知识,比如linux的中断申请,linux 等待队列,linux定时器、异步通知等。我们会依依的简单复习一下。我们再来明确一下目标,一会就奔着目标去。
  目标:按键通过中断,异步通知上层应用,驱动点亮led并上报按下的状态。

   Linux中断子系统向驱动程序提供了一系列的API,其中的一个用于向系统申请中断:这时内核2.6.30之后的api,内核版本不断变化,api也会变,但是用法基本上一样,大框架变化不大,不知道怎么怎么变化的时候,就参考你自己用的内核,内核自带的一些驱动程序,看看就好了,只要有基础。

int request_threaded_irq(unsigned int irq, irq_handler_t handler,rq_handler_t thread_fn, unsigned long irqflags,const char *devname, void *dev_id)  
  • irq是要申请的IRQ编号,
  • handler是中断处理服务函数,该函数工作在中断上下文中,如果不需要,可以传入NULL,但是不可以和thread_fn同时为NULL;
  • thread_fn是中断线程的回调函数,工作在内核进程上下文中,如果不需要,可以传入NULL,但是不可以和handler同时为NULL;
  • irqflags是该中断的一些标志,可以指定该中断的电气类型,是否共享 等信息;
  • devname指定该中断的名称;
  • dev_id用于共享中断时的cookie data,通常用于区分共享中断具体由哪个设备发起;
      我写程序需要用韦东山的JZ2440,我直接用的linux-2.6.22.6的内核,中断注册函数为:
int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
  • irq是要申请的硬件中断号。
  • handler是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。
  • irqflags是中断处理的属性。
  • devname设置中断名称,通常是设备驱动程序的名称 在cat /proc/interrupts中可以看到此名称。
  • dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。
  • request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。
      其实基本上差不多的,看看就好了,问题不大。

      还有一些接口,我能就先按按照我用的内核进行说吧。

/*有申请注册就有一个注销释放*/void free_irq(unsigned int irq, void *dev_id);/*中断处理函数,名字可以任意,只要利用中断申请函数绑定就好了,假设我们按下按键,linux收到中断就会进入这个处理程序*/static irqreturn_t key_interrupt(int irq, void *dev_id)

  最后我们写程序的时候就是,利用request_irq向内核注册中断和key_interrupt函数进行绑定。最终的使用,后来我会写个完整的程序的。这样最基本的中断就书写完毕,要想深入还需要慢慢的积累。

原创粉丝点击