/dev/hidraw节点调试工具

本文介绍了hidtest工具,用于测试/dev/hidraw节点,涵盖命令行解析、hidraw操作等功能,如set report、get report等。适用于基于Linux的平台,功能包括列举hidraw信息、读写操作等,是调试USB HID设备的实用工具。
摘要由CSDN通过智能技术生成
1.概述

本hidtest这个bin主要通过hid的ioctrl去测试hidraw节点,获取节点设备名称,有读写节点的功能,故可以做到set report、get report等操作。

2.适用范围

各基于linux的平台,只有一个C文件即sample_hidtest.c,编译成bin运行即可。

3.功能点叙述

3.1 命令行解析函数getopt()

getopt()函数声明如下:
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

char *optarg:当前选项参数字串(如果有)。
int optind:argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到,初始时为1。
int opterr:这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息。
int optopt:当发现无效选项字符之时,getopt()函数或返回’?‘字符,或返回’:'字符,并且optopt包含了所发现的无效选项字符,设为0将不打印错误信息。

getopt()使用optstring所指的字串作为短参数列表,像"1ac:d::"就是一个短参数列表。短参数的定义是一个’-‘后面跟一个字母或数字,像-a, -b就是一个短参数。每个数字或字母定义一个参数。
  其中短参数在getopt定义里分为三种:
  1. 不带值的参数,它的定义即是参数本身。
  2. 必须带值的参数,它的定义是在参数本身后面再加一个冒号。
  3. 可选值的参数,它的定义是在参数本身后面加两个冒号 。
  在这里拿上面的"1ac:d::"作为样例进行说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。
  在实际调用中,’-1 -a -c cvalue -d’, ‘-1 -a -c cvalue -ddvalue’, ‘-1a -ddvalue -c cvalue’都是合法的。这里需要注意三点:
  1. 不带值的参数可以连写,像1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。
  2. 参数不分先后顺序,’-1a -c cvalue -ddvalue’和’-d -c cvalue -a1’的解析结果是一样的。
  3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析错误。

所以使用函数getopt就可以组合终端很多的输入命令啦。

3.2 hidraw的操作
list_all_hidraw_info() 通过搜寻"/dev/hidraw"节点去打开fd,通过"HIDIOCGRAWNAME"这个ioctrl命令获取name等信息,通过"HIDIOCGRAWINFO"获取VID、PID、bustype等信息,通过"HIDIOCGRHIDVERSION"获取版本bcd信息等。

set_hid_feature get_hid_feature 分别通过"HIDIOCSFEATURE"、"HIDIOCGFEATURE"去执行set feature、get feature操作。在实际项目中,得到某个触摸框的某个接口feature和去设置feature,比如设置笔的mode等十分方便,是调试利器。

3.3 命令例子
./sample_hidtest -d /dev/hidraw0 -g 8
get feature 8字节数据

./sample_hidtest -d /dev/hidraw1 -s 3 0x00 0x03 0x15
set feature 3字节数据。数据为0x00 0x03 0x15

./sample_hidtest -l
列出所有hidraw的信息

附录
#define _GNU_SOURCE
#include <linux/types.h>
#include <linux/input.h>
#include <linux/hidraw.h>
#include <dirent.h>
#include <linux/hiddev.h>

#ifndef HIDIOCSFEATURE
#warning please have your distro update the userspace kernel headers
#define HIDIOCSFEATURE(len)     _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len)
#define HIDIOGSFEATURE(len)     _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len)
#endif

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值