关于Linux输入子系统的疑惑
在“天嵌科技出品-TQ6410 PDA配套Linux开发教材V1.0.1.pdf”第一章Linux输入子系统中讲到输入设备有三种(按键,触摸屏,鼠标),对于6410,板子上6个按键的定义是在opt/EmbedSky/linux-3.0-rc6/arch/arm/mach-s3c64xx/dev-keypad.c中static struct gpio_keys_button gpio_buttons[] ={
{//up 1
.gpio = S3C64xx_GPN(0),
.code = KEY_UP<
.active_low = 1,
.wakeup =0,
},
……
}
主要讲的是按键直接连到cpu的io口,如果我的按键先接了移位寄存器,从移位寄存器读取按键值后该如何处理才能使上层Qt程序处理按键事件?
如果已经以有了键值了,那直接上报就可以了,
注意下如果移位寄存器的读出来的值与之前扫描得出来的值不同,要做下处理(转换表)以使他们一致。 TQ-ZQL 发表于 2013-1-17 14:05 static/image/common/back.gif
如果已经以有了键值了,那直接上报就可以了,
注意下如果移位寄存器的读出来的值与之前扫描得出来的值不同 ...
版主您好!麻烦看一下我的按键处理过程,看看怎样和Qt的keyPressEvent()联系起来。
----
按键处理硬件设计:
由于设备按键多(十几个),为了节约2440的IO口,把这些按键同时接入与非门74hc133和移位寄存器74hc165,74hc133输出端接CPU中断,当有按键按下时,发中断,通过74hc165读取按键值,然后向应用层发信号,应用层捕获到信号后读取按键值。
按键处理驱动部分:
把按键设备作为一个字符设备处理,在char/Kconfig中添加按键设备。按键设备文件linux-2.6.12/drivers/char/keyboard2440.c。大概处理流程如下:
…… //相关变量定义略
static struct timer_list mba2440_timer;
……
struct file_operations kb_char_ops =
{
read: keyboard_read,
ioctl: keyboard_ioctl,
open: keyboard_open,
release: keyboard_release,
};
……
int kb_init(void)
{
端口配置略
……
key_irq = IRQ_EINT13;
retval = request_irq(key_irq, key_isr, SA_INTERRUPT,"kb2440", NULL);
if(retval < 0){
printk(KERN_INFO "key_irq: can't get assigned irq %i\n",key_irq);
key_irq = -1;
return -1;
}
}
……
Major = register_chrdev (KEYBOARD_DEVICE_MAJOR,
KEYBOARD_DEVICE_NAME, &kb_char_ops);
if (Major < 0) {
return Major;
}
Major = KEYBOARD_DEVICE_MAJOR;
printk ("2440 KeyBoard registred: major = %d\n", Major); //以便开机初始化时查看
……
}//--------------end of kb_init()
……
static irqreturn_t key_isr(int irq, void *dev_id, struct pt_regs *regs)
{
disable_irq(IRQ_EINT13);
init_timer(&mba2440_timer);
mba2440_timer.expires = jiffies +PollDelay;
mba2440_timer.data = 0;
mba2440_timer.function = mba2440_interv_poll;
add_timer(&mba2440_timer);
return 0;
}//---------------end of irqreturn_t key_isr
static int mba2440_interv_poll(void)
{
……
if( key_pid) kill_proc(key_pid, SIGTERM, 1); //发送信号
del_timer(&mba2440_timer);
enable_irq(IRQ_EINT13);
return 0;
} //-----------end of mba2440_interv_poll
ssize_t keyboard_open(struct inode *inode, struct file *filp)
{略}
ssize_t keyboard_release(struct inode *inode, struct file *filp)
{略}
ssize_t keyboard_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
getkey_74hc165(); //读取按键值
……
if (copy_to_user(buf,&pBuf,count)){//把按键值复制给应用程序
return -EFAULT;
}
return 0;
}
ssize_t keyboard_ioctl(struct inode *inode,struct file *file,unsigned int cmd, unsigned long ar g)
{
if(cmd==0){
key_pid = arg;
}else{
key_pid = 0;
}
return 0;
}
------------------------------------------------------------------------------------------------------
应用程序按键处理:
//main.c
main() {
……
struct sigaction keyboardact;
……
keyboardact.sa_handler = key_pressecd; //接收到信号则处理
keyboardact.sa_flags =0;
sigemptyset(keyboardact.sa_mask);
……
if (sigaction(SIGTERM, &kbact, NULL) < 0)
{
printf("xxxxxxxxx");
return -1;
}
……
//键盘初始化
KeyFd = open("/dev/kb",O_RDONLY);
if(KeyFd == -1){
perror("Failed to open /dev/kb!\n");
close(KeyFd);
exit(1);
}
MyPid =getpid();
ioctl(KeyFd,ON,MyPid);
……
}//----------------------end ofmain
……
statci void key_pressed(int sig){
read(KeyFd,&KeyValue,1); //读出按键值
…… //处理按键
}
页:
[1]