基于K26 SoM PetaLinux的USB HID数据转发方案咨询
实现方案:HID输入数据转发到FPGA模拟HID设备
一、技术选型确认
- libevdev:必选,负责从
/dev/input/eventX读取HID输入事件(如键盘按键、鼠标坐标),API简洁稳定,适配PetaLinux环境。 - uhidd/usbip:不适用。uhidd用于让Linux自身模拟HID设备,与你的FPGA作为HID设备的场景不符;usbip是远程共享USB设备,无法实现自定义数据转发逻辑。
二、核心实现步骤
1. 用libevdev读取本地HID输入数据
首先在PetaLinux中安装libevdev开发包:
# 方式1:通过petalinux-config配置rootfs petalinux-config -c rootfs # 勾选 libevdev 和 libevdev-dev 后保存退出 # 方式2:直接添加包配置 petalinux-package --package-type ip --add CONFIG_LIBEVDEV=y
编写C程序读取输入事件的示例片段:
#include <libevdev/libevdev.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> int main() { int fd = open("/dev/input/event0", O_RDONLY|O_NONBLOCK); struct libevdev *dev = NULL; int rc = libevdev_new_from_fd(fd, &dev); if (rc < 0) { perror("Failed to init libevdev"); return -1; } struct input_event ev; while (1) { rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); if (rc == 0) { // 针对不同事件类型做处理 if (ev.type == EV_KEY) { printf("Key code: %d, state: %d\n", ev.code, ev.value); // 此处将事件转换为HID报告格式 } else if (ev.type == EV_REL) { printf("Rel axis: %d, value: %d\n", ev.code, ev.value); // 处理鼠标相对坐标事件 } } usleep(1000); } libevdev_free(dev); close(fd); return 0; }
编译时链接libevdev库:
gcc -o hid_reader hid_reader.c -levdev
2. 数据格式转换:input事件转HID报告
Linux的input_event是标准化输入事件,需转换为FPGA模拟HID设备对应的HID报告格式(与FPGA端的HID报告描述符严格匹配):
- 键盘HID报告示例(8字节):第1字节为修饰键位(Ctrl/Shift等,bit对应功能),第2字节预留,第3-8字节为最多6个按键码。比如按下A键(KEY_A=30)时,报告为
0x00 0x00 0x1E 0x00 0x00 0x00 0x00 0x00,松开时将对应按键码位置设为0。 - 鼠标HID报告示例(3字节):第1字节为按键状态,第2字节为X轴偏移,第3字节为Y轴偏移。
3. 将HID报告发送到FPGA的USB端点
基于你已实现的FPGA HID识别功能,分两种发送方式:
- USB Gadget驱动方式:若FPGA的USB被Linux作为gadget设备控制,可直接通过
/dev/hidgX节点发送报告:
需确保PetaLinux已启用int hidg_fd = open("/dev/hidg0", O_WRONLY); if (hidg_fd < 0) { perror("Failed to open hidg device"); return -1; } // 假设key_report为转换后的8字节键盘HID报告 write(hidg_fd, key_report, sizeof(key_report)); // 按需关闭或保持连接CONFIG_USB_G_HID,并在设备树中配置HID gadget节点。 - 直接硬件操作方式:若FPGA的USB控制器通过AXI总线与SoM连接,可通过用户空间驱动将HID报告写入AXI寄存器,触发USB端点传输(具体逻辑需匹配你的FPGA硬件设计)。
4. 整合与调试
- 整合事件读取、格式转换、报告发送逻辑,用环形缓冲区避免输入事件丢包,保证实时性。
- 用
evtest验证本地HID设备的输入事件:evtest /dev/input/event0 - 在外部计算机用HID调试工具(如Linux的
hid-recorder、Windows的USBDeview)验证FPGA发送的报告格式是否正确。
三、关键注意事项
- FPGA端的HID报告描述符必须与转换后的报告格式严格一致,否则外部计算机无法解析输入。
- 处理高频率输入事件时,需优化事件处理逻辑,避免延迟。
- 若使用USB Gadget方式,需确保PetaLinux的USB gadget驱动配置正确,设备树节点与FPGA硬件匹配。
内容的提问来源于stack exchange,提问作者Tungdil
相关产品推荐
相关产品推荐

