zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看