小弟初学,如果问题过于小白,麻烦高手不要嫌弃  主要是添加一个android触摸按键的驱动,通过模拟I2C实现的,中断处已经能接受到按键,键值,我想问题应该是input_report_key函数没有把键值传上去,dev/input/下已经出现了event文件,不知道问题出现在哪里呢,因为对android不太熟悉,查了N久的资料也没找到问题出现在哪里,麻烦各位高手们不吝惜您的知识稍微提示一下,谢谢!
  祝您工作愉快!

解决方案 »

  1.   

    是否在probe中没有置input
    设备可以接受的键位 ,如:
    set_bit(KEY_BACK, input_dev->keybit);
    set_bit(KEY_HOME, input_dev->keybit);android实现触摸屏按键有两种方法:
    1.tp driver将触摸直接上报为key事件
    2.android2.2以后的话,可以在board中直接修改tp按键的适配文件,里面定义了按键的范围,
    不过最好你tp上的按键不是FPC做的,而是真正的sensor实现,否则还是用第一种方法吧
      

  2.   

    你好,首先谢谢您抽取百忙的时间回答我的问题,
    我打了很多printk,我设置了set_bit,但是我发现问题就出现在这里,
    通过打印信息可以看出is_event_supported那个函数,我每次按键,产生中断时打印出来的返回值是0,
    但是我在probe里确实有设置位啊,而且当程序第一次运行到中断的时候is_event_supported的返回值还是0,当程序运行起来触发中断的时候就开始返回0了,不知道为题处在哪里,我打印了input->evbit位的值,发现中断时打印的值跟程序开机时打印的值不一样,不知道哪里改了哪个位,请问一下您,知道这样问题出现在哪里吗,
    非常感谢您!
      

  3.   

    lz可以贴些代码,解决问题也方便
    cat /dev/input/event* 能得到信息吗?
    set_bit()应该先设置一个EV_KEY,然后再设置其中的细节,用__set_bit()
    比如set_bit(EV_KEY, Input_Dev->evbit);
    __set_bit(KEY_HOME, Input_Dev->keybit);
    __set_bit(KEY_BACK, Input_Dev->keybit);
      

  4.   

    呵呵 同样感谢你回答我的问题啊。我看了is_event_supported函数,我就是这块没通,开机之后按键跑中断之后他就返回0了,设置keybit还跟这个函数没关系吧,我觉得,我设置了keybit位,但是即便是这个有问题也不应该影响到is_event_supported这个函数啊 ,我用source insight 追踪了一下,这个函数没用到 keybit位,只要是设置evbit位就应该通的,程序开机的时候跑一次中断的时候还能跑通(is_event_supported返回还是1 程序能继续进行),就是开机了之后 在按按键触发中断就返回0跑不通了。
    我cat 了一下 是阻塞的.. 
    probe 函数如下:
            struct resource  *res;
    struct input_dev *input_dev;
    struct ha2608 * ha2608;  //一个包含 input_dev结构体指针的结构体还有一些其他参数
    int ret;        ha2608 = kzalloc(sizeof(struct ha2608), GFP_KERNEL);
    input_dev = input_allocate_device();

    platform_set_drvdata(pdev, ha2608);
    ha2608->dev = input_dev;
    set_bit(EV_KEY, input_dev->evbit);
    // set_bit(KEY_BACK, input_dev->keybit);
    // set_bit(KEY_HOME,input_dev->keybit); 我觉得这两个现在还用不到,因为还没跑到他们起作用的地方..
    printk("ha2608_input_dev->evbit = %x\n\n\n",input_dev->evbit);

    input_dev->name = DEVICE_NAME;
    input_dev->phys = "ha2608/input1"; input_dev->id.bustype = BUS_HOST;
    input_dev->id.vendor = 0x0010;
    input_dev->id.product = 0x0010;
    input_dev->id.version = 0x0100;
    ha2608_init_panel();

            ret = gpio_request(INT_HA2608_PORT,"HA2608_INT");
            ret  =  s3c_gpio_cfgpin(INT_HA2608_PORT, INT_CFG_HA2608); ret = request_irq(IRQ_EINT(24), ha2608_isr_handle, IRQF_TRIGGER_RISING, DEVICENAME, (void *)ha2608); ret = input_register_device(input_dev);
    我prob函数就是这样的,程序第一次运行的时候 跑中断都没问题,为什么开机之后跑中断就出现问题了,evbit的值我打出来了开机时的打印信息没问题,开机之后 中断的打印信息 值就变了,难道哪里还会改变evbit位的值吗?,,,,,不知道我发的code哪里出问题了,希望您告诉我一下,我以前做应用的,底层不是很了解,也是才接触,问题有点小白不好意思啊
      

  5.   

    请问你是怎样解决的。。我在移植触摸驱动,按键显示都正常了。就是触摸不行。。能提供思路不??驱动已好。。用getevent测试正常。。后续不是很明
      

  6.   

    你现在既然用getevent测试正常,说明驱动就是OK的啊