platform_buttonキードライバのテストプログラム
4572 ワード
このテストプログラムで主に実現される機能は、4つのボタンでそれぞれ4つのランプを制御し、押すと点灯し、押すと消灯し、押すと点滅し、このように繰り返します.
//中はselectを使っていますが、時間帯にNULLを設定したので、アクセスをブロックして、興味のある方は設定してもいいです.
struct timeval timeout;
timeout.sec=1(1秒)
timeout.usec=100(100ミリ秒)
select(fd+1,&rds,NULL,NULL,&timeout);
/*********************************************************************************
* Copyright: (C) 2015 lingyun
* All rights reserved.
*
* Filename: test_button.c
* Description: This file
*
* Version: 1.0.0(2015 04 16 )
* Author: lzj <[email protected]>
* ChangeLog: 1, Release initial version on "2015 04 16 19 33 40 "
*
********************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.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 BTN1 0x1
#define BTN2 0x2
#define BTN3 0x4
#define BTN4 0x8
int main(int argc,char **argv)
{
int fd;
int i=1;
int j=1;
int k=1;
int m=1;
int ret=0;
int but_status;
int fd_led;
fd_set rds;
fd=open("/dev/button",O_RDWR);
fd_led=open("/dev/led",O_RDWR);
if(fd<0)
{
printf("open button failure
");
exit(1);
}
if(fd_led<0)
{
printf("open led fauilre
");
exit(1);
}
while(1)
{
FD_ZERO(&rds);
FD_SET(fd,&rds);
ret=select(fd+1,&rds,NULL,NULL,NULL);
if(ret<0)
{
printf("select failure
");
exit(1);
}
if(ret==0)
{
printf("select timeout
");
}
else if(FD_ISSET(fd,&rds))
{
read(fd,&but_status,sizeof(but_status));
}
if(but_status==BTN1)
{
switch(i%3)
{
case 1:
ioctl(fd_led,LED_ON,0);
i++;
break;
case 2:
ioctl(fd_led,LED_OFF,0);
i++;
break;
case 0:
ioctl(fd_led,LED_BLINK,0);
i++;
break;
default:
break;
}
}
if(but_status==BTN2)
{
switch(j%3)
{
case 1:
ioctl(fd_led,LED_ON,1);
j++;
break;
case 2:
ioctl(fd_led,LED_OFF,1);
j++;
break;
case 0:
ioctl(fd_led,LED_BLINK,1);
j++;
break;
default:
break;
}
}
if(but_status==BTN3)
{
switch(k%3)
{
case 1:
ioctl(fd_led,LED_ON,2);
k++;
break;
case 2:
ioctl(fd_led,LED_OFF,2);
k++;
break;
case 0:
ioctl(fd_led,LED_BLINK,2);
k++;
break;
default:
break;
}
}
if(but_status==BTN4)
{
switch(m%3)
{
case 1:
ioctl(fd_led,LED_ON,3);
m++;
break;
case 2:
ioctl(fd_led,LED_OFF,3);
m++;
break;
case 0:
ioctl(fd_led,LED_BLINK,3);
m++;
break;
default:
break;
}
}
}
close(fd);
close(fd_led);
return 0;
}
//中はselectを使っていますが、時間帯にNULLを設定したので、アクセスをブロックして、興味のある方は設定してもいいです.
struct timeval timeout;
timeout.sec=1(1秒)
timeout.usec=100(100ミリ秒)
select(fd+1,&rds,NULL,NULL,&timeout);