【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 rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更