【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析

一、内核中通用hid触摸驱动

在linux内核中,为HID触摸面板实现了一个通用的驱动程序,位于/drivers/hid/hid-multitouch.c文件中。hid触摸驱动是以struct hid_driver实现,首先定义一个描述hid触摸驱动的结构mt_driver

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,
	.input_configured = mt_input_configured,
	.feature_mapping = mt_feature_mapping,
	.usage_table = mt_grabbed_usages,
	.event = mt_event,
	.report = mt_report,
	.suspend = pm_ptr(mt_suspend),
	.reset_resume = pm_ptr(mt_reset_resume),
	.resume = pm_ptr(mt_resume),
};

并实现了struct hid_driver结构中关键的函数。接着使用module_hdi_driver()将该驱动以模块方式构建:

module_hid_driver(mt_driver);

mt_devices是一个truct hid_device_id类型的数组,定义了hid备的设备参数,这些参数根据不同的厂家进行划分,划分的准则符合USB-HID协议,例如(

static const struct hid_device_id mt_devices[] = {
   

	/* 3M panels */
	{
    .driver_data = MT_CLS_3M,
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
			USB_DEVICE_ID_3M1968) },
	{
    .driver_data = MT_CLS_3M,
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
			USB_DEVICE_ID_3M2256) },
	{
    .driver_data = MT_CLS_3M,
		MT_USB_DEVICE(USB_VENDOR_ID_3M,
			USB_DEVICE_ID_3M3266) },

	/* Anton devices */
	{
    .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
		MT_USB_DEVICE(USB_VENDOR_ID_ANTON,
			USB_DEVICE_ID_ANTON_TOUCH_PAD) },

	/* Asus T101HA */
	{
    .driver_data = MT_CLS_WIN_8_DISABLE_WAKEUP,
		HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
			   USB_VENDOR_ID_ASUSTEK,
			   USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD) },
   /* 省略大量内容 */
   
  }

上述元素实则是填充struct hid_device_id的各个元素,HID_DEVICE宏包装对.bus、.group、.vendor、.product赋值操作:

mt_devices数组中,直接使用HID_DEVICE以及衍生宏为其各个字段赋值。

二、probe过程剖析

struct hid_driver mt_driver可以知道mt_drvier的.probemt_probe()

static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
   
	int ret, i;
	struct mt_device *td;
	const struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */

	for (i = 0; mt_classes[i].name ; i++) {
   
		if (id->driver_data == mt_classes[i].name) {
   
			mtclass = &(mt_classes[i]);
			break;
		}
	}

	td = devm_kzalloc(&hdev->dev, sizeof(struct mt_device), GFP_KERNEL);
	if (!td) {
   
		dev_err(&hdev->dev, "cannot allocate multitouch data\n");
		return -ENOMEM;
	}
	td->hdev = hdev;
	td->mtclass = *mtclass;
	td->inputmode_value = MT_INPUTMODE_TOUCHSCREEN;
	hid_set_drvdata(hdev,
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ilitek2510 是一款常见的 USB 触摸屏控制器芯片,Linux 平台下可以使用 HID 触摸驱动来支持 ilitek2510 触摸屏。 以下是步骤: 1. 确保系统已经加载了 hid-multitouch 驱动,可以使用以下命令来检查: ``` lsmod | grep hid_multitouch ``` 如果没有输出,则需要加载该驱动: ``` sudo modprobe hid-multitouch ``` 2. 连接 ilitek2510 触摸屏,并用以下命令来检测是否能够识别: ``` dmesg | grep input ``` 如果能够识别,则会输出如下信息: ``` input: ILITEK ILITEK-TP as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:22B8:2E82.0001/input/input3 hid-generic 0003:22B8:2E82.0001: input,hidraw0: USB HID v1.10 Pointer [ILITEK ILITEK-TP] on usb-0000:00:14.0-3/input0 ``` 其中,hidraw0 就是触摸屏的设备号。 3. 安装 xinput 工具,可以使用以下命令进行安装: ``` sudo apt-get install xinput ``` 4. 使用以下命令来调整触摸屏的参数: ``` xinput set-prop <device id> "Device Accel Velocity Scaling" <value> ``` 其中,device id 就是之前获取到的 hidraw 设备号,value 是一个浮点数,代表加速度的值。可以根据实际情况进行调整。 5. 如果需要在系统启动时自动加载 hid-multitouch 驱动和设置触摸屏参数,可以将以下脚本保存为 /etc/init.d/touchscreen,并授予可执行权限: ``` #!/bin/bash ### BEGIN INIT INFO # Provides: touchscreen # Required-Start: $local_fs $remote_fs $syslog # Required-Stop: $local_fs $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start touchscreen # Description: Enable support for ilitek2510 touchscreen on boot ### END INIT INFO case "$1" in start) modprobe hid-multitouch xinput set-prop <device id> "Device Accel Velocity Scaling" <value> ;; stop) ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 ``` 然后使用以下命令将脚本添加到启动项中: ``` sudo update-rc.d touchscreen defaults ``` 以上就是在 Linux 平台下使用 ilitek2510 触摸屏的驱动方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值