hid触摸屏调试记录 Linux3.5 for Android

本文探讨了在Linux环境下使用吉瑞驱动程序驱动触想触摸显示器及使用hid驱动程序驱动吉瑞触摸屏时遇到的问题。通过串口打印信息分析,揭示了设备识别过程中的关键步骤和匹配机制,特别关注了hid_multitouch.c和hid_core.c文件中的代码逻辑,最终解释了设备未被正确识别的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
触摸屏我已经有一个吉瑞的单点的触摸屏驱动。
1.  我想用吉瑞的驱动程序驱动触想的触摸显示器。我在吉瑞的驱动中加入了usb支持的pid和vid,去掉了内核的hid驱动,结果确实能相应中断,但是老打印    nonzero urb status received: -71。
2.  我想用hid驱动程序驱动 吉瑞的屏。我去掉了吉瑞的单点驱动。在hid驱动中加入了吉瑞的pid和vid号。结果屏幕没有响应中断。

奇怪的是我的hid程序中没有相应的pid和vid。于是我想看看究竟。先贴上串口的打印信息。
红色部分为一个完整的流程。

[ 2185.170000] usb 1-2.3.3: new full-speed USB device number 7 using s5p-ehci

[ 2185.275000] usb 1-2.3.3: New USB device found, idVendor=fff0, idProduct=05d1

[ 2185.275000] usb 1-2.3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0

[ 2185.275000] usb 1-2.3.3: Product: MultiTouch.

[ 2185.275000] usb 1-2.3.3: Manufacturer: MultiTouch.

[ 2185.275000] hid_match_id_yangjia####

[ 2185.280000] hid_match_id_yangjia####

[ 2185.285000] hid_bus_match_yangjia####

[ 2185.285000] hid_match_device_yangjia####

[ 2185.290000] hid_match_id_yangjia####

[ 2185.295000] hid_bus_match_yangjia####

[ 2185.300000] hid_match_device_yangjia####

[ 2185.305000] hid_match_id_yangjia####

[ 2185.305000] hid_match_one_id(hdev, id)=1

[ 2185.310000] hid_device_probe_yangjia####

[ 2185.315000] hid_match_device_yangjia####

[ 2185.320000] hid_match_id_yangjia####

[ 2185.320000] hid_match_one_id(hdev, id)=1

[ 2185.325000] #######mt_probe

[ 2185.330000] hid_match_id_yangjia####

[ 2185.330000] input: MultiTouch. MultiTouch. as /devices/platform/s5p-ehci/usb1/1-2/1-2.3/1-2.3.3/1-2.3.3:1.0/input/input5

[ 2185.345000] 4: TCNTB=0000028a, TCNTO=000000f2, TINT_CSTAT=00000008

[ 2185.350000] hid-multitouch 0003:FFF0:05D1.0003: input: USB HID v1.10 Mouse [MultiTouch. MultiTouch.] on usb-s5p-ehci-2.3.3/input0

[ 2185.360000] hid_match_id_yangjia####

[ 2185.365000] hid_match_id_yangjia####

[ 2185.370000] hid_bus_match_yangjia####

[ 2185.370000] hid_match_device_yangjia####

[ 2185.375000] hid_match_id_yangjia####

[ 2185.380000] hid_match_one_id(hdev, id)=1

[ 2185.385000] hid_device_probe_yangjia####

[ 2185.390000] hid_match_device_yangjia####

[ 2185.390000] hid_match_id_yangjia####

[ 2185.395000] hid_match_one_id(hdev, id)=1

[ 2185.400000] hid_match_id_yangjia####

[ 2185.405000] hid-generic 0003:FFF0:05D1.0004: claimed by neither input, hiddev nor hidraw

[ 2185.410000] hid_bus_match_yangjia####

[ 2185.415000] hid_match_device_yangjia####

[ 2185.420000] hid_match_id_yangjia####


hid-multitouc.c文件中
static struct hid_driver mt_driver = {
     .name = "hid-multitouch",
     .id_table = mt_devices,
     .probe = mt_probe,
     .remove = mt_remove,
     .input_mapping = mt_input_mapping,
     .input_mapped = mt_input_mapped,
     .feature_mapping = mt_feature_mapping,
     .usage_table = mt_grabbed_usages,
     .event = mt_event,
#ifdef CONFIG_PM
     .reset_resume = mt_reset_resume,
#endif
};

static int __init mt_init(void)
{
     return hid_register_driver(&mt_driver);
}
在hid-core.c文件中
static struct bus_type hid_bus_type = {
     .name          = "hid",
     .dev_attrs     = hid_dev_attrs,
     .match          = hid_bus_match,
     .probe          = hid_device_probe,
     .remove          = hid_device_remove,
     .uevent          = hid_uevent,
};

static int hid_bus_match(struct device *dev, struct device_driver *drv)
{
    printk(" hid_bus_match_yangjia####\n");
     struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
     struct hid_device *hdev = container_of(dev, struct hid_device, dev);

     return hid_match_device(hdev, hdrv) != NULL;
}

在这里将hdrv和hdev的id号做个对比。发现没有打印dynid->id###############
而是执行  match_id(hdev, hdrv->id_table);
static const struct hid_device_id *hid_match_device(struct hid_device *hdev,
          struct hid_driver *hdrv)
{
     struct hid_dynid *dynid;
     printk(" hid_match_device_yangjia####\n");
     spin_lock(&hdrv->dyn_lock);
     list_for_each_entry(dynid, &hdrv->dyn_list, list) {
          if (<span style="color:#ff0000;">hid_match_one_id(hdev, &dynid->id)</span>) {
               spin_unlock(&hdrv->dyn_lock);
               printk("dynid->id###############\n");
               return &dynid->id;
          }
     }
     spin_unlock(&hdrv->dyn_lock);
    
     return<span style="color:#ff0000;"> hid_match_id(hdev, hdrv->id_table);</span>
}

在这里打印  hid_match_one_id(hdev, id)=1,说明返回了一个id。

const struct hid_device_id *hid_match_id(struct hid_device *hdev,
          const struct hid_device_id *id)
{
    int flag = 10;
    printk(" hid_match_id_yangjia####\n");
     for (; id->bus; id++)
          if (flag = <span style="color:#ff0000;">hid_match_one_id</span>(hdev, id))
               {     
                   
                   printk(" hid_match_one_id(hdev, id)=%d\n",flag);
                    return id;
               }

     return NULL;
}

在这里并没有打印信息。说明对比了红色部分的内容。
static bool hid_match_one_id(struct hid_device *hdev,
          const struct hid_device_id *id)
{
     if((id->vendor == hdev->vendor)&&(id->product == hdev->product))
     {
          printk("#############\n");
     }
   // printk(" id->vendor == %d,id->product= %d,hdev->vendor=%d,hdev->product=%d\n",id->vendor,id->product,hdev->vendor,hdev->product);
     return (<span style="color:#ff0000;">id->bus == HID_BUS_ANY </span>|| id->bus == hdev->bus) &&
          (<span style="color:#ff0000;">id->group == HID_GROUP_ANY </span>|| id->group == hdev->group) &&
          (<span style="color:#ff0000;">id->vendor == HID_ANY_ID</span> || id->vendor == hdev->vendor) &&
          (<span style="color:#ff0000;">id->product == HID_ANY_ID</span> || id->product == hdev->product);
}

接着执行
hid_device_probe(struct device *dev)
hid_hw_start(struct hid_device *hdev,unsigned int connect_mask)
hid_connect(struct hid_device *hdev, unsigned int connect_mask)
并且在hid_connect中打印
hid-generic 0003:FFF0:05D1.0004: claimed by neither input, hiddev nor hidraw






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值