|  | 
| 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); //读出按键值
 …… //处理按键
 
 }
 
 | 
 |