USB协议库libusb-1.0介绍

一.libusb库介绍

1.官网:libusb

libusb 是一个 C 库,提供对 USB 设备的通用访问。

可移植的:使用单个跨平台API,它可以访问Linux,macOS,Windows等上的USB设备。

用户模式:应用程序与设备通信不需要特殊特权或提升。

版本无关:支持从 1.0 到 3.1(最新)的所有 USB 协议版本。

  1. 相关资料

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);

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI+程序员在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值