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

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

YIE002USB开发板之Linux编程

1 建立开发目录

与上一篇文章类似,首先创建开发目录,新建文件夹hidlibusb并将以下文件复制进去:

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

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

all: hidtest-libusb libs
libs: libhidapi-libusb.so
CC ?= gcc
CFLAGS ?= -Wall -g -fpic
LDFLAGS ?= -Wall -g
COBJS_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;
}
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: (77) My123
Indexed String 1: Robin
Feature 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.com/luobing4365/uefi-explorer

代码存储路径:/90/hidlibusb下

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

你可能感兴趣的文章
Nginx 配置解析:从基础到高级应用指南
查看>>
nginx+php的搭建
查看>>
nginx+tomcat+memcached
查看>>
nginx+Tomcat性能监控
查看>>
nginx+uwsgi+django
查看>>
Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
查看>>
Nginx下配置codeigniter框架方法
查看>>
Nginx之二:nginx.conf简单配置(参数详解)
查看>>
Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
查看>>
Nginx代理初探
查看>>
Nginx代理外网映射
查看>>
Nginx代理模式下 log-format 获取客户端真实IP
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
查看>>
nginx总结及使用Docker创建nginx教程
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in usrlocalnginxconfnginx.conf128
查看>>
nginx最最最详细教程来了
查看>>