查找官方的文档
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