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>