天嵌 ARM开发社区

 找回密码
 注册
查看: 2602|回复: 2

关于Linux输入子系统的疑惑

[复制链接]
nice026 发表于 2013-1-17 13:42:38 | 显示全部楼层 |阅读模式
在“天嵌科技出品-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:25 | 显示全部楼层
如果已经以有了键值了,那直接上报就可以了,
注意下如果移位寄存器的读出来的值与之前扫描得出来的值不同,要做下处理(转换表)以使他们一致。
 楼主| nice026 发表于 2013-1-19 11:28:23 | 显示全部楼层
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); //读出按键值
   …… //处理按键


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-6 08:55 , Processed in 1.062507 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表