stm32 USB HID多点触摸屏上报安卓触摸信号
关于stm32USB HID触摸屏前面的内容大家可以参考我之前写的两个博客,是一步一步过渡过来的
使用stm32配置自定义的HID设备
stm32 USB HID单点触摸屏上报安卓触摸信号
使用stm32的usb,配置成HID模式,并上报数据,模拟触摸,在实现完第一个手指的触摸之后实现第二个手指其实也很简单了,主要还是修改HID报告描述符,通过报告描述符告诉接收方你会上报几个手指,对应的该怎么去解析你上报的数据了,因此总结起来,只需要修改两处地方即可,1、修改HID报告描述符;2、修改数据通讯部分上报的数据内容
之前我们已经实现了单点触摸,(不会的同学可以看我之前的博客stm32 USB
HID单点触摸屏上报安卓触摸信号),我们在此基础上修改,需要注意的是,多点触摸在win7系统上没有用,反正在我电脑上是没用的,需要插到安卓上才有用!修改HID报告描述符
修改HID报告描述符需要根据HID报告描述符的语法格式来修改,并不是随意的修改,如果HID语法出错,下载完程序之后,使用usblyzer去抓数据,在上报完HID描述符之后,就出错了,后面上报的数据均不会响应,因此HID报告描述符必须符合对应的规则,那么具体规则是怎样的呢,我也没找到对应的详细参考,我是看别人的报告描述符,然后看的多了,大概也就懂需要有哪些注意事项了,比如一个COLLECTION必须与End Collection匹配,就像c语言里面的“{”和“}”一样等等,大家实在不懂就去看看别人的吧,看得多了也就大概会了,下面是HID报告描述符出错时usblyzer的情况
HID描述符没有错误的话,上报数据在usblyzer可以看到
这里我就直接把正确的报告描述符丢出来供大家参考
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{//第一个触控点配置//其实第一个点和第二个点配置基本差不多,主要是在上报数据的时候的第一字节需要注意//上报数据的第一个字节//bit7: confidence触摸是否可信 1可信 0不可信(对于安卓不起作用 电脑起作用)//bit6-bit2: 触控identifice身份指明是哪一个手的触控 注意上报多点触控的时候要不一样!!!//bit1: Range数据范围 一般为1//bit0: 按键状态 1按下 0松开0x05, 0x0d, // USAGE_PAGE (Digitizers)0x09, 0x04, // USAGE (Touch Screen)0xa1, 0x01, // COLLECTION (Application)0x09, 0x22, // USAGE (Finger)0xa1, 0x00, // COLLECTION (Physical)0x09, 0x42, // USAGE (Tip Switch)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x01, // REPORT_COUNT (1)0x81, 0x02, // INPUT (Data,Var,Abs)0x09, 0x32, // Usage (In Range)0x15, 0x00, // Logical Minimum (0)0x25, 0x01, // Logical Maximum (1)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x51, // Usage (Contact Identifier)0x75, 0x05, // Report Size (5)0x95, 0x01, // Report Count (1)0x16, 0x00, 0x00, // Logical Minimum (0)0x26, 0x10, 0x00, // Logical Maximum (16)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x47, // Usage (Confidence)0x75, 0x01, // Report Size (1)0x95, 0x01, // Report Count (1)0x15, 0x00, // Logical Minimum (0)0x25, 0x01, // Logical Maximum (1)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x05, 0x01, // Usage Page (Generic Desktop)0x09, 0x30, // Usage (X)0x75, 0x10, // Report Size (16)0x95, 0x01, // Report Count (1)0x55, 0x0D, // Unit Exponent (-3)0x65, 0x33, // Unit (Eng Lin: in^3)0x35, 0x00, // Physical Minimum (0)0x46, 0x60, 0x17, // Physical Maximum (5984)0x26, 0xFF, 0x0F, // Logical Maximum (4095)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x31, // Usage (Y)0x75, 0x10, // Report Size (16)0x95, 0x01, // Report Count (1)0x55, 0x0D, // Unit Exponent (-3)0x65, 0x33, // Unit (Eng Lin: in^3)0x35, 0x00, // Physical Minimum (0)0x46, 0x26, 0x0E, // Physical Maximum (3622)0x26, 0xFF, 0x0F, // Logical Maximum (4095)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0xC0, // End Collection //第二个触控点配置0x05, 0x0d, // USAGE_PAGE (Digitizers)0x09, 0x22, // USAGE (Finger)0xa1, 0x01, // COLLECTION (Application)0x09, 0x42, // USAGE (Tip Switch)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x01, // REPORT_COUNT (1)0x81, 0x02, // INPUT (Data,Var,Abs)0x09, 0x32, // Usage (In Range)0x15, 0x00, // Logical Minimum (0)0x25, 0x01, // Logical Maximum (1)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x51, // Usage (Contact Identifier)0x75, 0x05, // Report Size (5)0x95, 0x01, // Report Count (1)0x16, 0x00, 0x00, // Logical Minimum (0)0x26, 0x10, 0x00, // Logical Maximum (16)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x47, // Usage (Confidence)0x75, 0x01, // Report Size (1)0x95, 0x01, // Report Count (1)0x15, 0x00, // Logical Minimum (0)0x25, 0x01, // Logical Maximum (1)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x05, 0x01, // Usage Page (Generic Desktop)0x09, 0x30, // Usage (X)0x75, 0x10, // Report Size (16)0x95, 0x01, // Report Count (1)0x55, 0x0D, // Unit Exponent (-3)0x65, 0x33, // Unit (Eng Lin: in^3)0x35, 0x00, // Physical Minimum (0)0x46, 0x60, 0x17, // Physical Maximum (5984)0x26, 0xFF, 0x0F, // Logical Maximum (4095)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0x09, 0x31, // Usage (Y)0x75, 0x10, // Report Size (16)0x95, 0x01, // Report Count (1)0x55, 0x0D, // Unit Exponent (-3)0x65, 0x33, // Unit (Eng Lin: in^3)0x35, 0x00, // Physical Minimum (0)0x46, 0x26, 0x0E, // Physical Maximum (3622)0x26, 0xFF, 0x0F, // Logical Maximum (4095)0x81, 0x02, // Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit)0xC0, // End Collection 0xC0, // End Collection
};
根据这个报告描述符上报对应的数据,如果想要让电脑或者安卓正确识别,那么上报的数据肯定是需要遵循HID报告描述符的内容的。
我们上述报告描述符对应的数据格式如下
第1字节:触摸1 标志字节(详见后面描述)
第2字节:触摸1 x坐标的低八位
第3字节:触摸1 x坐标的高八位
第4字节:触摸1 y坐标的低八位
第5字节:触摸1 y坐标的高八位
第6字节: 触摸2 标志字节(详见后面描述)
第7字节: 触摸2 x坐标的低八位
第8字节: 触摸2 x坐标的高八位
第9字节: 触摸2 y坐标的低八位
第10字节:触摸2 y坐标的高八位
标志字节组成:
bit7: confidence触摸是否可信 1可信 0不可信(对于安卓不起作用 电脑起作用)
bit6-bit2: 触控identifice身份指明是哪一个手的触控 注意上报多点触控的时候要不一样!!!
bit1: Range数据范围 一般为1
bit0: 按键状态 1按下 0松开
对应主函数如下
uint16_t x1=0,y1=0;
uint16_t x2=0,y2=0;
uint8_t usb_send_buf[10]={0x83,0xFF,0x03,0xFF,0x03,0x87,0xFF,0x06,0xFF,0x06};while (1){//计算中心点坐标x1=4096*1/4-1;y1=4096*1/4-1;x2=4096*3/4-1;y2=4096*3/4-1;//计算起始坐标x1=x1-200;y1=y1-200;x2=x2+200;y2=y2+200;//正方形手势for(i=0;i<200;i++){x1+=2;usb_send_buf[0]=0x83;usb_send_buf[1]=x1%256;usb_send_buf[2]=x1/256;usb_send_buf[3]=y1%256;usb_send_buf[4]=y1/256;x2-=2;usb_send_buf[5]=0x87;usb_send_buf[6]=x2%256;usb_send_buf[7]=x2/256;usb_send_buf[8]=y2%256;usb_send_buf[9]=y2/256;USBD_HID_SendReport(&hUsbDeviceFS,usb_send_buf,sizeof(usb_send_buf));HAL_Delay(3);}for(i=0;i<200;i++){y1+=2;usb_send_buf[0]=0x83;usb_send_buf[1]=x1%256;usb_send_buf[2]=x1/256;usb_send_buf[3]=y1%256;usb_send_buf[4]=y1/256;y2-=2;usb_send_buf[5]=0x87;usb_send_buf[6]=x2%256;usb_send_buf[7]=x2/256;usb_send_buf[8]=y2%256;usb_send_buf[9]=y2/256;USBD_HID_SendReport(&hUsbDeviceFS,usb_send_buf,sizeof(usb_send_buf));HAL_Delay(3);}for(i=0;i<200;i++){x1-=2;usb_send_buf[0]=0x83;usb_send_buf[1]=x1%256;usb_send_buf[2]=x1/256;usb_send_buf[3]=y1%256;usb_send_buf[4]=y1/256;x2+=2;usb_send_buf[5]=0x87;usb_send_buf[6]=x2%256;usb_send_buf[7]=x2/256;usb_send_buf[8]=y2%256;usb_send_buf[9]=y2/256;USBD_HID_SendReport(&hUsbDeviceFS,usb_send_buf,sizeof(usb_send_buf));HAL_Delay(3);}for(i=0;i<200;i++){y1-=2;usb_send_buf[0]=0x83;usb_send_buf[1]=x1%256;usb_send_buf[2]=x1/256;usb_send_buf[3]=y1%256;usb_send_buf[4]=y1/256;y2+=2;usb_send_buf[5]=0x87;usb_send_buf[6]=x2%256;usb_send_buf[7]=x2/256;usb_send_buf[8]=y2%256;usb_send_buf[9]=y2/256;USBD_HID_SendReport(&hUsbDeviceFS,usb_send_buf,sizeof(usb_send_buf));HAL_Delay(3);}//松开按键usb_send_buf[0]=0x82;usb_send_buf[5]=0x86;USBD_HID_SendReport(&hUsbDeviceFS,usb_send_buf,sizeof(usb_send_buf));HAL_Delay(7);}}
安卓进行相应设置,打开开发者模式,然后打开触摸轨迹,编译下载对应的程序,将设备插在安卓上,可以在安卓上看到对应的触摸轨迹为两个矩形
工程链接:工程链接
stm32 USB HID多点触摸屏上报安卓触摸信号相关推荐
- 记录一下 开发STM32 USB HID踩过的坑
记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...
- STM32 USB HID Mouse And Keyboard (guide)
There is a post (STM32 And Custom USB HID Device? Yes Please!) that gets a lot of attention, althoug ...
- STM32 USB HID IAP升级
找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...
- stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析
前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...
- STM32 USB HID设置(STM32CubeMX)
STM32F070F6P USB HID设置 1.打开STM32CubeMX软件,选择"NEW"新建一个工程 2.选择芯片型号STM32F070F6P 3.在Swap PA9/10 ...
- STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)
STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...
- 62 stm32 usb自定义hid复合设备修改实验
1.引言 最近因为项目需要,我们希望单片机既能有hid键盘功能,又能有hid设备的功能.即单片机的一个usb接口插入电脑后,电脑能识别出键盘设备和hid设备,两者同时存在的. 基于项目只是要求实现功能 ...
- 安卓与单片机进行usb hid通信
安卓USB_HID通信文档 因为一直在研究stm32,需要用到usb hid通信,就研究了安卓与stm32进行usb hid通信,目前已经能进行正常通信,我这里只跟大家说一下通信时需要注意的问题. u ...
- [转载]基于Stm32,LD3320的非特定语音识别USB HID Keyboar
基于Stm32,LD3320的非特定语音识别USB HID Keyboard实现 ---用声音跟机器沟通 鉴于手头拥有一块ST官方的stm32f407VG discover板子以及一块ICRoute公 ...
- STM32 USB 开发(一)HID Slave 通信
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.开发板USB硬件 二.STM32CubeMX 设置 1.设置小灯灯和串口 2.开启USB 3.时钟设置 三.KEI ...
最新文章
- 运动目标检测ViBe算法
- IP修改器的作用以及用途
- Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
- 英语作文万能句子总结版
- OpenCV学习笔记之改变图像的对比度和亮度
- 学习《apache源代码全景分析》之摘录
- 微信小程序把玩(三十三)Record API
- jquery name选择器_jquery笔记
- 罗永浩:如果没有特斯拉和马斯克 激动人心的电动车时代不会这么早的到来
- 团部培训笔记-设计模式-《2013-11-27 代理模式》
- 信捷plc用c语言编程软件,XDPPro(信捷PLC编程软件) V3.1.0c 官方版
- 注册测绘师学习笔记(二)
- 西门子real是什么数据类型_西门子PLC数据类型
- A.7链表练习题——集合的交差并
- vs登录或者添加账户时说脚本错误
- 再谈微服务负载均衡器:Ribbon均衡器和SpringCloud自带LoadBalancer均衡器
- 解决node-sass下载失败问题
- QTableView中添加icon
- 水泥caement英语
- T61迅盘无法正常工作