-
libudev详解:
libudev是Linux系统下的一个库,它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制,用于在系统中传递解决方案的有关设备信息,以及在出现设备事件(如删除、插入设备)时触发相应的操作。
在应用程序中使用libudev可以更方便地操作系统中的设备。
-
libudev使用:
-
初始化
函数:udev_new()
作用:创建一个udev library context。udev library context采用引用记数机制,创建的context默认引用记数为1,使用udev_ref和udev_unref增加或减少引用记数,如果引用记数为0,则释放内部资源。
-
枚举设备
函数:udev_enumerate_new(struct udev *udev)
作用:创建一个枚举器,用于扫描系统已接设备
-
监控设备插拔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操作
-
热插拔事件到达后:
函数: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);
作用:获取设备的系统属性值,例如设备的制造商、型号、序列号等。
-
结束:
函数:udev_device_unref(struct udev_device *udev_device);
作用:用于减少 udev_device 结构的引用计数,当引用计数为零时,设备将被释放。
函数:udev_monitor_unref(struct udev_monitor *udev_monitor);
作用:减少 udev_monitor 结构的引用计数,当引用计数为零时,监视器将被释放。
-
-
libusb简介 (https://blog.csdn.net/u014100559/article/details/127377498)
libusb(Library Universal Serial Bus,通用串行总线库)是一个用于USB设备的开源软件库。它提供了一套应用程序接口(API),使开发人员能够通过USB总线与USB设备进行通信。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 设备的连接
-
通信:
函数;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) 通过传入上下文参数,可以指定要退出的上下文,从而释放特定上下文所占用的资源。这种方式适用于在应用程序中使用了共享上下文的情况。 作用:退出,释放资源。
-
libudev 和 libusb 常见API分析
青湦2023-09-02 21:01