S5PV210(TQ210)学习笔记——按键驱动程序
测试程序代码:
- #include
- #include
- intmain(){
- intfd=open("/dev/buttons",O_RDWR);
- if(fd<0){
- printf("openerror");;
- return0;
- }
- unsignedcharkey;
- while(1){
- read(fd,&key,1);
- printf("Thekey=%x",key);
- }
- close(fd);
- }
相比轮询方式的按键驱动程序,中断方式编写的按键驱动程序可以很大程度上节省CPU资源,因此,推荐使用中断方式。
二 支持POLL机制
上面这种方式实现的按键驱动程序有个弊端,如果我们不按键,应用程序将会永远阻塞在这里,幸运的是,linux内核提供了poll机制,可以设置超时等待时间,如果在这个时间内读取到键值则正常返回,反之则超时退出。使内核支持poll非常简单,为file_operations的poll成员提供poll处理函数即可。
使内核支持poll还需要以下几步:
添加poll头文件
- #include
编写poll处理函数:
- staticunsignedbuttons_poll(structfile*file,poll_table*wait){
- unsignedintmask=0;
- poll_wait(file,&button_waitq,wait);
- if(pressed)
- mask|=POLLIN|POLLRDNORM;
- returnmask;
- }
- .poll=buttons_poll,
- #include
- #include
- #include
- #include
- #include
- intmain(intargc,char**argv){
- intfd;
- unsignedcharkey_val;
- intret;
- structpollfdfds[1];
- fd=open("/dev/buttons",O_RDWR);
- if(fd<0){
- printf("cantopen!");
- }
- fds[0].fd=fd;
- fds[0].events=POLLIN;
- while(1){
- ret=poll(fds,1,5000);
- if(ret==0){
- printf("timeout");
- }
- else{
- read(fd,&key_val,1);
- printf("key_val=0x%x",key_val);
- }
- }
- return0;
- }
这样,应用程序可以限制时间,如果在一定时间内读取不到键值就可以做特殊处理,这种思想在网络通信中应用广泛。
三 支持异步机制
很多情况下,我们的程序在等待按键期间需要处理其它任务而不是在这里空等,这时,就需要采用异步模式了。所谓异步模式,实际上是采用消息机制(以本文的按键程序为例),即当驱动程序检测到按键后发送消息给应用程序,应用程序接收到消息后再去读取键值。与前面的两种模式相比,最大的不同在于异步方式是驱动告诉应用程序来读而不是应用程序主动去读。添加异步支持更加简单,首先是为file_operations注册fasync函数,函数内容如下:
- staticintbuttons_fasync(intfd,structfile*file,inton){
- returnfasync_helper(fd,file,on,&button_async);
- }
- staticssize_tbuttons_read(structfile*file,char__user*data,size_tcount,loff_t*loff){
- if(count!=1){
- printk(KERN_ERR"Thedrivercanonlygiveonekeyvalueonce!");
- return-ENOMEM;
- }
- wait_event_interruptible(button_waitq,pressed);
- pressed=0;
- if(copy_to_user(data,&key_val,1)){
- printk(KERN_ERR"Thedrivercannotcopythedatatouserarea!");
- return-ENOMEM;
- }
- return0;
- }
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- /*sixthdrvtest
- */
- intfd;
- voidmy_signal_fun(intsignum)
- {
- unsignedcharkey_val;
- read(fd,&key_val,1);
- printf("key_val:0x%x",key_val);
- }
- intmain(intargc,char**argv)
- {
- unsignedcharkey_val;
- intret;
- intOflags;
- signal(SIGIO,my_signal_fun);
- fd=open("/dev/buttons",O_RDWR|O_NONBLOCK);
- if(fd<0){
- printf("cantopen!");
- return-1;
- }
- fcntl(fd,F_SETOWN,getpid());
- Oflags=fcntl(fd,F_GETFL);
- fcntl(fd,F_SETFL,Oflags|FASYNC);
- intrest;
- while(1){
- printf("Hello");
- while(rest=sleep(50)){
S5PV210按键驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)