|
TQ-ZQL 发表于 2013-1-17 14:05
如果已经以有了键值了,那直接上报就可以了,
注意下如果移位寄存器的读出来的值与之前扫描得出来的值不同 ...
版主您好!麻烦看一下我的按键处理过程,看看怎样和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[0],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 of main
……
statci void key_pressed(int sig){
read(KeyFd,&KeyValue,1); //读出按键值
…… //处理按键
}
|
|