s3c2410按键驱动完整版

上传人:新** 文档编号:470044002 上传时间:2023-05-01 格式:DOC 页数:18 大小:39.50KB
返回 下载 相关 举报
s3c2410按键驱动完整版_第1页
第1页 / 共18页
s3c2410按键驱动完整版_第2页
第2页 / 共18页
s3c2410按键驱动完整版_第3页
第3页 / 共18页
s3c2410按键驱动完整版_第4页
第4页 / 共18页
s3c2410按键驱动完整版_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《s3c2410按键驱动完整版》由会员分享,可在线阅读,更多相关《s3c2410按键驱动完整版(18页珍藏版)》请在金锄头文库上搜索。

1、/* 2410 中断按键驱动*基于s3c2410的16个按键驱动,采用中断的方式,实现了阻塞和非阻塞,并用定时*器进行了消抖处理消抖,也实现的异步通知,POLL机制,每个源文件我都加了比较 详细的注释.各位刚刚学习ARM/Linux 驱动的同学可以参考。/ button_irq_driver 。c 驱动源文件 / button_irq_test.c 应用程序-按键测试(open可实现阻塞和非阻塞)/ button_poll_test。c 应用程序poll机制按键测试/ button_fasync。c 应用程序-异步通知方式按键测试/ button_irq_driver 。c /#include

2、linux/module。h#include#includeincludelinux/device.hincludelinux/cdev。h#includeasm/uaccess.hincludelinux/io.h#includelinux/interrupt.h#includeincludestatic unsigned int buttons_major = 0;/本地结构体,表示一个按键struct fsbuttons_cdevstruct cdev buttons_cdev; /按键设备结构体struct class buttons_class;/所属类unsigned int ke

3、y_buttons; /按键管脚电?1 /0wait_queue_head_t buttons_wq;struct timer_list button_timer;;static struct fsbuttons_cdev *fs_buttons ;/构建一个结构体,用来描述中断管脚struct fspinint irq;int pin;char name;int num;int row_input;int row_output;int int_put;int key_val;;static struct fspin fspin_desc4=IRQ_EINT0,S3C2410_GPF0,”ro

4、w0, 0, S3C2410_GPF0_INP,S3C2410_GPF0_OUTP,S3C2410_GPF0_EINT0,IRQ_EINT2,S3C2410_GPF2,”row1, 1, S3C2410_GPF2_INP, S3C2410_GPF2_OUTP,S3C2410_GPF2_EINT2,IRQ_EINT11,S3C2410_GPG3,”row2, 2,S3C2410_GPG3_INP, S3C2410_GPG3_OUTP,S3C2410_GPG3_EINT11,IRQ_EINT19,S3C2410_GPG11,row3,3, S3C2410_GPG11_INP, S3C2410_GP

5、G11_OUTP,S3C2410_GPG11_EINT19,;struct pin_col int pin;int col_input;int col_output;;static struct pin_col col_line4 = S3C2410_GPE11,S3C2410_GPE11_INP,S3C2410_GPE11_OUTP,S3C2410_GPG6,S3C2410_GPG6_INP,S3C2410_GPG6_OUTP,S3C2410_GPE13,S3C2410_GPE13_INP,S3C2410_GPE13_OUTP,S3C2410_GPG2,S3C2410_GPG2_INP,S3

6、C2410_GPG2_OUTP,;static int key_comfirm44=10,11,12,16,7,8,9,15,4,5,6,14,1,2,3,13,;/构建异步通知注册函数用到的结构体*/struct fasync_struct fsbuttons_fasync;struct fspin *cur_pin;static void set_col_output(void)int i;for(i = 0;ipin);if(val_sec != cur_pinkey_val)return IRQ_NONE;row = cur_pin-num;/*将发生中断的引脚配置为输出低电平*/s3

7、c2410_gpio_cfgpin(cur_pinpin, cur_pin-row_output);s3c2410_gpio_setpin(cur_pin-pin, 0);/将kscan0-kscan3设为输入并拉高/set_col_input();/ 轮询列线,看哪个管脚为0,为0的那列保存起来/for(i = 0;i4;i+)if(s3c2410_gpio_getpin(col_linei.pin) = 0)col = i;/根据列线与行线保存键值*/fs_buttonskey_buttons= key_comfirmrowcol;/恢复/将列线恢复为输出,并且输出为0/set_col_o

8、utput();/*将产生中断的管脚,再次恢复为中断功能/s3c2410_gpio_cfgpin(cur_pinpin,cur_pinint_put);/唤醒休眠的进程*/wake_up_interruptible(fs_buttons-buttons_wq));/*异步通知,发信号/kill_fasync(&fsbuttons_fasync, SIGIO, POLLIN);return IRQ_HANDLED;/typedef int irqreturn_t;/#define IRQ_NONE(0)/处理失败/define IRQ_HANDLED(1)/处理成功/#define IRQ_RE

9、TVAL(x)(x) != 0)/无效的static irqreturn_t buttons_irq_handler_fun(int irq, void dev_id)cur_pin = (struct fspin )dev_id;/获取管脚状态/cur_pin-key_val= s3c2410_gpio_getpin(cur_pinpin);/有键按 键按下/if(cur_pinkey_val= 0)/*重载定时器*/mod_timer(fs_buttons-button_timer, jiffies +5);returnIRQ_HANDLED;static int buttons_open

10、(struct inode inode, struct file file)int i ;int ret = -1;/*初始化设备/设置 kscan0 引脚 为输出.输出为0*/set_col_output();/*注册中断 ,下降沿触发,中断 名,中断id/for(i =0 ;i4;i+)ret = request_irq(fspin_desci。irq, buttons_irq_handler_fun, IRQF_TRIGGER_FALLING, fspin_desci.name, fspin_desci);/*初始化定时器*/init_timer(fs_buttons-button_ti

11、mer);fs_buttons-button_timer。expires= jiffies +5;fs_buttonsbutton_timer。function =(void *)button_timer_fun;/*加载定时器*/add_timer(fs_buttonsbutton_timer);/初始化 等待队列头*/init_waitqueue_head(&fs_buttonsbuttons_wq);return 0;static ssize_t buttons_read(struct file filp, char _user *buf, size_t count, loff_t *o

12、pps)int ret;/1。如果没有按键,而且应用程序是以非阻塞方式打开,就直接返回/if((fs_buttonskey_buttons = 0) (filp-f_flags & O_NONBLOCK)return 0;/*1.如果没有键值key_buttons = 0 ,则休眠*/wait_event_interruptible(fs_buttonsbuttons_wq,fs_buttons-key_buttons);/2。如果有键值,将键值返回用户空间/如果拷贝成功则返回0,否则返回剩下的没有拷贝完的字节数*/ret = copy_to_user(buf, fs_buttons-key_buttons, count);fs_buttonskey_b

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 电气技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号