Linux button按键驱动 多次中断控制相应LED灯亮灭闪
2015-04-18 19:42
393 查看
下午的时候完成了按键驱动的测试程序,接下来贴上新鲜出炉的按键控制相应LED灯亮灭闪的程序。
实现功能:按第一下LED亮,再按一下则闪,第三下熄灭LED。
交叉编译生成button_song_led 后具体到开发板上面
因为是两个驱动,所以一定要insmod plat_led与plat_button两个驱动。
chmod 777 button_song_led
./button_song_led 后就可以通过按键来控制相应的LED灯的亮灭了。
实现功能:按第一下LED亮,再按一下则闪,第三下熄灭LED。
/********************************************************************************* * Copyright: (C) 2015 songyong<handy_skyoutlook.com> * All rights reserved. * * Filename: copy.c * Description: This file * * Version: 1.0.0(2015年04月18日) * Author: sky <handy_sky@outlook.com> * ChangeLog: 1, Release initial version on "2015年04月18日 19时17分14秒" * ********************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<unistd.h> #include<sys/ioctl.h> #include<sys/time.h> #define PLATDRV_MAGIC 0x60 #define LED_OFF _IO (PLATDRV_MAGIC, 0x18) #define LED_ON _IO (PLATDRV_MAGIC, 0x19) #define LED_BLINK _IO (PLATDRV_MAGIC, 0x1A) #define BUTTON_STATUS 4 #define KEY1 0x1 #define KEY2 0x2 #define KEY3 0x4 #define KEY4 0x8 /******************************************************************************** * Description: * Input Args: * Output Args: * Return Value: ********************************************************************************/ int main (int argc, char **argv) { int i = 1; int j = 1; int k = 1; int l = 1; int button_fd; int led_fd; int ret; int current_button; button_fd = open("/dev/button",0); if(button_fd < 0) { printf("Open buttons device faild!\n"); exit(1); } led_fd = open("/dev/led",O_RDWR); if(led_fd < 0) { printf("Open led device faild!\n"); exit(1); } while(1) { if (ret != sizeof(current_button) ) { printf("Read button device faild.\n"); } else if(current_button == KEY1) { switch(i%3) { case 1: ioctl(led_fd,LED_ON,0); i++;break; case 2: ioctl(led_fd,LED_BLINK,0); i++;break; case 0: ioctl(led_fd,LED_OFF,0); i++;break; } } else if(current_button == KEY2) { switch(j%3) { case 1: ioctl(led_fd,LED_ON,1); j++;break; case 2: ioctl(led_fd,LED_BLIKN,1); j++;break; case 0: ioctl(led_fd,LED_OFF,1); j++;break; } } else if(current_button == KEY3) { switch(k%3) { case 1: ioctl(led_fd,LED_ON,2); k++;break; case 2: ioctl(led_fd,LED_BLINK,2); k++;break; case 0: ioctl(led_fd,LED_OFF,2); k++;break; } } else if(current_button == KEY4) /* { switch(l%3) { case 1: ioctl(led_fd,LED_ON,3); l++;break; case 2: ioctl(led_fd,LED_BLINK,3); l++;break; case 0: ioctl(led_fd,LED_OFF,3); l++;break; } } } close(button_fd); close(led_fd); return 0; } /* ----- End of main() ----- */
</pre>当然你也可以在一开始利用select来监听,当可读是就进行读取<pre name="code" class="html"> FD_ZERO(&rds); FD_SET(fd,&rds); ret=select(fd+1,&rds,NULL,NULL,NULL); if(ret<0) { printf("select failure\n"); exit(1); } if(ret==0) { printf("select timeout\n"); } else if(FD_ISSET(fd,&rds)) { read(fd,&but_status,sizeof(but_status)); }
交叉编译生成button_song_led 后具体到开发板上面
因为是两个驱动,所以一定要insmod plat_led与plat_button两个驱动。
chmod 777 button_song_led
./button_song_led 后就可以通过按键来控制相应的LED灯的亮灭了。
相关文章推荐
- 木其工作室(专业程序代写服务)[原]ok6410学习笔记(16.按键中断控制led驱动)
- ok6410学习笔记(16.按键中断控制led驱动)
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- tiny6410 Linux 按键控制LED驱动
- linux驱动按键控制led灯
- Linux驱动开发--通过按键控制led灯
- 外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )
- S3C2410 按键控制LED(中断)
- 中断-按键控制LED灯
- stm32 按键(中断)控制LED的亮灭,按一次亮,再按一次灭;
- 05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
- 基于中断的linux按键驱动(mini2440)
- OK6410利用矢量中断通过按键控制LED灯
- linux驱动开发之多路复用poll+按键点灯+中断+标准输入输出
- s3c2440基于linux的按键和外部中断驱动实践及驱动机制分析含代码
- Linux字符设备驱动之中断按键
- mini2440 按键控制LED 驱动
- linux字符驱动之中断按键
- linux字符驱动之中断按键 .
- linux输入子系统(input subsystem)之按键输入和LED控制