hidraw进行单点复现触摸痕迹

本文档介绍了如何使用hidraw接口来读取和解析USB设备的原始数据,包括读写操作、ioctl系统调用的使用,以及示例代码展示读取USB鼠标设备的数据。同时,文章探讨了如何分析多点触控事件,模拟发送滑动事件到设备,并给出了创建和使用uinput设备来复现这些事件的代码。
摘要由CSDN通过智能技术生成
查找官方的文档

hidraw的描述
可以读取一个usb的原生数据,并且对数据进行解析

读取

read()
读取usb发送回来的数据

usb支持数据输入的话(有一个 INTERRUPT OUT 端点)

ioctl()

HIDIOCGRDESCSIZE:获取报告描述符大小
HIDIOCGRDESC:获取报告描述符 —>返回 struct hidraw_report_descriptor
HIDIOCGRAWINFO : 获取原始信息 —>返回 struct hidraw_devinfo
HIDIOCGRAWNAME : 获取原始设备名称
HIDIOCGRAWPHYS : 获取设备地址
HIDIOCSFEATURE : 发送报告功能
HIDIOCGFEATURE : 获取报告

example

官方很贴心还送了小笔记
在这里插入图片描述
编译运行运行,好的属实没看懂搞点什么东西
在这里插入图片描述

自己上手分析一下数据吧
代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/hidraw.h>

#define MOUSE_DEV_PATH    "/dev/hidraw0"

unsigned char buffer[1000];

int main()
{
   
        struct hidraw_devinfo info;

        int fd = open(MOUSE_DEV_PATH, O_RDONLY);
        if (fd == -1)
        {
   
                printf("mouse device open fail\n");
                return -1;
        }

        int rc = ioctl(fd, HIDIOCGRAWINFO, &info);
        if (rc < 0)
        {
   
                printf("readerror!\n");
                return 1;
        }
        printf("HID device info %04x:%04x:%04x is\n", info.bustype,info.vendor, info.product);

        
        unsigned char buff[96];
        printf("open successful\n");
        while (1)
        {
   
                int size = read(fd, 
				, 64);
                printf("\nsize:%d\t", size);
				int i =0;
                for (i = 0; i < size; ++i)
				{
   
                        printf("%d ", buffer[i]);
				}
              printf("\n");
        }
        return 0;
}

分析一下数据格式

两个的相对数值都是 256(小数) *128 (整数)
!!! 下面的写反了 !!! 同时好像 4,7 表明的意思是按下和抬起,和正在按

在这里插入图片描述

分析单点event上报的数据

通过getevent 观察滑动事件,发现滑动事件就是一个down事件,加上很多move事件,在最后加一个up事件,因此是否通过sendevent发送这样的事件就可以了 所以我们滑动一个手指头分为 按下 移动 抬起

按下

发送xy坐标 + down事件
其中 location_x代表了此时x的坐标,多点和单点两个的相同

	report_key(EV_ABS, ABS_MT_TRACKING_ID, 0);  //代表手指id
	report_key(EV_ABS, ABS_MT_POSITION_X, location_x);  //多点下x坐标
	report_key(EV_ABS, ABS_MT_POSITION_Y, location_y); //多点下y的坐标
	report_key(1, 330, 1);// 表示按下指令
	report_key(EV_ABS, ABS_X, location_x);//单点下 x坐标
	report_key(EV_ABS, ABS_Y, location_y);//单点下 y坐标
	report_key(0, 0, 0); //同步一下事件
移动

发送move xy坐标

	report_key(EV_ABS, ABS_MT_POSITION_X, location_x);  //多点下x坐标
	report_key(EV_ABS, ABS_MT_POSITION_Y, location_y); //多点下y的坐标
	report_key(EV_ABS, ABS_X, location_x);//单点下 x坐标
	report_key(EV_ABS, ABS_Y, location_y);//单点下 y坐标
	report_key(0, 0, 0); //同步一下事件

抬起

发送up

	report_key(EV_ABS, ABS_MT_TRACKING_ID, -1);  //代表手指消失
	report_key(1, 330, 0);// 表示抬起指令
	report_key(0, 0, 0); //同步一下事件
一个小demo
 report_key(EV_ABS, ABS_MT_TRACKING_ID, 0);  //代表手指id
	report_key(EV_ABS, ABS_MT_POSITION_X, 900
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值