s3c2410按键驱动完整版.doc_第1页
s3c2410按键驱动完整版.doc_第2页
s3c2410按键驱动完整版.doc_第3页
s3c2410按键驱动完整版.doc_第4页
s3c2410按键驱动完整版.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* 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#include#include#include#include#include#include#include#include#includestatic unsigned int buttons_major = 0;/本地结构体,表示一个按键struct fsbuttons_cdevstruct cdev *buttons_cdev; /按键设备结构体struct class *buttons_class;/所属类unsigned int key_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,row0, 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_GPG11_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,S3C2410_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;i4;i+)s3c2410_gpio_cfgpin(col_linei.pin, col_linei.col_output);s3c2410_gpio_setpin(col_linei.pin,0);static void set_col_input(void)inti;for(i = 0;ipin);if(val_sec != cur_pin-key_val)return IRQ_NONE;row = cur_pin-num;/*将发生中断的引脚配置为输出低电平*/s3c2410_gpio_cfgpin(cur_pin-pin, cur_pin-row_output);s3c2410_gpio_setpin(cur_pin-pin, 0);/*将kscan0-kscan3设为输入并拉高*/set_col_input();/* 轮询列线,看哪个管脚为0,为0的那列保存起来*/for(i = 0;ikey_buttons= key_comfirmrowcol;/*恢复*/*将列线恢复为输出,并且输出为0*/set_col_output();/*将产生中断的管脚,再次恢复为中断功能*/s3c2410_gpio_cfgpin(cur_pin-pin,cur_pin-int_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_RETVAL(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_pin-pin);/*有键按 键按下*/if(cur_pin-key_val= 0)/*重载定时器*/mod_timer(&fs_buttons-button_timer, jiffies +5);returnIRQ_HANDLED;static int buttons_open(struct inode *inode, struct file *file)int i ;int ret = -1;/*初始化设备*/*设置 kscan0 引脚 为输出。输出为0*/set_col_output();/*注册中断 ,下降沿触发,中断 名,中断id*/for(i =0 ;ibutton_timer);fs_buttons-button_timer.expires= jiffies +5;fs_buttons-button_timer.function =(void *)button_timer_fun;/*加载定时器*/add_timer(&fs_buttons-button_timer);/*初始化 等待队列头*/init_waitqueue_head(&fs_buttons-buttons_wq);return 0;static ssize_t buttons_read(struct file *filp, char _user *buf, size_t count, loff_t *opps)int ret;/*1.如果没有按键,而且应用程序是以非阻塞方式打开,就直接返回*/if(fs_buttons-key_buttons = 0) & (filp-f_flags & O_NONBLOCK)return 0;/*1.如果没有键值key_buttons = 0 ,则休眠*/wait_event_interruptible(fs_buttons-buttons_wq,fs_buttons-key_buttons);/*2.如果有键值,将键值返回用户空间*/*如果拷贝成功则返回0,否则返回剩下的没有拷贝完的字节数*/ret = copy_to_user(buf, &fs_buttons-key_buttons, count);fs_buttons-key_buttons = 0; /键值清0return 1;static ssize_t buttons_write(struct file *file, const char _user *buf, size_t count, loff_t *opps)return 0;/*异步通知*/int buttons_fasync(int fd, struct file *file , int on)int error = 0;/*想办法将file中的某些参数拿出来,实际上就是在设置fsbuttons_fasync结构体*/error = fasync_helper(fd, file, on, &fsbuttons_fasync);return error;static unsigned int buttons_poll(struct file * file, struct poll_table_struct *wait)int mask = 0;/*1.将进程挂入等待队列,但是并不休眠*/poll_wait(file, &(fs_buttons-buttons_wq), wait);/*2.查看是否有事件*/if(fs_buttons-key_buttons)mask |= POLLIN;return mask;int buttons_close(struct inode *inode, struct file *file)int i;for(i = 0;ibuttons_cdev = cdev_alloc();/*初始化*/cdev_init(fs_buttons-buttons_cdev, &buttons_fops);/*加载cdev*/cdev_add(fs_buttons-buttons_cdev, MKDEV(buttons_major,0), 1);static int _init buttons_init(void)int devno;/*申请设备号,注册*/if(buttons_major)/*静态方式*/devno = MKDEV(buttons_major,0);register_chrdev_region(devno, 1, buttons_driver);else/*动态方式*/alloc_chrdev_region(&devno, 0, 1, buttons_driver);buttons_major = MAJOR(devno);/*2.分配空间, *GFP_KERNEL:如果分配空间不成功,则会休眠 */fs_buttons=kmalloc(sizeof(fs_buttons), GFP_KERNEL);/*构建cdev*/setup_fsbuttons_cdev();/*创建设备文件*/fs_buttons-buttons_class = class_create(THIS_MODULE,buttons);class_device_create(fs_buttons-buttons_class, NULL, MKDEV(buttons_major,0), NULL, buttons);return 0;static void _exit buttons_exit(void)unregister_chrdev_region(MKDEV(buttons_major,0), 1);kfree(fs_buttons);cdev_del(fs_buttons-buttons_cdev);class_device_destroy(fs_buttons-buttons_class, MKDEV(buttons_major,0);class_destroy(fs_buttons-buttons_class);module_init(buttons_init);module_exit(buttons_exit);MODULE_LICENSE(GPL);/* button_irq_test.c */#include#include#include #include #include int main(void)int fd = -1;int val = -1;int ret = -1;/fd = open(/dev/buttons,O_RDWR|O_NONBLOCK);fd = open(/dev/buttons,O_RDWR);if(fd 0)perror(open);exit(-1);while(1)ret = read(fd,&val,4);if(ret 0)perror(read);exit(-1); printf(val = %dn,val);return 0;/* button_poll_test.c */#include#include#include #include #include #include int main(void)int fd = -1;int val = -1;int ret = -1;struct pollfd poll_fd1;/fd = open(/dev/buttons,O_RDWR|O_NONBLOCK);f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论