您的位置:首页 > 运维架构 > Linux

Linux button按键驱动 多次中断控制相应LED灯亮灭闪

2015-04-18 19:42 393 查看
下午的时候完成了按键驱动的测试程序,接下来贴上新鲜出炉的按键控制相应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灯的亮灭了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: