linux input 输入子系统笔记

来源:互联网 发布:泰语翻译软件下载 编辑:程序博客网 时间:2024/06/08 13:45
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#include <asm/arch/irqs.h>
#include <linux/irq.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <linux/input.h>




static struct input_dev *buttons_dev;


//定义定时器结构
static struct timer_list buttons_timer;


static struct pin_desc *irq_id;


struct pin_desc{
int irq;
char *name; 
unsigned int pin;
unsigned int keyval;
    
};


struct pin_desc  pins_desc[4]={
{IRQ_EINT8, "K1",S3C2410_GPG0,KEY_L },
{IRQ_EINT11, "K2",S3C2410_GPG3,KEY_S },
{IRQ_EINT13, "K3",S3C2410_GPG5,KEY_ENTER },
{IRQ_EINT14, "K4",S3C2410_GPG6,KEY_LEFTSHIFT },
};








static irqreturn_t buttons_irq(int irq, void *dev_id)
{
//按键中断延时10ms
irq_id = (struct pin_desc *)dev_id;


mod_timer(&buttons_timer, jiffies+HZ/100)     ;


//打印中断号码,16进制显示
//printk("irq = 0x%0x\n",irq);   


return IRQ_RETVAL(IRQ_HANDLED);  
}




static void buttons_timer_function(unsigned long data)
{
//按键中断后延时10ms处理函数


struct pin_desc *pindesc = irq_id;


unsigned int vpin_value;


//如果没有按键中断发生退出
if(!pindesc)
return;


vpin_value = s3c2410_gpio_getpin(pindesc->pin);


if(vpin_value)
{
//按键释放
//0-松开,1-按下
input_event(buttons_dev,EV_KEY,pindesc->keyval,0);
input_sync(buttons_dev);

}
else
{
//按键按下
input_event(buttons_dev,EV_KEY,pindesc->keyval,1);
input_sync(buttons_dev);
}


//----------------
//printk("buttons_timer_function\n");


}


static int buttons_init(void)
{
int i;
//1.分配一个input_dev结构体
buttons_dev = input_allocate_device();


//2.设置
//2.1设置产生操作的哪类时间
set_bit(EV_KEY,buttons_dev->evbit);
set_bit(EV_REP,buttons_dev->evbit);




//2.2 设置产生操作的哪些事件
set_bit(KEY_L,buttons_dev->keybit);
set_bit(KEY_S,buttons_dev->keybit);
set_bit(KEY_ENTER,buttons_dev->keybit);
set_bit(KEY_LEFTSHIFT,buttons_dev->keybit);

//3.注册
input_register_device(buttons_dev);







//4.硬件初始化

init_timer(&buttons_timer);
buttons_timer.function = buttons_timer_function; //定时处理函数
//buttons_timer.data= (unsigned long)&wd_dev;
//buttons_timer.expires= 0;
add_timer(&buttons_timer);//jiffies > 0;



//注册中断函数到内核 GPG0 GPG3 GPG5 GPG6
for(i=0; i<4; i++)
{
request_irq(pins_desc[i].irq, buttons_irq,IRQT_BOTHEDGE,pins_desc[i].name,&pins_desc[i]);
}





---------------------------------------------

/home/drivers_and_test/8th_driver # hexdump /dev/event1
0000000 0065 0000 4c49 0001 0001 0026 0001 0000
0000010 0065 0000 4c53 0001 0000 0000 0000 0000
0000020 0065 0000 82a6 0003 0001 0026 0000 0000
0000030 0065 0000 82af 0003 0000 0000 0000 0000
0000040 0066 0000 fc08 0001 0001 001f 0001 0000
0000050 0066 0000 fc11 0001 0000 0000 0000 0000
0000060 0066 0000 a791 0004 0001 001f 0000 0000
0000070 0066 0000 a798 0004 0000 0000 0000 0000
0000080 0067 0000 327d 0004 0001 001c 0001 0000
0000090 0067 0000 3287 0004 0000 0000 0000 0000
00000a0 0067 0000 3fa1 0007 0001 001c 0000 0000
00000b0 0067 0000 3fa8 0007 0000 0000 0000 0000


/home/drivers_and_test/8th_driver # cat /dev/tty1
lss
s


/home/drivers_and_test/8th_driver # cat /dev/tty1
ls 可以读出开发板按键的值,但是需要按k3回车才能显现出来,为什么?
s


s
s
ls
ll
s
ssssssssssssssssssssssssssssssssssssssss
ssssssssssssssssssssss




sssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
llllllllllllll
lllllllllllssssssssssssss


/home/drivers_and_test/8th_driver # exec 0</dev/tty1开发板串口1输入作为标准输入,如何切换回来用PC作为输入?
/home/drivers_and_test/8th_driver # ls
input_button_driver.ko
/home/drivers_and_test/8th_driver # sssssssssssssssllllllllllsssssssssssss
-sh: sssssssssssssssllllllllllsssssssssssss: not found
/home/drivers_and_test/8th_driver # 
/home/drivers_and_test/8th_driver # 
/h


/home/drivers_and_test/8th_driver # 
/home/drivers_and_test/8th_driver # s
-sh: s: not found
/home/drivers_and_test/8th_driver # ssslllls
-sh: ssslllls: not found
/home/drivers_and_test/8th_driver # ls
input_button_driver.ko
/home/drivers_and_test/8th_driver #










return 0;
}




static void buttons_exit(void)
{
int i;
for(i=0; i<4; i++)
{
free_irq(pins_desc[i].irq,&pins_desc[i]);
}
del_timer(&buttons_timer);


input_unregister_device(buttons_dev);
input_free_device(buttons_dev);



}




module_init(buttons_init);
module_exit(buttons_exit);


MODULE_LICENSE("GPL");
0 0
原创粉丝点击