一.libusb库介绍
1.官网:libusb
libusb 是一个 C 库,提供对 USB 设备的通用访问。
可移植的:使用单个跨平台API,它可以访问Linux,macOS,Windows等上的USB设备。
用户模式:应用程序与设备通信不需要特殊特权或提升。
版本无关:支持从 1.0 到 3.1(最新)的所有 USB 协议版本。
- 相关资料
libusb GIT仓库:https://github.com/libusb/libusb.git
libusb API接口:https://libusb.sourceforge.io/api-1.0/
libusb 示例:https://github.com/libusb/libusb/tree/master/examples
二.数据结构介绍
1.libusb常用数据结构
libusb_device *list:设备列表
libusb_device_handle *handle:设备句柄
struct libusb_device_descriptor desc:设备描述符
struct libusb_config_descriptor conf:配置描述符
三.libusb常用API函数
1.会话的开启和结束
int libusb_init(libusb_context **ctx);
void libusb_exit(libusb_context *ctx);
2 设备列表的获取和释放
ssize_t libusb_get_device_list(libusb_context *ctx, libusb_device ***list);
void libusb_free_device_list(libusb_device **list, int unref_devices);
3 设备的打开和关闭
int libusb_open(libusb_device *dev, libusb_device_handle **dev_handle);
libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, uint16_t product_id);
void libusb_close(libusb_device_handle *dev_handle);
4 描述符的获取和释放
int libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc);
int libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config);
void libusb_free_config_descriptor(struct libusb_config_descriptor *config);
5 接口
int libusb_claim_interface(libusb_device_handle *dev_handle, int interface_number);
int libusb_release_interface(libusb_device_handle *dev_handle, int interface_number);
6 传输方式:Control、Interrupt、Bulk
int libusb_control_transfer(libusb_device_handle *dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout);
int libusb_interrupt_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout);
int libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout);
7 内核设备
int libusb_kernel_driver_active(libusb_device_handle *dev_handle, int interface_number);
int libusb_attach_kernel_driver(libusb_device_handle *dev_handle, int interface_number);
int libusb_detach_kernel_driver(libusb_device_handle *dev_handle, int interface_number);
int libusb_set_auto_detach_kernel_driver(libusb_device_handle *dev_handle, int enable);
8 热插拔
int libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle);
void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle);
9 其他
uint8_t libusb_get_bus_number(libusb_device *dev); //获取USB设备总线号
uint8_t libusb_get_port_number(libusb_device *dev);
uint8_t libusb_get_device_address(libusb_device *dev); //获取USB设备端口号
int libusb_get_device_speed(libusb_device *dev);
int libusb_get_max_packet_size(libusb_device *dev, unsigned char endpoint);
int libusb_reset_device(libusb_device_handle *dev_handle);
int libusb_has_capability(uint32_t capability);
......
- 代码示例
根据usb设备的VENDOR_ID和PRODUCT_ID 来找到并打开设备:
typedef struct {
libusb_device_handle* handle;
}Usb_device_t;
static Usb_device_t udevice[5] = { 0 };
int main()
{
int ret;
int i = 0,;
ssize_t cnt;
libusb_device** devs;
libusb_device* dev;
int usb_online;
HMODULE hDLL = LoadLibrary(TEXT("libusb-1.0.dll")); //ok TEXT("libusb-1.0.dll")就是把"libusb-1.0.dll"这个字符串以UTF-8格式编码
if (hDLL == NULL)
{
return -1;
}
ret = libusb_init(NULL);
if (ret != 0)
{
return -1;
}
cnt = libusb_get_device_list(NULL, &devs);
while ((dev = devs[i++]) != NULL) {
struct libusb_device_descriptor desc;
ret = libusb_get_device_descriptor(dev, &desc);
if ((VENDOR_ID == desc.idVendor) && (PRODUCT_ID == desc.idProduct)) {
r = libusb_open(dev, &udevice[usb_online].handle);
libusb_claim_interface(udevice[usb_online].handle, 0);
usb_online++;
printf("%04x:%04x(bus %d,device %d),usb_online:%d\n", desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev),usb_online);
}
}
libusb_free_device_list(devs, 1);
}