外部中断按键驱动
来源:互联网 发布:python数据类型有哪些 编辑:程序博客网 时间:2024/05/23 19:13
我的开发板上一共有四个按键,分别影射到GPF0、GPF2、GPG3、GPG11,当按下按键时分别产生0、2、11、19号外部中断。由于没有安装驱动,当按下按键时,没有任何反应。所以需要编写一个驱动,将四个按键驱动起来。
下面是我写的按键驱动的小例子,功能很简单,当按下按键时打印出“key n(n = 1~4) is pressed!”的消息。
/********************************************************************
' 创建日期: 2006/05/04
' 文件名称: keyboard_demo.c
' 文件作者: Gene.Shao (E-Mail To: sjiang1981@163.com)
'
' 文件功能: 按键驱动
' 文件描述: 开发板上一共有四个按键,分别影射到GPF0、GPF2、GPG3、GPG11,
当按下按键时分别产生0、2、11、19号外部中断。这个驱动十分简
单,它仅仅是在按下了按键后打印出一串消息。如果希望按下按键
后做一些更有意义的事,需要改写中断处理程序key_irq。
*********************************************************************/
#i nclude <linux/config.h>
#i nclude <linux/module.h>
#i nclude <linux/kernel.h>
#i nclude <linux/init.h>
#i nclude <linux/miscdevice.h>
#i nclude <linux/sched.h>
#i nclude <linux/delay.h>
#i nclude <linux/poll.h>
#i nclude <linux/spinlock.h>
#i nclude <linux/irq.h>
#i nclude <linux/delay.h>
#i nclude <asm/hardware.h>
/*
总共4个按键,当按下按键时,分别产生0,2,11,19号中断。
IRQ_EINTx在../include/asm-arm/arch-s3c2410/irqs.h中定义。
GPIO_xx在../include/asm-arm/arch-s3c2410/S3C2410.h中定义。
*/
static struct key_info {
int irq_no;
unsigned int gpio_port;
int key_value;
} key_info_tab[4] = {
{ IRQ_EINT0, GPIO_F0, 1}, //第一个按键
{ IRQ_EINT2, GPIO_F2, 2}, //第二个按键
{ IRQ_EINT11, GPIO_G3, 3}, //第三个按键
{ IRQ_EINT19, GPIO_G11, 4}, //第四个按键
};
//中断处理程序
static void key_irq(int irq, void *dev_id, struct pt_regs *reg)
{
struct key_info *k;
int i;
//扫描按键表,根据中断号,找出所按下的按键。
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
if (k->irq_no == irq) {
printk("key %d is pressed!/n", k->key_value);
break;
}
}
return;
}
//初始化
static int __init keyboard_init(void)
{
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
//设置与外部中断号相对应的GPIO端口,上升沿和下降沿各产生一个中断,禁用pull-up.
//set_external_irq是在../kernel/arch/arm/mach-s3c2410/iqr.c中定义的。
set_external_irq(k->irq_no, EXT_FALLING_EDGE, GPIO_PULLUP_DIS);
// 请求中断,所有的按键都使用同一个中断处理程序。中断处理程序根据中断号确定按下的是哪一个按键。
if (request_irq(k->irq_no, &key_irq, SA_INTERRUPT, "keyboard_demo", NULL)) {
printk("request irq failed!/n");
return -1;
}
}
return 0;
}
//退出
static void __exit keyboard_exit(void)
{
struct key_info *k;
int i;
//释放中断号
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
free_irq(k->irq_no, key_irq);
}
}
module_init(keyboard_init);
module_exit(keyboard_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Gene.Shao (sjiang1981@163.com)");
由于按键不具有I/O功能,它只会在按下的时候产生中断,所以这里不需要实现open,read,write,ioctl等功能,这样整个程序也就十分简单。uclinux不支持动态加载内核模块,需要将驱动程序静态编译进内核:
1. 将keyboard_demo.c拷贝到../kernel/drivers/char/目录下。
2. 在../kernel/drivers/char/Makefile中添加:obj-$(CONFIG_KEYBOARD_DEMO) += keyboard_demo.o。
3. 在../kernel/drivers/char/Config.in中添加:dep_tristate 'Support keyboard demo' CONFIG_KEYBOARD_DEMO。
4. 在../kernel目录下make menuconfig, 选择Character devices,会看到'Support keyboard demo'选项,这一项就是我的键盘驱动。
- 外部中断按键驱动
- 基于mini2440外部中断的按键驱动
- GEC210(S5PV210)裸机驱动之按键(外部)中断
- 按键与外部中断
- TMS320F28335---外部按键中断
- STM32按键扫描/按键中断/外部中断
- fl2440按键中断驱动
- 按键中断驱动实例
- s3c6410中断按键驱动
- s5pc100中断按键驱动
- TQ2440 中断按键驱动
- OK6410 按键中断驱动
- 按键中断驱动
- 按键中断驱动
- 按键中断驱动
- mtk 按键中断驱动
- 中断按键驱动
- 驱动-按键-中断模式
- 最重要 学好
- 基础:构造方法
- 初识struts
- 做生意
- linux内存管理之伙伴系统分析(大内存分配)
- 外部中断按键驱动
- request.getContextPath(),绝对路径,request.getRealPath
- 随记
- python中的多行字符串及文档字符串
- 【转】const和volatile 【特别经典,一定要看哦】
- Java中static、this、super、final用法简谈(一)
- Java中static、this、super、final用法简谈(二)
- Java中static、this、super、final用法简谈(三)
- 暑假开源项目的几个策划