platform按键驱动学习之测试实例

*************************************************************************************************************************************

#操作系统 :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灯成功实现了亮灭闪的功能!!!(^_^)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值