platform_buttonキードライバのテストプログラム

4572 ワード

このテストプログラムで主に実現される機能は、4つのボタンでそれぞれ4つのランプを制御し、押すと点灯し、押すと消灯し、押すと点滅し、このように繰り返します.
/*********************************************************************************
 *      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);