a33 linux 硬解码_全志A33 lichee 开发板 Linux中断编程原理说明

image

开发平台

* 芯灵思SinlinxA33开发板

image

嵌入式linux 开发板交流 QQ:641395230

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

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

image

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

image

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

image

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

image

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值