libusb系列-005-部分API简介
文章目录
- libusb系列-005-部分API简介
- 摘要
- libusb_init
- libusb_open_device_with_vid_pid
- libusb_kernel_driver_active
- libusb_detach_kernel_driver
- libusb_claim_interface
- libusb_release_interface
- libusb_attach_kernel_driver
- libusb_close
- libusb_exit
- libusb_interrupt_transfer
- libusb_bulk_transfer
关键字:
Debian
、
Linux
、
Qt
、
libusb
、
API
内容背景:
最近项目终于切到Linux下开发了,所以最近的记录都是发生在
Debian 10
以及Arm Debain 10
下,Qt
版本5.12.3
。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。开始本来USB传世使用的是HIDUSB,后面计划开发一个专用的驱动,到最后,因为最终系统一直定不下来,最终成了使用libusb了。大部分人都是直接使用libusb 的库的,把源码直接放在项目中参与编译的应该很好,哎,我就是那个大冤种,那么请跟随我一起看我如何给自己完坑踩坑吧。
摘要
本着现用现学,现学现卖的原则,这篇就简单介绍一下我在项目中实际使用的几个接口,其他接口等用到再说,或者后期有精力且闲的蛋疼了再研究(就是没有了)。
libusb_init
名字就说明了一切了,就是libusb库的初始化函数,也可以理解为libusb 的入口函数吧,最先调用
int libusb_init(libusb_context **ctx);
✍参数:
ctx 通常设置为NULL。
☄返回值:
返回0表示成功,非零表示失败 ,可以通过
libusb_error_name
打印错误信息。
这里放下我在代码中的使用
if((libusb_init(NULL) < 0))
{
qDebug() <<"failed to initialise libusb" << LOGINFOR;
return false;
}
libusb_open_device_with_vid_pid
通过VID和PID打开一个USB 设备,并返回设备句柄libusb_device_handle的指针
libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(libusb_context *ctx,
uint16_t vendor_id,
uint16_t product_id);
✍参数:
ctx 通常为NULL
vendor_id 设备的VID
product_id 设备的PID
☄返回值:
成功返回libusb_device_handle的指针 ,失败返回NULL
我在项目中的使用
devhandle = libusb_open_device_with_vid_pid(NULL, USB_DEV_VID, USB_DEV_PID);
libusb_kernel_driver_active
确定指定接口的内核驱动程序是否已经激活。如果一个内核驱动程序是激活的,libusb_claim_interface调用的会失败
int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev,
int interface_number);
✍参数:
dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
interface_number 接口号,这个对应接口描述符的 bInterfaceNumber
☄返回值:
1 已经激活,非1 没有激活
libusb_detach_kernel_driver
卸载指定接口的内核驱动程序。如果一个内核驱动程序是激活的,必须先调用这个函数,再调用libusb_claim_interface
int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev,
int interface_number);
✍参数:
dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
interface_number 接口号,这个对应接口描述符的 bInterfaceNumber
☄返回值:
0 成功,非0失败
libusb_claim_interface
为指定的设备申请接口
int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev,
int interface_number);
✍参数:
dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
interface_number 接口号,这个对应接口描述符的 bInterfaceNumber
☄返回值:
0 成功,非0失败
libusb_release_interface
释放之前为指定的设备申请接口,注意这个函数只是释放接口,不会重新加载内核驱动
int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev,
int interface_number);
✍参数:
dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
interface_number 接口号,这个对应接口描述符的 bInterfaceNumber
☄返回值:
0 成功,非0失败
libusb_attach_kernel_driver
加载指定接口的内核驱动
int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev,
int interface_number);
✍参数:
dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
interface_number 接口号,这个对应接口描述符的 bInterfaceNumber
☄返回值:
0 成功,非0失败
libusb_close
关闭 libusb_open或者libusb_open_device_with_vid_pid打开的设备
void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle);
✍参数:
dev_handle 调用libusb_open或者libusb_open_device_with_vid_pid返回的设备句柄libusb_device_handle的指针
libusb_exit
和libusb_init成对使用,释放相应的资源。
void libusb_exit(libusb_context *ctx);
✍参数:
ctx通常设置NULL
libusb_interrupt_transfer
执行USB中断传输。该函数可以处理输入和输出,根据端点地址的方向位推断传输方向,该函数采用同步模式,数据传输完毕才返回
int LIBUSB_CALL libusb_interrupt_transfer(
libusb_device_handle *dev_handle,
unsigned char endpoint,
unsigned char *data,
int length,
int *actual_length,
unsigned int timeout);
✍参数:
dev_handle 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
endpoint 端点地址 最高位为1表示输入
data 发送或者接收缓冲区指针
length 缓冲区长度
actual_length 带回实际传输长度
timeout 超时的毫秒数,0 永不超时
☄返回值:
0 成功,非0失败
libusb_bulk_transfer
执行USB批量传输。该函数可以处理输入和输出,根据端点地址的方向位推断传输方向,该函数采用同步模式,数据传输完毕才返回
int LIBUSB_CALL libusb_bulk_transfer(
libusb_device_handle *dev_handle,
unsigned char endpoint,
unsigned char *data,
int length,
int *actual_length,
unsigned int timeout);
✍参数:
dev_handle 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄
endpoint 端点地址 最高位为1表示输入
data 发送或者接收缓冲区指针
length 缓冲区长度
actual_length 带回实际传输长度
timeout 超时的毫秒数,0 永不超时
☄返回值:
0 成功,非0失败
目前我只用到这么多,其他的,可以参考官方文档。参考链接https://blog.51cto.com/u_3078781/3288743