在Linux环境下,模拟USB HID设备是一项常见的操作,其他USB设备也有类似的配置方法。本文将介绍在Linux系统下,模拟USB HID设备的简单记录,以及配置USB设备所需的步骤。
1. 内核配置
首先,需要在内核中启用USB Gadget,并使用fs(configfs)进行USB device信息的配置。以下是Linux内核配置的相关设置:
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
<*> USB Gadget functions configurable through configfs
[*] HID function
<*> USB Gadget precomposed configurations (Function Filesystem) --->
2. 设备配置
接下来是对HID设备的配置。需要添加以下shell函数至启动脚本中,并根据USB协议自行配置描述符。然后调用该脚本即可完成USB设备的配置。
usb_hid_device_config()
{
if [ -d /sys/kernel/config/usb_gadget/ ] ; then
######USB HID Device config######
cd /sys/kernel/config/usb_gadget/
mkdir -p isticktoit
cd isticktoit
echo 0x0483 > idVendor
echo 0x5710 > idProduct # STM32
echo 0x0215 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "xxxxxx" > strings/0x409/serialnumber
echo "xxxxxx" > strings/0x409/manufacturer
echo "xxxxxx" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "HID_CONFIGUE" > configs/c.1/strings/0x409/configuration
echo 2 > configs/c.1/MaxPower
# Add functions here
mkdir -p functions/hid.usb0
echo 0 > functions/hid.usb0/protocol
echo 0 > functions/hid.usb0/subclass
echo 64 > functions/hid.usb0/report_length
# Set HID in/out desc
echo -ne \\x05\\x81\\x09\\x82\\xa1\\x01\\x09\\x83\\x09\\x84\\x15\\x00\\x26\\xff\\x00\\x75\\x08\\x95\\x40\\x81\\x02\\x09\\x84\\x15\\x00\\x26\\xff\\x00\\x75\\x08\\x95\\x40\\x91\\x02\\xc0 > functions/hid.usb0/report_desc
ln -s functions/hid.usb0 configs/c.1/
# End functions
ls /sys/class/udc > UDC
######USB HID Device end######
else
errlog "usb_gadget not found!"
return 1
fi
}
3. 示例demo
在示例demo中,USB设备节点被标识为/dev/hidg0,以下是一个关于应用层USB收发的示例:
/* hid_gadget_test */
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* 以下是示例的代码 */
// 其他代码
4. 附 Wireshark USB抓包配置
在Wireshark安装时,同时安装USB抓包工具usbpcap后,打开wireshark会看到两个USB捕获接口。可以设置其中一个只抓取新接入的设备:
另外 USBPcap1 的作用是指定抓取未接入的USB设备,而 USBPcap2 的作用是抓取所有已接入的USB设备及新设备。配置后即可抓取新接入USB设备的所有USB包并解析。