Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265130
  • 博文数量: 25
  • 博客积分: 329
  • 博客等级: 一等列兵
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-24 09:43
文章分类

全部博文(25)

文章存档

2014年(4)

2013年(12)

2012年(9)

分类: LINUX

2012-12-29 17:05:43

/************************************************************************************/
buttons_input.c
 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct input_dev  *buttons_dev;
static struct timer_list button_timer;
static struct pins_desc * pin_pd = NULL;
struct pins_desc {
 int irq;
 int pin;
 int keyval;
 char *name;
 
};
static struct pins_desc pins_desc[6] = {
 {IRQ_EINT8,   S3C2410_GPG(0),   KEY_L, "S1"},
 {IRQ_EINT11, S3C2410_GPG(3),   KEY_S, "S2"},
 {IRQ_EINT13, S3C2410_GPG(5),   KEY_ENTER, "S3"},
 {IRQ_EINT14, S3C2410_GPG(6),   KEY_C, "S4"},
 {IRQ_EINT15, S3C2410_GPG(7),   KEY_D, "S5"},
 {IRQ_EINT19, S3C2410_GPG(11), KEY_A, "S6"},
};
static irqreturn_t bottons_handler(int irq, void *dev_id)
{
  pin_pd = (struct pins_desc *)dev_id;
 mod_timer(&button_timer, jiffies + HZ/100);
 
 return IRQ_RETVAL(IRQ_HANDLED);
}
static void buttons_fun(unsigned long data)
{
 struct pins_desc * desc =pin_pd;
 int key;

 if(!pin_pd)
  return;
 
 key = s3c2410_gpio_getpin(desc->pin);
 if(key)
  // 上报事件,最后一个参数,松开时0,按下为1;
  input_event(buttons_dev, EV_KEY, pin_pd->keyval, 0);
 else
  input_event(buttons_dev, EV_KEY, pin_pd->keyval, 1);
 // 上报一个同步时间
 input_sync(buttons_dev);
  
 
}
static __init int bottons_init(void)
{
 int i;
 /* 分配一个input_dev结构 */
 buttons_dev = input_allocate_device();
 /* 设置 input_dev结构*/
 //  设置能产生那类时间
 set_bit(EV_KEY, buttons_dev->evbit);
 set_bit(EV_KEY, buttons_dev->evbit);
 
 // 设置能产生这类事件中的那些时间
 set_bit(KEY_L, buttons_dev->keybit);
 set_bit(KEY_S, buttons_dev->keybit);
 set_bit(KEY_ENTER, buttons_dev->keybit);
 set_bit(KEY_C, buttons_dev->keybit);
 set_bit(KEY_D, buttons_dev->keybit);
 set_bit(KEY_A, buttons_dev->keybit);
 /* 注册input_dev结构 */
 input_register_device(buttons_dev);
 // 注册中断
 for(i = 0; i < 6; i++)
  request_irq(pins_desc[i].irq, bottons_handler, IRQ_TYPE_EDGE_BOTH, pins_desc[i].name, &pins_desc[i]);
 
 // 初始化定时器
 init_timer(&button_timer);
 // 设置超时函数
 button_timer.function = buttons_fun;
 // 注册定时器
 add_timer(&button_timer);
 
 return 0;
}
 
static __exit void bottons_exit(void)
{
 int i;
 // 删除定时器
 del_timer(&button_timer);
 // 注销input_dev
 input_unregister_device(buttons_dev);
 // 释放input_dev结构体
 input_free_device(buttons_dev);
 
 // 注销中断
 for(i = 0; i < 6; i++)
  free_irq(pins_desc[i].irq, &pins_desc[i]);
}

module_init(bottons_init);
module_exit(bottons_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("");
/*********************************************************************************/
 
/*********************************************************************************/
 
input_test.c
 
 
#include
#include
#include
#include
#include
#include
static struct input_event key_event;
int main(int argc,char **argv)
{
 int fd;
 
 fd = open("/dev/event1",O_RDWR);
 if(fd<0)
 {
  printf("cannot open !\n");
  return -1;
 }

 while(1)
 {
  // 读取输入子系统的时,读出来的是一个struct input_event结构
  read(fd, &key_event,sizeof(key_event));
  //printf("wake up!! \n");
  printf("timer.tv_sec = %d, timer.tv_usec = %d, type = %d, code = %d, value = %d\n",
   key_event.time.tv_sec, key_event.time.tv_usec, key_event.type, key_event.code,key_event.value);
 }
    
 close(fd);
  
 return 0;
}
 
/*********************************************************************************/
 
阅读(2361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~