admin 管理员组文章数量: 887016
UEFI开发探索90
(请保留-> 作者: 罗冰 )
YIE002USB开发板之Linux编程
- 1 建立开发目录
- 2 代码编写
- 2.1 添加Output report的处理代码
- 2.2 Input report&Output report通信方式
上一篇使用hidapi的hidraw方式,实现了Linux上位机与USB HID设备通信的测试程序。不过,只实现了三种通信方式中的两种。本篇将使用hidapi的libusb方式,将三种通信方式全部实现。
1 建立开发目录
与上一篇一样,首先建立开发用的目录。新建文件夹hidlibusb,将以下文件拷贝进去:
libusb/hid.c
hidapi/hidapi.h
hidtest/test.c
为目前的代码编写Makefile,内容如下:
all: hidtest-libusb libslibs: libhidapi-libusb.so
CC ?= gcc
CFLAGS ?= -Wall -g -fpic
LDFLAGS ?= -Wall -gCOBJS_LIBUSB = hid.o
COBJS = $(COBJS_LIBUSB) test.o
OBJS = $(COBJS)
LIBS_USB = `pkg-config libusb-1.0 --libs` -lrt -lpthread
LIBS = $(LIBS_USB)
INCLUDES ?= `pkg-config libusb-1.0 --cflags`# Console Test Program
hidtest-libusb: $(COBJS)$(CC) $(LDFLAGS) $^ $(LIBS_USB) -o $@
# Shared Libs
libhidapi-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: Robin
Product String: Robin's UEFI Explorer
Serial Number String: (77) My123
Indexed String 1: Robin
Feature Reportreport number:0a0 03 0b 0c 00 00 00 00 00 00 00 00 00 00 00 00
Input Reportreport number:0a0 02 0b 0c 00 00 00 00 00 00 00 00 00 00 00 00
Read data,Length=16a0 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地址:
项目代码位于:/ 90 hidlibusb下
本文标签: UEFI开发探索90
版权声明:本文标题:UEFI开发探索90 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732360256h1535014.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论