searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

libusb入门(一)

2024-05-23 08:59:11
278
0

1. libusb是云电脑常用的重定向库

libusb是一个开源的C库,提供对USB设备的用户空间访问。它使得开发者可以在没有内核模块的情况下,通过用户空间程序与USB设备通信。libusb被广泛应用于各种场景,包括云电脑的USB设备重定向。云电脑环境下,用户通常需要访问本地的USB设备(如U盘、打印机、ukey等),libusb通过其强大的设备重定向功能,实现了这种需求。

2. libusb的整体框架

libusb的架构相对简单,主要由以下几个组件构成:

  • 上下文(Context) ​:libusb通过上下文来管理和追踪库的状态信息。每个上下文代表一个独立的libusb会话。
  • 设备和设备句柄(Device and Device Handle):设备是libusb与物理USB设备的抽象表示,而设备句柄则是操作设备的句柄,用于执行具体的I/O操作。
  • 传输(Transfer) ​:libusb支持同步和异步传输,通过传输机制与设备进行数据交换。
  • 热插拔事件(Hotplug Events) :libusb提供热插拔检测机制,允许应用程序在设备插入或移除时收到通知。

这些组件协同工作,为用户提供了一个高效、灵活的USB设备访问框架。

3. libusb常用API

libusb提供了丰富的API,以满足不同场景的需求。以下是一些常用的API:

  • 初始化和关闭
    • libusb_init(libusb_context **ctx): 初始化libusb库。
    • libusb_exit(libusb_context *ctx): 关闭libusb库,释放资源。
  • 设备发现和操作
    • libusb_get_device_list(libusb_context *ctx, libusb_device ***list): 获取连接到系统的USB设备列表。
    • libusb_open(libusb_device *dev, libusb_device_handle **handle): 打开指定的USB设备。
    • libusb_close(libusb_device_handle *handle): 关闭USB设备句柄。
  • 数据传输
    • libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout): 执行批量传输。
    • libusb_control_transfer(libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout): 执行控制传输。
  • 热插拔
    • 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): 注册热插拔回调函数。

4. libusb使用示例

下面是一个简单的libusb使用示例,展示如何枚举USB设备并打印其设备描述符:

#include <libusb-1.0/libusb.h>
#include <stdio.h>

void print_device_descriptor(libusb_device *device) {
    struct libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(device, &desc);
    if (r < 0) {
        fprintf(stderr, "Failed to get device descriptor\n");
        return;
    }

    printf("Number of possible configurations: %d\n", desc.bNumConfigurations);
    printf("Device Class: %d\n", desc.bDeviceClass);
    printf("VendorID: %04x\n", desc.idVendor);
    printf("ProductID: %04x\n", desc.idProduct);
}

int main() {
    libusb_context *ctx = NULL;
    libusb_device **devs;
    ssize_t cnt;
    int r;

    r = libusb_init(&ctx);
    if (r < 0) {
        fprintf(stderr, "Failed to initialize libusb\n");
        return 1;
    }

    cnt = libusb_get_device_list(ctx, &devs);
    if (cnt < 0) {
        fprintf(stderr, "Failed to get device list\n");
        libusb_exit(ctx);
        return 1;
    }

    for (ssize_t i = 0; i < cnt; i++) {
        print_device_descriptor(devs[i]);
    }

    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);
    return 0;
}

该示例程序首先初始化libusb库,然后获取当前连接到系统的USB设备列表,并遍历每个设备,打印其设备描述符中的信息。最后,释放设备列表并关闭libusb库。通过这个简单的示例,可以看到libusb的API使用相对直接,且功能强大。

libusb为开发者提供了灵活且高效的方式来访问和操作USB设备,无论是在嵌入式系统、桌面应用,还是云电脑环境中,都能很好地满足各种需求。

0条评论
作者已关闭评论
严****科
4文章数
0粉丝数
严****科
4 文章 | 0 粉丝
原创

libusb入门(一)

2024-05-23 08:59:11
278
0

1. libusb是云电脑常用的重定向库

libusb是一个开源的C库,提供对USB设备的用户空间访问。它使得开发者可以在没有内核模块的情况下,通过用户空间程序与USB设备通信。libusb被广泛应用于各种场景,包括云电脑的USB设备重定向。云电脑环境下,用户通常需要访问本地的USB设备(如U盘、打印机、ukey等),libusb通过其强大的设备重定向功能,实现了这种需求。

2. libusb的整体框架

libusb的架构相对简单,主要由以下几个组件构成:

  • 上下文(Context) ​:libusb通过上下文来管理和追踪库的状态信息。每个上下文代表一个独立的libusb会话。
  • 设备和设备句柄(Device and Device Handle):设备是libusb与物理USB设备的抽象表示,而设备句柄则是操作设备的句柄,用于执行具体的I/O操作。
  • 传输(Transfer) ​:libusb支持同步和异步传输,通过传输机制与设备进行数据交换。
  • 热插拔事件(Hotplug Events) :libusb提供热插拔检测机制,允许应用程序在设备插入或移除时收到通知。

这些组件协同工作,为用户提供了一个高效、灵活的USB设备访问框架。

3. libusb常用API

libusb提供了丰富的API,以满足不同场景的需求。以下是一些常用的API:

  • 初始化和关闭
    • libusb_init(libusb_context **ctx): 初始化libusb库。
    • libusb_exit(libusb_context *ctx): 关闭libusb库,释放资源。
  • 设备发现和操作
    • libusb_get_device_list(libusb_context *ctx, libusb_device ***list): 获取连接到系统的USB设备列表。
    • libusb_open(libusb_device *dev, libusb_device_handle **handle): 打开指定的USB设备。
    • libusb_close(libusb_device_handle *handle): 关闭USB设备句柄。
  • 数据传输
    • libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout): 执行批量传输。
    • libusb_control_transfer(libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout): 执行控制传输。
  • 热插拔
    • 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): 注册热插拔回调函数。

4. libusb使用示例

下面是一个简单的libusb使用示例,展示如何枚举USB设备并打印其设备描述符:

#include <libusb-1.0/libusb.h>
#include <stdio.h>

void print_device_descriptor(libusb_device *device) {
    struct libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(device, &desc);
    if (r < 0) {
        fprintf(stderr, "Failed to get device descriptor\n");
        return;
    }

    printf("Number of possible configurations: %d\n", desc.bNumConfigurations);
    printf("Device Class: %d\n", desc.bDeviceClass);
    printf("VendorID: %04x\n", desc.idVendor);
    printf("ProductID: %04x\n", desc.idProduct);
}

int main() {
    libusb_context *ctx = NULL;
    libusb_device **devs;
    ssize_t cnt;
    int r;

    r = libusb_init(&ctx);
    if (r < 0) {
        fprintf(stderr, "Failed to initialize libusb\n");
        return 1;
    }

    cnt = libusb_get_device_list(ctx, &devs);
    if (cnt < 0) {
        fprintf(stderr, "Failed to get device list\n");
        libusb_exit(ctx);
        return 1;
    }

    for (ssize_t i = 0; i < cnt; i++) {
        print_device_descriptor(devs[i]);
    }

    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);
    return 0;
}

该示例程序首先初始化libusb库,然后获取当前连接到系统的USB设备列表,并遍历每个设备,打印其设备描述符中的信息。最后,释放设备列表并关闭libusb库。通过这个简单的示例,可以看到libusb的API使用相对直接,且功能强大。

libusb为开发者提供了灵活且高效的方式来访问和操作USB设备,无论是在嵌入式系统、桌面应用,还是云电脑环境中,都能很好地满足各种需求。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0