查看: 1957|回复: 0

芯灵思Sinlinx A33开发板 Linux中断编程 1--- 原理说明

[复制链接]
  • TA的每日心情
    奋斗
    2016-4-14 10:16
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2019-1-31 17:30:29 | 显示全部楼层 |阅读模式
    分享到:
    本节实验目标实现按键触发中断终端显示按键松开或按下
    实验平台 芯灵思Sinlinx A33 开发板
    1.PNG
    step1 查看原理图,三个按键都连接到LRADC0引脚,通过判断电压大小来确定是按的哪个键。
    step2 内核关于 CPU 的中断号linux 中断注册函数中的 irq 中断号并不是芯片物理上的编号,而是由芯片商在移植 Linux 系统时定在构架相
    关的头文件中定义好的, 在内核源码中,名字一般是 irqs.h。
          打开vim /root/work/sinlinx/a33/lichee/linux-3.4/arch/arm/mach-sunxi/include/mach/irqs.h
    2.PNG
    这里全志A33 是#include "sun8i/irqs-sun8iw5p1.h"
    打开vim /root/work/sinlinx/a33/lichee/linux-3.4/arch/arm/mach-sunxi/include/mach/sun8i/irqs-sun8iw5p1.h
    3.PNG
    不知道开发板用的哪个平台,直接在.config中找
    4.PNG
    由此找到芯片在内核中的中断号
    step 3  简要介绍中断驱动要用到的函数
    查看 irq.h 文件  里面有关于中断的函数结构体声明 /root/work/sinlinx/a33/lichee/linux-3.4/include/linux/irq.h
    /**
    * struct irq_data - per irq and irq chip data passed down to chip functions
    * @irq:                interrupt number
    * @hwirq:              hardware interrupt number, local to the interrupt domain
    * @node:               node index useful for balancing
    * @state_use_accessors: status information for irq chip functions.
    *                      Use accessor functions to deal with it
    * @chip:               low level interrupt hardware access
    * @domain:             Interrupt translation domain; responsible for mapping
    *                      between hwirq number and linux irq number.
    * @handler_data:       per-IRQ data for the irq_chip methods
    * @chip_data:          platform-specific per-chip private data for the chip
    *                      methods, to allow shared chip implementations
    * @msi_desc:           MSI descriptor
    * @affinity:           IRQ affinity on SMP
    *
    * The fields here need to overlay the ones in irq_desc until we
    * cleaned up the direct references and switched everything over to
    * irq_data.
    */
    struct irq_data {
            unsigned int            irq;
            unsigned long           hwirq;
            unsigned int            node;
            unsigned int            state_use_accessors;
            struct irq_chip         *chip;
            struct irq_domain       *domain;
            void                    *handler_data;
            void                    *chip_data;
            struct msi_desc         *msi_desc;
    #ifdef CONFIG_SMP
            cpumask_var_t           affinity;
    #endif
    };
    struct irqaction 结构体在 /root/work/sinlinx/a33/lichee/linux-3.4/include/linux/interrupt.h

    /**
    * struct irqaction - per interrupt action descriptor
    * @handler:    interrupt handler function
    * @flags:      flags (see IRQF_* above)
    * @name:       name of the device
    * @dev_id:     cookie to identify the device
    * @percpu_dev_id:      cookie to identify the device
    * @next:       pointer to the next irqaction for shared interrupts
    * @irq:        interrupt number
    * @dir:        pointer to the proc/irq/NN/name entry
    * @thread_fn:  interrupt handler function for threaded interrupts
    * @thread:     thread pointer for threaded interrupts
    * @thread_flags:       flags related to @thread
    * @thread_mask:        bitmask for keeping track of @thread activity
    */
    struct irqaction {
            irq_handler_t           handler;      中断服务函数 handler
            unsigned long           flags;
            void                    *dev_id;
            void __percpu           *percpu_dev_id;
            struct irqaction        *next;
            int                     irq;
            irq_handler_t           thread_fn;
            struct task_struct      *thread;
            unsigned long           thread_flags;
            unsigned long           thread_mask;
            const char              *name;
            struct proc_dir_entry   *dir;

    } ____cacheline_internodealigned_in_smp;
    在interrupt.h 中有许多和中断相干的函数
    exmple:
    request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)
    功能  向内核注册一个中断服务函数,当发生中断号为 irq 的中断时候,会执行 handler 指针函数

    void free_irq(unsigned int irq, void *dev_id)
    功能 从内核中断链表上删除一个中断结构
    void disable_irq(unsigned int irq)

    功能  关闭指定的中断,并等待中断服务函数运行结束后才会返回, 在中断函数外调用,
    不能在中断服务程序中调用。
    void disable_irq_nosync(unsigned int irq)
    功能  关闭指定的中断,不等待中断服务函数结束,调用完这个函数立即返回。 可以中断服务函数

    中调用。
    void enable_irq(unsigned int irq)
    功能  使能指定的中断
    宏 local_save_flags(flags)
    功能  禁止本 CPU 全部中断,并保存 CPU 状态信息。
    宏local_irq_disable()

    功能 禁止本 CPU 全部中断

    Linux 内核和 GPIO 口相关的内核 API
    exmple:
    static inline int gpio_get_value(unsigned int gpio)
    功能  获取指定 IO 口的电平状态
    返回  IO 电平状态,非 0:表示高电平 , 0 表示低电平

    static inline void gpio_set_value(unsigned int gpio, int value)
    功能  设置 gpio 口的电平状态为 value
    返回  IO 电平状态,非 0:表示高电平 , 0 表示低电平

    static inline int gpio_to_irq(unsigned int gpio)
    功能  通过 gpio 口编号获得出现这个 IO 上的外部中断编号
    返回  这个 IO 上对应的外部中断编号



    step 4关于 Linux 中断共享
    共享中断是指多个设备共享一根中断线的情况, 在中断到来时,会遍历共享此中断的所有中断处理程序, 直

    到某一个中断服务函数时返回 IRQ_HANDLED。


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 20:32 , Processed in 0.119163 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.