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

如何将Linux下usb_bulk_msg替换为QNX libusbdi函数适配USB3视觉驱动

用QNX libusbdi替代Linux usb_bulk_msg()的实现方案

Linux的usb_bulk_msg()是同步批量传输函数,在QNX libusbdi中没有直接对应的同名函数,但可以通过usb_bulk_read()和usb_bulk_write()组合实现完全替代,具体如下:

核心对应逻辑

usb_bulk_msg()同时支持IN(设备到主机)和OUT(主机到设备)方向的批量传输,QNX通过两个独立函数区分方向:

  • 接收IN端点数据:使用usb_bulk_read()
  • 发送数据到OUT端点:使用usb_bulk_write()

关键参数映射

  1. 端点号处理:
    Linux的pipe参数包含方向位(高字节的0x80表示IN)和端点号(低4位),QNX不需要组合值,直接传入端点编号(低4位数值),通过调用的函数区分方向。
  2. 返回值与实际长度:
    • Linux:成功返回0,实际传输长度存入actual_len指针
    • QNX:usb_bulk_read()/usb_bulk_write()成功返回实际传输字节数,失败返回负错误码;可自行封装对齐Linux的返回逻辑。
  3. 超时参数:两者的超时单位均为毫秒,直接复用即可。

代码示例

Linux原代码(IN端点)

int ret;
int actual_len;
// 0x82为IN批量端点(方向位0x80 + 端点号0x02)
ret = usb_bulk_msg(dev_handle, 0x82, buffer, BUF_SIZE, &actual_len, 5000);

QNX替代代码(IN端点)

int ret;
int actual_len;
// 直接传入端点号0x02,调用usb_bulk_read处理IN方向
ret = usb_bulk_read(dev_handle, 0x02, buffer, BUF_SIZE, 5000);
if (ret >= 0) {
    actual_len = ret;
    ret = 0; // 对齐Linux的成功返回值
} else {
    actual_len = 0;
}

Linux原代码(OUT端点)

int ret;
int actual_len;
// 0x02为OUT批量端点
ret = usb_bulk_msg(dev_handle, 0x02, buffer, BUF_SIZE, &actual_len, 5000);

QNX替代代码(OUT端点)

int ret;
int actual_len;
// 直接传入端点号0x02,调用usb_bulk_write处理OUT方向
ret = usb_bulk_write(dev_handle, 0x02, buffer, BUF_SIZE, 5000);
if (ret >= 0) {
    actual_len = ret;
    ret = 0; // 对齐Linux的成功返回值
} else {
    actual_len = 0;
}

封装兼容函数(可选)

如果需要完全兼容Linux的usb_bulk_msg()接口,可自行封装一个适配函数,减少代码修改量:

#include <usb.h>

int qnx_usb_bulk_msg(usb_dev_handle *dev, int pipe, char *data, int len, int *actual_len, int timeout)
{
    const int ep = pipe & 0x0F; // 提取端点编号
    const int is_in = (pipe & 0x80) != 0; // 判断是否为IN方向
    int ret;

    if (is_in) {
        ret = usb_bulk_read(dev, ep, data, len, timeout);
    } else {
        ret = usb_bulk_write(dev, ep, data, len, timeout);
    }

    // 对齐Linux的返回逻辑
    if (actual_len != NULL) {
        *actual_len = (ret >= 0) ? ret : 0;
    }
    return (ret >= 0) ? 0 : ret;
}

使用时直接替换原usb_bulk_msg()调用即可。

内容的提问来源于stack exchange,提问作者Nahel Verdier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:33:37