Linux 按键驱动程序设计

一。混杂设备驱动模型

  1. 混杂设备驱动描述

    在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。

    所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。

    Linux中使用struct miscdevice来描述一个混杂设备。

    struct miscdevice  

    {

      int minor;   /* 次设备号*/

      const char *name; /* 设备名*

      const struct file_operations *fops; /*文件操作*/

      struct list_head list;

      struct device *parent;

      struct device *this_device;

    }

  2. 混杂设备驱动注册

    Linux中使用misc_register函数来注册一个混杂设备驱动。

    int misc_register(struct miscdevice * misc)

  3. 范例驱动设计

    混杂设备驱动设计

二。 中断处理程序

  1. 裸机中断处理流程回顾  

    1. 中断统一入口

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

    3. 根据中断源编号,调用中断处理程序

  2. Linux中断处理流程分析

    1.  irq_svc 中断入口

    2. 拿到产生中断源的中断号

    3. 根据中断号找到相应的 irq_dese

    4. 取出事先注册好的处理函数

  3. Linux中断处理程序设计

    1. 注册中断

      request_irq函数用于注册中断。

      int request_irq(unsigned intirq,

              void (*handler)(int, void*, struct pt_regs *),  

              unsigned long flags,

              const char *devname, void *dev_id)

      返回0表示成功,或者返回一个错误码

      #unsigned intirq中断号。

      #void (*handler)(int,void *)中断处理函数。

      #unsigned longflags与中断管理有关的各种选项。

      #const char * devname设备名

      #void *dev_id共享中断时使用。

      在flags参数中,可以选择一些与中断管理有关的选项,如:

      •IRQF_DISABLED(SA_INTERRUPT)

        如果设置该位,表示是一个“快速”中断处理程序;

        如果没有设置这位,那么是一个“慢速”中断处理程序。

          快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。

          换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,

          因此在服务该中断时,不会被其他类型的中断打断;

          而调用慢速中断处理时,其它类型的中断仍可以得到服务。

      •IRQF_SHARED(SA_SHIRQ)

        该位表明该中断号是多个设备共享的。

    2. 中断处理

      1.中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

        1.不能使用可能引起阻塞的函数

        2.不能使用可能引起调度的函数

      2. 中断处理程序

        1. 检查设备是否产生了中断

        2. 清除中断产生的中断

        3. 相应的硬件操作

    3. 注销中断

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

      void free_irq(unsigned int irq, void *dev_id)

三 。按键驱动硬件操作实现

    

原文地址:https://www.cnblogs.com/lvxiaoning/p/5084924.html