0> 实验目的:
实现key1一个按键的中断。
思路:
在裸板时【irq异常处理2》Key】我们需要:1》初始化按键2》注册中断3》实现中断处理函数。
现在有了内核,已将提供了一套注册中断的函数。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1> 中断注册函数:
request_irq(unsigned int irq, //中断号
irq_handler_t handler, //中断处理函数
unsigned long flags, //中断类型标记
const char *name, //cat /proc/interrupts
void *dev //1》存私有数据, 传给中断处理函数的第2个参数,cookie点心
)
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2>中断处理函数的实现:
/Linux-3.5/include/linux/irqreturn.h
enum irqreturn {
IRQ_NONE = (0 << 0), //中断信号不是来自此设备
IRQ_HANDLED = (1 << 0), //成功处理
IRQ_WAKE_THREAD = (1 << 1), //?????
};
typedef enum irqreturn irqreturn_t;
typedef
irqreturn_t (*irq_handler_t) (int, void *);
irqreturn_t irq_handler(int irq_num, void *dev);
@irq_num: 中断号,只是打印时用下。
@dev: 中断注册函数传过来的参数。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
只需2个函数成功实现按键中断。
3>疑问:
1》与裸板相比:没了按键初始化,怎么可以产生中断呢?
答:这就是神奇中断号,三星已将内部中断和外部中断的中断号进行了统一编号,并且当你获得中断号时,已将代表把相关寄存器初始化好,不过触发方式没设定,所以就需要flags来标记。
中断号获取:
以key1为例子:
硬件原理图得: XEINT26/GPX3_2
1》GPIO编号= EXYNOS4_GPX3(2);//内核也将所有的GPIO也进行了统一编号
2》中断号=
gpio_to_irq(GPIO编号);//将GPIO转换为中断号。
2》中断类型标记:
IRQ_TYPE_EDGE_BOTH //双边沿
IRQF_TRIGGER_RISING //上升沿
IRQF_TRIGGER_FALLING //下降沿
NOTE:注意区分与裸板的中断号。
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4>释放资源:
void free_irq(unsigned int irq, voie *dev_id);
中断号不共享:
删除中断处理程序同时释放中断号。
中断共享:
删除最后一个处理函数时才释放中断号。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
总结:
对比裸板时的中断注册,理解内核中断的注册,关于如何获得Exynos4412的硬件资源需单独写个笔记总结,这儿简单了解。
实例:irq1.txt