通过HIDDEV编程接口读取易方数码笔的坐标数据

本文介绍了如何通过Linux内核的hiddev接口读取易方数码笔作为USB HID设备的原始坐标数据,以提升在Android平板上的精度。通过配置内核启用hiddev选项,并使用ioctl调用进行数据交换,实现与数码笔的自定义通讯,从而获取高精度的笔迹坐标。
摘要由CSDN通过智能技术生成

易方数码笔缺省是一个标准的USB HID设备(Mouse),在 Android 平板电脑上接入时,基于USB Mouse 形式输出的笔迹精度不够,为此,我们将其切换至hiddev设备类型,通过发送相关命令来获得笔输出的原始坐标信息,这样精度就大大提升了。

基于USB HID协议,除可实现为普通的输入设备外,也可用作为有自定义通讯功能的设备。事实上,当前Linux 内核中已提供了这两种HID事件的接口,即输入子系统和hiddev接口(具体请参见linux内核根目录下的Documentation/hid/hiddev.txt文档)。

为使用hiddev设备,我们只需在配置内核时要打开hiddev选项,这样就可以编写应用级代码来读取笔的原始坐标信息了。hiddev驱动是一个字符型驱动,其访问节点一般为/dev/usb/hiddev[0~15],在应用程序中打开这个设备节点后,即可调用hiddev API来与hiddev设备进行通讯。

hiddev API有两个调用接口,read和ioctl调用。read只用于获取hiddev设备的状态变化,而主机与设备间进行数据交换是通过ioctl调用来实现的,写数据时传入ioctl的命令字为HDIOCSREPORT,读数据时则传入HDIOCGREPORT,传送的数据封装在report中,每个report分成多个filed,而每个filed又有多个usage。

访问数码笔时,我们要向设备发命令数据来通知设备切换输出模式(输出原始坐标信息),同时,我们也要实时地读取出数据笔输出的原始坐标信息。

1. 打开设备

int digitalpen_open(void)  
{  
  int  index;  
  int  fd;  
  char hid_dev_node[50];  
  struct hiddev_devinfo dinfo;  
   
  for(index = 0; index < 15; index ++) {  
   
    sprintf(hid_dev_node, "/dev/usb/hiddev%d", index);  
    fd = open(hid_dev_node, O_RDONLY);  
   
    if(fd > 0) {  
   
      memset(&dinfo, 0, sizeof(dinfo));  
      ioctl(fd, HIDIOCGDEVINFO, &dinfo);  
   
      if( (dinfo.vendor == 0x0e20) && (dinfo.product == 0x0101))  
        break;  
   
      close(fd);  
      fd = -1;  
   
    }  
  }  
   
  return fd;  
}  
打开函数中通过对USB的VID和PID信息来确认所打开的设备是否为数码笔(可通过以下命令查到设备的VID和PID)。如打开成功,返回的是数码笔设备的文件描述符。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hid_add_device函数中过滤特定设备,可以使用hid_device_id结构体中的vendor和product字段来指定特定的设备。具体步骤如下: 1. 首先,在hid_device_id结构体中设置vendor和product字段的值,以匹配你要过滤的设备。 ```c static const struct hid_device_id my_hid_devices[] = { { HID_USB_DEVICE(0x1234, 0xabcd) }, /* vendor: 1234, product: abcd */ { }, }; ``` 2. 在hid_driver结构体中,将driver.name字段设置为你的驱动程序名称,将driver.id_table字段设置为你的hid_device_id数组。 ```c static struct hid_driver my_hid_driver = { .name = "my_hid_driver", .id_table = my_hid_devices, .probe = my_hid_probe, .disconnect = my_hid_disconnect, }; ``` 3. 在hid_add_device函数中,将设备的vendor和product字段与你的hid_device_id数组中的值进行匹配。如果匹配成功,则调用hid_alloc_device函数分配设备,并将设备添加到系统中。 ```c static int my_hid_probe(struct hid_device *hdev, const struct hid_device_id *id) { if (id->vendor == 0x1234 && id->product == 0xabcd) { /* Allocate a new HID device */ struct hid_device *new_dev = hid_alloc_device(); if (!new_dev) return -ENOMEM; /* Set the HID device properties */ new_dev->dev.parent = &hdev->dev; new_dev->bus = hdev->bus; new_dev->driver = &my_hid_driver; new_dev->ll_driver = &my_hid_ll_driver; new_dev->hiddev_rdesc_size = sizeof(struct my_hid_device); new_dev->hiddev_rdesc = my_hid_device_rdesc; /* Add the new HID device to the system */ hid_hw_start(new_dev, HID_CONNECT_DEFAULT); } return 0; } ``` 通过这种方式,你就可以在hid_add_device函数中过滤特定设备了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值