HID触摸屏驱动开发的疑惑
各位老师好,上周导师安排一份HID触摸屏驱动开发的任务,但我之前没有过这方面的开发经验,现来寻求帮助:
任务是这样的,有一块触摸屏通过USB插入Windows主机,主机识别为HID触摸屏,可以正常操作。
项目的需求是触摸屏触摸时并不触发鼠标事件,也就是鼠标不发生移位,当前主机不做任何反应,只返回触摸的位置信息(X/Y)给应用层进行二次处理。
在我查阅相关资料后觉得需要开发HID触摸屏驱动,只实现位置信息读取功能,之后卸载系统自带HID的驱动并安装自己开发的驱动进行测试。
这是个人的浅薄理解,如有不合理的地方希望各位老师能指正。
目前用的驱动开发环境是VS2019+SDK+WDK,跑过最简单的helloworld驱动,想要进行如下的工作:
- 了解如何进一步寻找到对应的设备并进行通讯
- 对微软的HID触摸屏驱动进行移植,想问问老师们这一步需要完全自己开发还是有源码可以参考呢?
以上是我对驱动开发的问题,希望各位老师能不吝赐教,在下非常感谢(希望可以推荐下相关基础教程)!
Windows系统触摸屏的功能一般是通过USB-HID方式的。
当系统在触摸屏模式下时,鼠标指针会自动隐藏。当下次鼠标移动时,鼠标指针会从最后一次触摸的位置开始移动。
触摸屏的驱动在Windows下是免驱动,即只在硬件满足标准的HID规范及报告描述符符合触摸屏即可被系统识别。当系统接收到硬件通过HID中断端点返回的触摸屏报告内容(数据格式由触摸屏的报告描符决定)时,会自动在系统的应用层响应。
所以实现触摸屏驱动的功能其实就是实现触摸屏固件的功能。实现方式一般有两种:
第一种是通过真实的硬件来实现,也是最常见的方式。这里可以通过一些带USB单片机或者ARM来实现,如STM32,另外沁恒也有很多的USB-HID的芯片,你可以参考开发。
- USB-HID芯片 https://www.wch.cn/products/categories/32.html?pid=1
- STM32F4鼠标功能:https://www.bilibili.com/video/BV1ta411H7zo?spm_id_from=333.999.0.0
第二种就是通过windows系统进行设备虚拟,通过虚拟总线创建PDO,并按USB-HID规范返回相关的数据让系统以为真的有一个真实的HID设备。这里可以参见: - Win10 x64虚拟设备之触摸屏:https://www.usbzh.com/article/detail-513.html
- B站虚拟USB设备效果演示:https://space.bilibili.com/594973018/channel/seriesdetail?sid=452752
站长你好,
非常感谢你的回复帮我理清了开发思路。经过浏览你提供的资料,我觉得第一种方式更符合我的项目需求:通过USB-HID芯片(CH341)或者STM32单片机将触摸屏的IIC信号转为USB信号与系统通信,作为一个自定义的HID设备只发送捕获的触摸信号给系统即可。
我在重新查看触摸屏设备的电路连接后发现触摸屏先是通过触摸IC(GT9110)将信号转为IIC后再转为USB,其中涉及到两块芯片(GT9110与CH341)。GT9110的固件只负责触摸信号的处理与IIC传输,并不考虑USB部分的操作符,也就是说HID自定义部分应该由CH341完成。
但在CH341的手册中表明它只能作为转换芯片,并没有描述如何配置USB接口,请问:
- CH341这类转换芯片是否需要进行USB接口配置?
- 通过CH341的动态库DLL的中断处理和数据传输能否获取触摸信号
- 不使用CH341这类IIC转USB芯片而是用STM32单片机是否会是一个更好的方案?
以上是我的相关疑问,希望站长与各位老师能帮助解答,如有描述不清楚与错误的地方还望指正!
(P.S. 希望网站问答板块上线打赏功能,知识的分享应该被鼓励~)
CH341芯片是由南京沁恒出的一款CH341是一个USB总线的转接芯片,通过USB总线提供异步串口、打印口、并口以及常用的2线和4线等同步串行接口。
其功能主要实现的是串口等数据的收发。
所以,如果你可以改CH341中的固件如配置描述符,增加报告描述符即将原来的CDC设备类改为HID设备类即可你实现的功能。
其实如果你真要搞HID的话,可以选择USB键盘鼠标类的芯片,这样改起来更加方便,更改的内容也更少:
这些芯片有:
这类芯片的固件更改的内容主要有如下:
- 更改配置描述符中HID描述符中指定的HID报告描述符的数据长度=下面的HID触摸屏的报告描述符长度
- 修改HID报告描述符从原来的键鼠更改为HID触摸屏的报告描述符。
- 按实际的报告描述符数据格式返回数据。
触摸屏报告描述符的参考见:
感谢站长专门拍了视频解释问题。是这样的,我看到站长的回答后,主要犹豫两点,一个是触摸屏是iic接口,用键鼠串口芯片要在转一次,一个是我这个设备需不需要做成HID,毕竟我只是想读取到触摸信号,在我看完触摸ic和ch341的手册后觉得可以做到。介于我这个学机械工程出身的,还处在串口和iic都需要查验资料的阶段,我更偏向于从应用层调用ch341的dll去读取触摸ic的数据和设置中断,感觉这是我现阶段最能理解的了。看的再多不如下手试试,现在还在等快递,测试结果会再反馈到站里。