libudev 和 libusb 常见API分析

  1. libudev详解:

    libudev是Linux系统下的一个库,它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制,用于在系统中传递解决方案的有关设备信息,以及在出现设备事件(如删除、插入设备)时触发相应的操作。

    在应用程序中使用libudev可以更方便地操作系统中的设备。

  2. libudev使用:

    1. 初始化

      函数:udev_new()

      作用:创建一个udev library context。udev library context采用引用记数机制,创建的context默认引用记数为1,使用udev_ref和udev_unref增加或减少引用记数,如果引用记数为0,则释放内部资源。

    2. 枚举设备

      函数:udev_enumerate_new(struct udev *udev)

      作用:创建一个枚举器,用于扫描系统已接设备

    3. 监控设备插拔udev的设备(插拔基于netlink实现)

      函数:udev_monitor_new_from_netlink(struct udev *udev, const char *name)

      作用:创建一个新的monitor,函数的第二个参数是事件源的名称,可选"kernel"或"udev",般应用的设计要基于"udev"进行监控。

      函数:udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, const char *subsystem, const char *devtype)

      作用:增加一个基于设备类型的udev事件过滤器,例如: "usb"设备。

      函数:udev_monitor_enable_receiving(struct udev_monitor *udev_monitor); 参数是udev_monitor_new_from_netlink函数返回值。

      作用:启动监控过程。监控可以使用udev_monitor_get_fd获取一个文件描述符,基于返回的fd可以执行poll操作,简化程序设计。

      函数:udev_monitor_get_fd(struct udev_monitor *udev_monitor);

      作用:获取一个文件描述符,基于返回的fd可以执行poll操作

    4. 热插拔事件到达后:

      函数:udev_monitor_receive_device(struct udev_monitor *udev_monitor)

      作用:获取产生事件的设备映射,获取与事件相关的设备信息,使用 udev_device_get_action() 函数来获取设备事件的动作

      函数:udev_device_get_action(struct udev_device *udev_device);

      作用:获取设备事件的动作,返回一个字符串,"add" 表示设备的添加,"remove" 表示设备的移除。

      函数:udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);

      作用:获取设备的系统属性值,例如设备的制造商、型号、序列号等。

    5. 结束:

      函数:udev_device_unref(struct udev_device *udev_device);

      作用:用于减少 udev_device 结构的引用计数,当引用计数为零时,设备将被释放。

      函数:udev_monitor_unref(struct udev_monitor *udev_monitor);

      作用:减少 udev_monitor 结构的引用计数,当引用计数为零时,监视器将被释放。

  3. libusb简介 (https://blog.csdn.net/u014100559/article/details/127377498)

    libusb(Library Universal Serial Bus,通用串行总线库)是一个用于USB设备的开源软件库。它提供了一套应用程序接口(API),使开发人员能够通过USB总线与USB设备进行通信。4.

  4. libusb使用

    1.初始化

    函数:libusb_init(libusb_context **ctx)

    参数:NULL:libusb库将使用默认的上下文(context)进行初始化。这意味着每个调用libusb_init(NULL)的地方都会创建一个新的上下文。这种方式适用于简单的应用程序或者在单线程环境下使用libusb的情况。

    context:libusb_init(&context) 通过传入指向libusb_context类型指针的参数,可以在应用程序中共享同一个上下文。这意味着多个调用libusb_init(&context)的地方将共享同一个上下文,从而允许在多线程环境下使用libusb,并且共享设备列表、设备状态等信息。

    作用:初始化libusb库

    2.枚举和打开设备

    函数:libusb_get_device_list(libusb_context *ctx, libusb_device ***list);

    作用:获取已连接的设备列表。

     函数:libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc)
     作用:获取设备描述符
     
     函数:libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config)
     作用:获取设备配置描述
     
     函数:libusb_open(libusb_device *dev, libusb_device_handle **dev_handle);
     作用:打开设备,一般与枚举配合使用。
     
     函数:libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)
     作用:不需要对设备进行枚举,你只需要简单的传入vid和pid信息即可
     
     函数:libusb_kernel_driver_active(libusb_device_handle *dev_handle, int interface_number)
     作用:用于检查内核驱动程序是否已经加载对应设备的接口,0 表示内核驱动未加载,返回 1 表示内核驱动已加载。如果出现错误,将返回一个负值
     
     函数:libusb_control_transfer();
     作用:是一个用于 USB 控制传输的函数,它可以在 USB 设备和主机之间进行数据传输和通信。
     
     函数:libusb_set_configuration(libusb_device_handle *dev_handle, int configuration);
     作用:设置设备的配置
     
     函数:libusb_claim_interface(libusb_device_handle *dev_handle, int interface_number);
     作用:声明设备的接口,使其能够与主机进行通信。在声明接口之前,需要确保设备已经被打开,并且已经连接到了主机。
     
    函数:libusb_detach_kernel_driver(libusb_device_handle *dev_handle, int interface_number); 
     作用:可以分离接口和内核驱动程序,从而能够声明接口并执行 I/O 操作。
     
     函数:libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, int interface_number, int alternate_setting);
     参数:dev_handle: libusb_open 或者 libusb_open_device_with_vid_pid 返回的 libusb_device_handle 的句柄。
         interface_number: 是要设置备选设置的接口编号。
         alternate_setting: 是要设置的备选设置的编号
     作用:激活接口的备用设置,使其能够与主机进行通信。返回 0 表示成功,返回一个负值表示失败。
     
     函数:libusb_free_config_descriptor(struct libusb_config_descriptor *config);
     作用:用于释放配置描述符的内存
     
     函数:int libusb_release_interface(libusb_device_handle *dev_handle, int interface_number);
     参数:dev_handle : libusb_open 或者 libusb_open_device_with_vid_pid 返回的 libusb_device_handle 的句柄
         interface_number 是要释放的接口编号。
     作用:用于释放已声明的接口
     
     函数:libusb_close()
     作用:关闭与 USB 设备的连接      
    
    1. 通信:

      函数;libusb_bulk_transfer(ibusb_device_handle *dev_handle,unsigned char endpoint, unsigned char *data, int length,int *actual_length, unsigned int timeout);

      作用:传输数据

    4.退出:

     函数:libusb_free_device_list(libusb_device **list, int unref_devices);
     参数:list:指向通过 libusb_get_device_list 函数获取的设备列表的指针
         unref_devices:一个布尔值,如果为 1,则在释放设备列表的同时取消对所有设备的引用。如果为 0,则不会取消对设备的引用。
     作用:用于释放通过 libusb_get_device_list 函数获取的设备列表。
     
     函数:libusb_exit(libusb_context *ctx)
     参数:NULL:当不传入参数时,libusb库将使用默认的上下文(context)来执行退出操作。这意味着它会释放默认上下文所占用的资源。通常在使用libusb_init(NULL)初始化库时,也会使用不传入参数的方式执行退出操作。
         context:libusb_exit(context) 通过传入上下文参数,可以指定要退出的上下文,从而释放特定上下文所占用的资源。这种方式适用于在应用程序中使用了共享上下文的情况。
     作用:退出,释放资源。
    
相关推荐
萨达大3 个月前
C# USB通信技术(通过LibUsbDotNet库)
c#·usb·libusb