如何将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()
关键参数映射
- 端点号处理:
Linux的pipe参数包含方向位(高字节的0x80表示IN)和端点号(低4位),QNX不需要组合值,直接传入端点编号(低4位数值),通过调用的函数区分方向。 - 返回值与实际长度:
- Linux:成功返回
0,实际传输长度存入actual_len指针 - QNX:
usb_bulk_read()/usb_bulk_write()成功返回实际传输字节数,失败返回负错误码;可自行封装对齐Linux的返回逻辑。
- Linux:成功返回
- 超时参数:两者的超时单位均为毫秒,直接复用即可。
代码示例
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
相关产品推荐
相关产品推荐

