9

UEFI开发探索90- YIE002USB开发板(13 Linux编程)

 3 years ago
source link: http://yiiyee.cn/blog/2021/05/13/uefi%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a290-yie002usb%e5%bc%80%e5%8f%91%e6%9d%bf%ef%bc%8813-linux%e7%bc%96%e7%a8%8b%ef%bc%89/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

UEFI开发探索90- YIE002USB开发板(13 Linux编程)

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

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

1 建立开发目录

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

libusb/hid.c
hidapi/hidapi.h
hidtest/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,[email protected] $^ -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 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下

144 total views, 1 views today

210c9a4d410d265665667a36fbe0f529?s=49&d=identicon&r=g作者 罗冰(Robin)发布于 2021年5月13日2021年5月13日分类 BIOS/UEFI


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK