*************************************************************************************************************************************
#操作系统 :CentOS-6.7
#Linux内核:linux-3.0
#开发板 :fl440
#编译器 :arm-linux-gcc(buildroot-2012.08)
#cpu :s3c2440
#开发模块 :button
*************************************************************************************************************************************测试程序的功能是实现开发板上的按键按一下灯亮,再按一下灯灭,再按一下灯闪烁!如此重复循环。我的开发板上有4个按键!
测试代码:button_test.c
/********************************************************************************
* Copyright: (C) 2017 zoulei
* All rights reserved.
*
* Filename: button_test.c
* Description: This file
*
* Version: 1.0.0(07/4/2017)
* Author: zoulei <zoulei121@gmail.com>
* ChangeLog: 1, Release initial version on "07/4/2017 19:14:48 PM"
*
********************************************************************************/
#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 KEY1 0x1
#define KEY2 0x2
#define KEY3 0x4
#define KEY4 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\n");
exit(1);
}
if(fd_led<0)
{
printf("open led fauilre\n");
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\n");
exit(1);
}
if(ret==0)
{
printf("select timeout\n");
}
else if(FD_ISSET(fd,&rds))
{
read(fd,&but_status,sizeof(but_status));
}
if(but_status==KEY1)
{
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==KEY2)
{
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==KEY3)
{
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==KEY4)
{
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;
}
开发板上操作:
>: tftp -gr button_test 192.168.1.155
button_test 100% |*******************************| 6550 0:00:00 ETA
>: tftp -gr button_led.ko 192.168.1.155
button_led.ko 100% |*******************************| 126k 0:00:00 ETA
>: ls
a.out data init proc sys
apps dev lib root tmp
bin etc linuxrc s3c_led.ko usr
button_led.ko hello.ko mnt s3c_led_test var
button_test info plat_led.ko sbin
>:chmod 777 button_test
>: insmod plat_led.ko
S3C led driver version 1.0.0 initiliazed.
>: insmod button_led.ko
S3C button driver version 1.0.0 initiliazed.
>: ./button_test
KEY1 pressed.
KEY2 pressed.
KEY2 pressed.
KEY3 pressed.
KEY2 pressed.
KEY4 pressed.
KEY3 pressed.
KEY2 pressed.
KEY3 pressed.
KEY3 pressed.
KEY3 pressed.
KEY3 pressed.
KEY3 pressed.
KEY4 pressed.
KEY4 pressed.
按键之后,开发板上的led灯成功实现了亮灭闪的功能!!!(^_^)