You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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节点发送报告:
    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));
    // 按需关闭或保持连接
    
    需确保PetaLinux已启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:17:17