注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

按键驱动之查询方式  

2012-09-09 19:57:04|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
驱动程序:

#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <mach/regs-gpio.h>
#include <linux/gpio.h>

static struct class *key_class;

static int key_open (struct inode *inode, struct file *file)
{
    s3c2410_gpio_cfgpin(S3C2410_GPF(0), S3C2410_GPIO_INPUT);
    s3c2410_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_INPUT);
    s3c2410_gpio_cfgpin(S3C2410_GPG(3), S3C2410_GPIO_INPUT);
    s3c2410_gpio_cfgpin(S3C2410_GPG(11), S3C2410_GPIO_INPUT);
    
    return 0;
}
static ssize_t key_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
    int val;
    if(s3c2410_gpio_getpin(S3C2410_GPF(0))==0)
        {
            val=1;
        }
    else if(s3c2410_gpio_getpin(S3C2410_GPF(2))==0)
        {
            val=2;
        }
    else if(s3c2410_gpio_getpin(S3C2410_GPG(3))==0)
        {
            val=3;
        }
    else if(s3c2410_gpio_getpin(S3C2410_GPG(11))==0)
        {
            val=4;
        }
    else
        {
            val=0;
        }
    copy_to_user(buf, &val, 4);
    return 0;
}
static struct file_operations key_operation = {
    .owner = THIS_MODULE,
    .open  =  key_open,
    .read   = key_read,
};

static int major;
static int minor;
static int key_init(void)
{
    major=register_chrdev(0, "key", &key_operation);
    key_class=class_create(THIS_MODULE, "key_class");
    device_create(key_class, NULL, MKDEV(major , 0), NULL, "keys");

    return 0;
}

static void key_exit(void)
{
    unregister_chrdev(major , "key");
    device_destroy(key_class, MKDEV(major , 0));
    class_destroy(key_class);
}

module_init(key_init);
module_exit(key_exit);
MODULE_LICENSE("GPL");

用户程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc , char **argv)
{
    int fd;
    int val;
    fd=open("/dev/keys" , O_RDWR);
    if(fd<0)
        {
            printf("can't open /dev/keys\n");
            return -1;
        }
    while(1)
        {
            read(fd,&val,4);
            if(val==1)
                {
                    printf("key1 pressed\n");
                }
            else if(val==2)
                {
                    printf("key2 pressed\n");
                }
            else if(val==3)
                {
                    printf("key3 pressed\n");
                }
            else if(val==4)
                {
                    printf("key4 pressed\n");
                }
            else 
                {
                    sleep(1);
                }
        }
    return 0;
}


  评论这张
 
阅读(440)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017