蓝牙HID与Android的通信--多点触摸问题

news2024/11/10 22:41:10

通过蓝牙HID上传鼠标,键盘,按键的事件基本已经比较成熟。并且功能比较好实现,基本参照网络上的配置都可以弄出来。但多点触摸功能却怎么弄都没有满意的结果。搜罗了网上的很多报告描述符的描写,试验了一段时间,竟然没有一个可以使用,高度怀疑自己是哪个地方出现了问题。那就只有深挖下去,看看到底卡在哪个地方。

内核的drivers\hid\hid-core.c代码中,有一个

hid_scan_main --> hid_scan_input_usage,该函数对如何识别一个多点触控设备做了判断:

static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)
{
	struct hid_device *hid = parser->device;

	if (usage == HID_DG_CONTACTID)
		hid->group = HID_GROUP_MULTITOUCH;
}

 从中可以看出,如果report中有usage为HID_DG_CONTACTID,即判断为多点触摸的设备,会加载多点触摸的hid相关驱动,也就是linux内核中drivers\hid\hid-multitouch.c代码,该代码对HID的多点触摸设备进行了相关的转换,以适应android系统上报正确的多点触摸input事件。

通过宏定义#define HID_DG_CONTACTID    0x000d0051 可以看见,这个usage的Usage ID是0x51,而多点触摸属于一个Digitizers Page范畴的设备。所以可以查看HID Usage Tables FOR Universal Serial Bus (USB)文档(可访问USB官网下载HID Usage Tables 1.4 | USB-IF)。

也就是report中一定要包含该usage(0x09, 0x51),才能被识别为一个多点触摸的设备。

但是即使把这个usage包含进去了,也做好了各种准备,结果却仍然无法查看到上传的多点触摸结果。(通过getevent无法查看到正确的多点触摸信息。)


连接蓝牙,android设备进入adb之后,

查看/sys/bus/hid/devices,发现里面有注册好并且可以使用的HID设备,比如0005:05AC:022C.0001,,进入/sys/bus/hid/devices/0005:05AC:022C.0001/driver,执行ls -la,

可以发现该设备是通过uhid虚拟出来的一个hid设备。并且用到了hid_apple的驱动。如下图所示:

 查看/sys/bus/hid/drivers,可以发现里面有一些hid的驱动。

cd apple可看见0005:05AC:022C.0002(最后一个0002只是表示连接次数,中途断了一下,重连,就变为0002,可以忽略。)说明用到了apple的驱动。

翻开内核代码,进入drivers\hid\hid-apple.c,会发现

static const struct hid_device_id apple_devices[]中有很多供应商和设备ID,

通过查看,

#define USB_VENDOR_ID_APPLE        0x05ac

#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI    0x022c

说明0005:05AC:022C.0002,这个设备确实是用到了hid-apple的驱动。查看该驱动,发现都是一些按键和鼠标的定义,并未找到多点触摸的相关处理过程。

也就是HID用什么设备,都是通过05AC:022C这些厂商ID和设备ID定义好的。如果想即连即用,不想自己写驱动。需要选择好这两个ID。

查看drivers\hid\hid-multitouch.c,该驱动才是多点触摸蓝牙或者USBHID设备需要匹配的驱动。

在其代码中,也可以找到static const struct hid_device_id mt_devices[]结构体数组,里面定义了支持该驱动的设备ID和厂商ID。也就是说只有厂商ID和设备ID都在这个数组里面的设备,才能支持多点触摸的功能。那么怎么找到这两个ID呢?

在android上面安装一个nRF.Connect.apk,连接上蓝牙,在设备信息中查看,如下图:

滑到最下面,有一个PnP ID,点击向下的箭头,读取一下。

厂商ID和设备ID就在这里,556写成16进制就是0x22c。

也就是PnP ID是确定HID设备使用什么驱动的识别信息。

那么就需要去更改蓝牙芯片的代码,找到这个东西,修改为能够使用多点触摸驱动的PnP ID。

比如杰理的芯片,在apps\hid\modules\bt\ble_hogp.c中,可以发现有如下的信息:

把PNP_VID,PNP_PIN修改一下即可。其他的芯片也应该可以找到对应的地方做修改。

比如hid-multitouch.c中,用通用的设备ID看看效果如何,当然其他的ID也是可以的。这里仅做一下展示。

/* Generic MT device */
    { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },

HID_BUS_ANY是0xffff,HID_ANY_ID只要非0即可。

修改完之后,再打开蓝牙,这时通过nRF.Connect.apk,发现PnP ID已经改变了。

adb查看/sys/bus/hid/devices

查看/sys/bus/hid/drivers/hid-multitouch

 说明是已经用到了hid-multitouch的驱动。

adb 通过getevent -lt,然后蓝牙上传一个滑动的数据包,可以看见:

也就是滑动的事件已经通过input子系统上传到了应用层,并滑动的屏幕。这里只展示了1个点的滑动,多点也是可以实现的。不再展开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV:深入Feature2D组件——角点检测

角点检测 1 Harris角点检测1.1 兴趣点与角点1.2 角点检测1.3 harris角点检测1.4 实现harris角点检测:cornerHarris()函数1.5 综合案例:harris角点检测与测绘 2. Shi—Tomasi角点检测2.1Shi—Tomasi角点检测概述2.2 确定图像强角点:goodFeatur…

硬件基本常识杂记1

文章目录 电感(RL电路),电容(RC电路),(LRC电路)谐振(串联、并联)滤波器(高通RC、低通RC、高通RL、低通RL、带通、Π型)积分电路、微分电路截至频率w信号传输、…

Docker迁移与备份

容器保存为镜像 语法: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 为nginx创建镜像: docker commit -a "leq" -m "nginx的镜像" 10053cd47ebf nginx:v1.0 -a 提交的镜像作者 -m 提交时的说明文字 镜像备份 语法: docker save…

深入理解C语言对文件的包装与缓冲区

内存级文件操作的运用 1.模拟实现文件分装2. 深入理解缓冲区的概念 1.模拟实现文件分装 【目标】 以最简单的方式,理解FILE结构体的原理。 头文件:mystdio.h(定义了MY_FILE结构体,声明fopen,fwrite,fclos…

『手撕 Mybatis 源码』10 - 一级缓存

一级缓存 概述 一级缓存是 SqlSession 级别的缓存。在操作数据库时需要构造 SqlSession 对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的 SqlSession 之间的缓存数据区域(HashMap)是互相不影响的二级缓…

hive基于新浪微博的日志数据分析——项目及源码

有需要本项目的全套资源资源以及部署服务可以私信博主!!! 本系统旨在对新浪微博日志进行大数据分析,探究用户行为、内容传播、移动设备等多个方面的特征和趋势,为企业和个人的营销策略、产品设计、用户服务等提供有益的…

PN结、二极管、三极管、三极管放大电路、上拉电路/下拉电路

1、N型参杂 与 P型参杂 B站 视频地址 :https://www.bilibili.com/video/BV1fB4y147Gn 1)N型参杂 (N型半导体) : 4价硅 参杂 5价麟,多一个自由负电子(带负电) 2)P型参杂…

Linux性能学习(4.2):网络_为什么MTU是1500

文章目录 1 基本概念2 为什么MTU是15003 有效载荷最大是1500吗4 Linux下如何修改MTU 参考资料: 1. RFC894 2. 什么是MTU(Maximum Transmission Unit)? 1 基本概念 Maximum Transmission Unit,缩写MTU,即…

Python爬虫:Scrapy框架

🚀Python爬虫:Scrapy框架 🕷️ Scrapy介绍📦 Scrapy框架📁 Scrapy项目🔍 创建爬虫过程🕸️ 页面分析📑 提取信息🎉 完整代码📝 结语 在本篇博文中&#xff0c…

C++6.29思维,作业

有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;cout << "无参构造" << endl;}//有参构造Person(int age,int …

docker的容器

首先要关闭防火墙,不然会阻止连接 查询防火墙状态 systemctl status firewalld 如果是running的状态要关闭一下 关闭防火墙 systemctl stop firewalld 禁用防火墙(禁止开机启动) systemctl disable firewalld 容器的创建语句: docker run …

第11节 跟上板块轮动的节奏

板块 文章目录 板块什么是板块板块的分类板块的轮动 板块相关接口本节课任务 什么是板块 股票板块是一些具有相同特征的股票的集合&#xff0c;命名通常也会简单明了的直接按照特征命名。例如沪深300板块&#xff0c;蓝筹板块。对上市公司进行“分班”不论是对于企业还是对于投…

Leetcode-每日一题【148.排序链表】

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3]输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0]输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1…

VC++多文档项目同时显示多个文本文件

VC6新建一个多文档工程&#xff1b;工程名为txt&#xff1b;生成的类如下&#xff1b;与单文档项目相比多了一个ChildFrm&#xff1b; 在类向导为Doc类添加OnOpenDocument函数&#xff1b; 此时生成的OnOpenDocument()函数如下&#xff1b; BOOL CTxtDoc::OnOpenDocument(LPCT…

Python基础 —— 条件语句

考虑了好久&#xff0c;不知道是先写条件循环&#xff0c;还是先写数据类型,因为如果先写条件循环的话&#xff0c;要涉及到数据类型的内容&#xff1b;先写数据类型的话&#xff0c;又要设计到条件循环的内容…纠结一番后&#xff0c;决定还是先说条件循环&#xff0c;再在数据…

chatgpt赋能python:用Python抓取数据:提高SEO的关键

用Python抓取数据&#xff1a;提高SEO的关键 在数字化时代&#xff0c;数据已经变成了最宝贵的财富之一。然而&#xff0c;对于企业和网站管理者来说&#xff0c;数据仅仅是有价值的当它被收集和转化成行动中存在的信息。这时&#xff0c;Python成为了一个有用的工具&#xff…

基于VORS、CCDM模型、GeoDetector、GWR模型集成技术在城镇化与生态系统健康空间关系分析及影响效应中的应用

城市群是一国经济发展水平的象征&#xff0c;也是一国经济发展到一定阶段的标志&#xff0c;我国城市群建设体量不断增加&#xff0c;将成为全球经济的核心&#xff0c;中国城市群的建设逐步引领全球进入到了21世纪的中国新时代。然而&#xff0c;高速的城镇化发展&#xff0c;…

leetcode题集训 sql

目录 背景步骤175组合两个表&#xff08;多表联查&#xff09;176 177 第n高的薪水&#xff08;Distinct关键字 排序&#xff09;178分数排名 &#xff08;排序 order over关键字&#xff09;179 连续出现的数字 &#xff08;模拟多张表联查&#xff09;181. 超过经理收入的员工…

学号编码:TooY0ung的学院(结构体)

根据66十二位编码规则&#xff0c;用城市代码和出生年编制学号。 【本笔记适合初通算法的 coder 翻阅】 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础…

Web-文件上传漏洞总结

目录 1、常规前端绕过 2、修改文件类型 3、使用 .user.ini 或 .htaccess&#xff08;可能还存在大小写绕过&#xff09; 4、使用字典爆破可行后缀 5、结合文件包含漏洞使用图片马 6、条件竞争 1、常规前端绕过 如下图&#xff0c;在前端存在限制&#xff0c;只能上传图片…