博客
关于我
UEFI开发探索90- YIE002USB开发板(13 Linux编程)
阅读量:620 次
发布时间:2019-03-12

本文共 3453 字,大约阅读时间需要 11 分钟。

(请保留-> 作者: 罗冰 )

YIE002USB开发板之Linux编程


上一篇使用hidapi的hidraw方式,实现了Linux上位机与USB HID设备通信的测试程序。不过,只实现了三种通信方式中的两种。本篇将使用hidapi的libusb方式,将三种通信方式全部实现。

1 建立开发目录

与上一篇一样,首先建立开发用的目录。新建文件夹hidlibusb,将以下文件拷贝进去:

libusb/hid.chidapi/hidapi.hhidtest/test.c

为目前的代码编写Makefile,内容如下:

all: hidtest-libusb libslibs: libhidapi-libusb.soCC       ?= gccCFLAGS   ?= -Wall -g -fpicLDFLAGS  ?= -Wall -gCOBJS_LIBUSB = hid.oCOBJS = $(COBJS_LIBUSB) test.oOBJS      = $(COBJS)LIBS_USB  = `pkg-config libusb-1.0 --libs` -lrt -lpthreadLIBS      = $(LIBS_USB)INCLUDES ?= `pkg-config libusb-1.0 --cflags`# Console Test Programhidtest-libusb: $(COBJS)	$(CC) $(LDFLAGS) $^ $(LIBS_USB) -o $@# Shared Libslibhidapi-libusb.so: $(COBJS_LIBUSB)	$(CC) $(LDFLAGS) $(LIBS_USB) -shared -fpic -Wl,-soname,$@.0 $^ -o $@# Objects$(COBJS): %.o: %.c	$(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@clean:	rm -f $(OBJS) hidtest-libusb libhidapi-libusb.so hidtest.o.PHONY: clean libs

2 代码编写

完成了开发目录的创建后,可以对代码进行修改了。

USB HID的三种通信方式,hid_read()&hid_write()通信方式和Feature report的通信方式,在上一篇中已经实现了。由于现在libusb下的hid.c中提供了一致的函数接口,这两种方式的代码完全不用修改,我们只要添加支持Input report和Output report的代码就可以了。

2.1 添加Output report的处理代码

很奇怪的是,在libusb的源文件hid.c中,已经提供了处理Input report的函数hid_get_input_report(),偏偏没有提供处理Output report的函数。

处理Output report的代码编写也很简单,在hid_send_feature_report()函数中修改一个数字就可以了,代码如下:

int HID_API_EXPORT HID_API_CALL  hid_set_output_report(hid_device *dev, const unsigned char *data, size_t length){   	int res = -1;	int skipped_report_id = 0;	int report_number = data[0];	if (report_number == 0x0) {   		data++;		length--;		skipped_report_id = 1;	}	res = libusb_control_transfer(dev->device_handle,		LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,		0x09/*HID set_report*/,		(2/*HID Output*/ << 8) | report_number,		dev->interface,		(unsigned char *)data, length,		1000/*timeout millis*/);	if (res < 0)		return -1;	/* Account for the report ID */	if (skipped_report_id)		length++;	return length;}

2.2 Input report&Output report通信方式

其他两种通信方式,在上一篇中已经实现了,不用再修改任何代码。现在需要添加的,是发送Output report和接收Input report,实现代码如下:

memset(yie_buf,0,sizeof(yie_buf));	yie_buf[0] = 0x00;	yie_buf[1] = 0xA0;	yie_buf[2] = 0x0a;	yie_buf[3] = 0x0b;	yie_buf[4] = 0x0c;	res = hid_set_output_report(handle, yie_buf, 17);	if (res < 0) {   		printf("Unable to send a output report.\n");	}	memset(yie_buf,0,sizeof(yie_buf));	res = hid_get_input_report(handle, yie_buf, sizeof(yie_buf));	if (res < 0) {   		printf("Unable to get a input report.\n");		printf("%ls", hid_error(handle));	}	else {   		// Print out the returned buffer.		printf("Input Report\n   ");		printf("report number:%d\n   ",yie_buf[0]);		for (i = 1; i < res; i++)			printf("%02x ", yie_buf[i]);		printf("\n");	}

启动命令行,使用make命令编译,得到执行文件hidtest-libusb。

插入自制的USB HID设备,运行hidtest-libusb,输出信息如下:

robin@NUC6CAYHC:~/luotest/hidapi$ sudo ./ hidtest-libusb…… //略Manufacturer String: RobinProduct String: Robin's UEFI ExplorerSerial Number String: (77) My123Indexed String 1: RobinFeature Report   report number:0   a0 03 0b 0c 00 00 00 00 00 00 00 00 00 00 00 00 Input Report   report number:0   a0 02 0b 0c 00 00 00 00 00 00 00 00 00 00 00 00 Read data,Length=16   a0 01 0b 0c 00 00 00 00 00 00 00 00 00 00 00 00

对照以前制作USB HID设备的博客,可知三种通信模式,已经都实现了。

至此,我们在YIE002开发板的开篇中,规划的所有代码,都已经完成了。从开发板的USB HID设备制作,到上位机的Windows软件、UEFI软件和Linux软件,全部介绍完毕。

YIE002开发板,与UEFI相关的学习,到此篇为止,全部结束。关于此开发板的其他嵌入式编程,请移步到我的“嵌入式开发”专栏中惠览,我会不定期更新的。

Gitee地址:https://gitee.com/luobing4365/uefi-exolorer

项目代码位于:/ 90 hidlibusb下


转载地址:http://skxxz.baihongyu.com/

你可能感兴趣的文章
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>