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

2024-05-09 00:20

本文主要是介绍【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、内核中通用hid触摸驱动
    • 二、probe过程剖析
      • (1)hid_parse()函数
      • (2)hid_hw_start()函数
      • (3)hid_connect()函数
    • 三、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,

这篇关于【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971862

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、