Linux5.1内核,用C语言写一段获取USB触摸屏原始数据的代码,未转换成input的USB数据
时间: 2024-03-05 07:51:45 浏览: 15
以下是一个获取USB触摸屏原始数据的示例代码,基于Linux 5.1内核和C语言:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <linux/usbdevice_fs.h>
#include <linux/input.h>
#define VENDOR_ID 0x1234
#define PRODUCT_ID 0x5678
int main(int argc, char** argv)
{
int fd;
char dev_name[20];
struct usbdevfs_urb urb;
unsigned char buf[8];
if(argc != 2)
{
printf("Usage: %s <device>\n", argv[0]);
return 1;
}
sprintf(dev_name, "/dev/bus/usb/%s", argv[1]);
fd = open(dev_name, O_RDWR);
if(fd == -1)
{
perror("open");
return 1;
}
memset(&urb, 0, sizeof(struct usbdevfs_urb));
urb.type = USBDEVFS_URB_TYPE_INTERRUPT;
urb.endpoint = 0x81;
urb.flags = USBDEVFS_URB_NO_TRANSFER_DMA_MAP;
urb.buffer = buf;
urb.buffer_length = sizeof(buf);
urb.usercontext = NULL;
if(ioctl(fd, USBDEVFS_SUBMITURB, &urb) < 0)
{
perror("ioctl");
return 1;
}
while(1)
{
if(read(fd, &urb, sizeof(struct usbdevfs_urb)) < sizeof(struct usbdevfs_urb))
{
perror("read");
return 1;
}
if(urb.status != 0)
{
perror("urb");
return 1;
}
printf("Data: %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
}
close(fd);
return 0;
}
```
该示例代码打开一个 USB 设备文件(例如 `/dev/bus/usb/001/001`),并使用 `USBDEVFS_SUBMITURB` ioctl 发起一个中断传输(endpoint 0x81)。然后使用 `read` 函数从设备文件中读取输入数据。读取到的数据是未转换成 `input` 格式的原始数据,您可以根据 USB 触摸屏的协议解析这些数据。注意,该示例代码中使用了硬编码的厂商 ID 和产品 ID,您需要根据实际情况修改这些值。