这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 芯灵思Sinlinx A33开发板 Linux中断编程 1--- 原理说明

共3条 1/1 1 跳转至

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

助工
2019-01-31 17:27:22     打赏

本节实验目标实现按键触发中断终端显示按键松开或按下

实验平台 芯灵思Sinlinx A33 开发板

.。。。。。。。。。。。。。。。


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



这里全志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 

不知道开发板用的哪个平台,直接在.config中找

由此找到芯片在内核中的中断号

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 口相关的内核 APIexmple: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。





管理员
2019-02-01 09:20:31     打赏
2楼

谢谢楼主分享


院士
2019-02-01 13:42:35     打赏
3楼

楼主啊!

linux这些硬件的头文件的文档结构是如何啊?

为什么您了知道这个结构体在哪里定义的啊?


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]