poll机制按键驱动

上传人:hs****ma 文档编号:500847200 上传时间:2022-11-11 格式:DOCX 页数:21 大小:62.32KB
返回 下载 相关 举报
poll机制按键驱动_第1页
第1页 / 共21页
poll机制按键驱动_第2页
第2页 / 共21页
poll机制按键驱动_第3页
第3页 / 共21页
poll机制按键驱动_第4页
第4页 / 共21页
poll机制按键驱动_第5页
第5页 / 共21页
点击查看更多>>
资源描述

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

1、Poll 机制按键驱动实验器材:ok6410 开发板RedHat5.0实验目的:利用poll机制来测试按键驱动实验原理:XEINTO/KPROVVO/GPWOXEINT1/KPROW1/GPMXEINT2/KPROW2/GW2XEINT3/KPROW3/GPW3XEINT4/KPROW4/GPW4XEINT5/KPROW5/GPW5XEINT6/KPROW6/GPfJ6XEINT7/KPROW7/GPW7XHMT8/GPW8XINT9/GPfJ9XEIfTTlO/GPNlOXIll/GPNllXEIfTT12/GPN12XEI13/GPN13XEIfTT14/GPN14V10AD17AB17A

2、E18AC18VllAC19W12AE19AB18AD19V12AE20W13AD20AE17KEYIhTT3 KEYIhTT4 KEYIhTTS KEYIhTT6 MMCCCDN IRQ_LAN EINT8 EINT9 EINT10 EINT11 EINT12 EINT13 EINT14 EINT15XEI15/GPN15从上可以得出: 当按键没有按下时,为高电平; 当按下时,为低电平 S2-7按键分别对应的是外部中断XEINT0-5 驱动程序:#include #include #include #include #include #include #include #include #i

3、nclude #include #include #include #include #include #include #define GPNCON 0x7F008830#define GPNDAT 0x7F008834volatile unsigned long *s3c6410_GPNCON;volatile unsigned long *s3c6410_GPNDAT;static struct class *mythird_key_class;static struct device *mythird_key_class_dev;static DECLARE_WAIT_QUEUE_HE

4、AD(key_waitq); /定义一 个等待队列头/*中断事件标志,中断服务程序将它置4r ead函数将它置0*/ static volatile int ev_press = 0;/* 键值:按下时,0x01, 0x02, 0x03, 0x04, 0x05, 0x06 */* 键值: 松开时, 0x81, 0x82, 0x83, 0x84 ,0x85, 0x86 */ static unsigned int keyvals;struct mythird_keyunsigned int irq_no;unsigned int key_val;unsigned int num;char *na

5、me;static struct mythird_key third_keys6 =IRQ_EINT(0), 0x01, 0, KEY1 ,IRQ_EINT(1), 0x02, 1, KEY2 ,IRQ_EINT(2), 0x03, 2, KEY3 ,IRQ_EINT(3), 0x04, 3, KEY4 ,IRQ_EINT(4), 0x05, 4, KEY5 ,IRQ_EINT(5), 0x06, 5, KEY6 ,;static irqreturn_t mykey_handle(int irq, void *dev_id)int num;unsigned int tmp;unsigned i

6、nt pinval;struct mythird_key *pindesc = (struct mythird_key *)dev_id;num = pindesc-num;tmp = readl(S3C64XX_GPNDAT);pinval = (tmp & (1key_val | 0x80;else /按下keyvals = pindesc-key_val;ev_press = 1;wake_up_interruptible(&key_waitq);return IRQ_RETVAL(IRQ_HANDLED);static int mythird_key_open(struct inode

7、 *inode, struct file *file)/* 配置 GPN0-5 为中断引脚*/int i = 0;int err;for(i = 0; i sizeof(third_keys)/sizeof(third_keys0); i+)err = request_irq(third_keysi.irq_no, mykey_handle,IRQ_TYPE_EDGE_BOTH,third_keysi.name, (void*)&third_keysi);return 0;static int mythird_key_close(struct inode *inode, struct file

8、 *file) int i= 0;for(i = 0; i sizeof(third_keys)/sizeof(third_keys0); i+ )free_irq(third_keysi.irq_no, (void*)&third_keysi);return 0;static int mythird_key_read(struct file *file, char _user *buf,size_t size, loff_t *offp)if(size != 1)return -EINVAL;/*如果没有按键按下, 就休眠*/ wait_event_interruptible(key_wai

9、tq, ev_press);/*如果有按键按下, 就唤醒*/ev_press = 0;copy_to_user(buf, &keyvals, 1);return 1;static unsigned mythird_key_poll(struct file *file, poll_table *wait)unsigned int mask = 0;poll_wait(file, &key_waitq, wait); / 只 是 将 进 程 挂 到 key_waitq 队列, 并不会休眠if(ev_press)mask |= POLLIN | POLLRDNORM;return mask;stat

10、ic struct file_operations mythird_key =.owner= THIS_MODULE,.open= mythird_key_open,.read= mythird_key_read,.release= mythird_key_close,.poll= mythird_key_poll,;static int major;static int _init mythird_key_init(void)major = register_chrdev(0, mythird_key, &mythird_key);mythird_key_classclass_create(

11、THIS_MODULE,mythird_key); mythird_key_class_dev = device_create(mythird_key_class,NULL, MKDEV(major, 0), NULL, key);s3c6410_GPNCON = (volatile unsigned long *)ioremap(GPNCON, 16);s3c6410_GPNDAT = s3c6410_GPNCON + 1;return 0;static void _exit mythird_key_exit(void)unregister_chrdev(major,mythird_key)

12、;device_destroy(mythird_key_class, MKDEV(major, 0);class_destroy(mythird_key_class);iounmap(s3c6410_GPNCON);module_init(mythird_key_init);module_exit(mythird_key_exit);MODULE_LICENSE(GPL);测试程序:#include #include #include #include int main()int fd;int ret;unsigned int keyvals;struct pollfd fds1;我们只需要监

13、控一个fd = open(/dev/key, O_RDWR);if(fd 0)printf(open key error!n);return -1;fds0.fd = fd; /需要监控是那个fds0.events = POLLIN; / 等待数据去读while(1)ret = poll(fds, 1, 5000);if(ret = 0)/超时printf(time outn);elseread(fd, &keyvals, 1 );printf(keyvals = 0x%xn,keyvals);return 0;Makefile:KERN_DIR = /root/li nux2 6.28(前提是 Iinux2 6.28 要编译好) all:make -C $(KERN_DIR) M=pwd modulesclean:make -C $(KERN_DIR) M=pwd modules clea nrm -rf modules.orderobj-m +=mythird_key.o实验结果:# . /mytlri rd_keytest&# t

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

当前位置:首页 > 学术论文 > 其它学术论文

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