我如何知道 USB 设备是否已在使用中?
How can I know if a USB device is already in use?
我正在使用 C 库 libusb 为 USB 设备编写 C++ Linux 用户空间驱动程序。我有同一设备的两个副本(相同的供应商 ID 和产品 ID),想知道如何处理这种情况。
以下是我能想到的可能性:
libusb_get_device_list() returns 仅限当前未使用的设备
我可以使用设备描述符的信息来区分已使用和未使用的设备,使用 libusb_get_device_descriptor()
当前正在使用的设备上的 libusb_open() 将失败,返回 LIBUSB_ERROR_ACCESS 或 LIBUSB_ERROR
我该如何处理?在处理许多相同设备时,前面的哪个选项(如果有)是 libusb 的行为?如何区分使用中的设备和闲置的设备?
正如@fiscblog 在他的回答中所说,"Identification is done via the device descriptor (use the serialnumber which should always be unique)"。我的问题是,为了这样做,两个驱动程序应该进行通信以了解哪个实例正在处理哪个设备(例如,使用文件),我想避免这种情况。我还想避免引入多线程并用一个驱动程序管理两个设备,因为我不具备以高效且可控的方式这样做的技能(讨厌的竞争条件......!)
正确的处理方式是:
- 枚举所有设备(获取设备列表)
- 识别请求的设备并打开它
识别是通过设备描述符完成的(使用应该始终唯一的序列号),正如您自己发现的那样。
如何知道设备是否正在使用?
如果设备 已打开 ,将为 I/O 绑定和配置端点。因此您无法再次打开它,但会得到您提到的错误代码。
根据 libusb_claim_interface() 上的文档:
Interface claiming is used to instruct the underlying operating system that your application wishes to take ownership of the interface.
所以你应该能够在每台设备上调用 libusb_claim_interface() 并且它应该只在无人认领的设备上成功:
It is legal to attempt to claim an already-claimed interface, in which case libusb just returns 0 without doing anything.
libusb 是用 C 编写的,并遵循相同的访问设备、文件描述符、流等的基本通用准则。
1 - 连接到设备
2 - 检查连接,如果有错误,通知 return
3 - 没有错误!!互动
按照这个基本流程,恕我直言,您的解决方案非常简单:
- 识别设备
- 遍历它们尝试连接,直到没有抛出失败
- 做点什么
- 关闭
我正在使用 C 库 libusb 为 USB 设备编写 C++ Linux 用户空间驱动程序。我有同一设备的两个副本(相同的供应商 ID 和产品 ID),想知道如何处理这种情况。
以下是我能想到的可能性:
libusb_get_device_list() returns 仅限当前未使用的设备
我可以使用设备描述符的信息来区分已使用和未使用的设备,使用 libusb_get_device_descriptor()
当前正在使用的设备上的 libusb_open() 将失败,返回 LIBUSB_ERROR_ACCESS 或 LIBUSB_ERROR
我该如何处理?在处理许多相同设备时,前面的哪个选项(如果有)是 libusb 的行为?如何区分使用中的设备和闲置的设备?
正如@fiscblog 在他的回答中所说,"Identification is done via the device descriptor (use the serialnumber which should always be unique)"。我的问题是,为了这样做,两个驱动程序应该进行通信以了解哪个实例正在处理哪个设备(例如,使用文件),我想避免这种情况。我还想避免引入多线程并用一个驱动程序管理两个设备,因为我不具备以高效且可控的方式这样做的技能(讨厌的竞争条件......!)
正确的处理方式是:
- 枚举所有设备(获取设备列表)
- 识别请求的设备并打开它
识别是通过设备描述符完成的(使用应该始终唯一的序列号),正如您自己发现的那样。
如何知道设备是否正在使用?
如果设备 已打开 ,将为 I/O 绑定和配置端点。因此您无法再次打开它,但会得到您提到的错误代码。
根据 libusb_claim_interface() 上的文档:
Interface claiming is used to instruct the underlying operating system that your application wishes to take ownership of the interface.
所以你应该能够在每台设备上调用 libusb_claim_interface() 并且它应该只在无人认领的设备上成功:
It is legal to attempt to claim an already-claimed interface, in which case libusb just returns 0 without doing anything.
libusb 是用 C 编写的,并遵循相同的访问设备、文件描述符、流等的基本通用准则。
1 - 连接到设备
2 - 检查连接,如果有错误,通知 return
3 - 没有错误!!互动
按照这个基本流程,恕我直言,您的解决方案非常简单:
- 识别设备
- 遍历它们尝试连接,直到没有抛出失败
- 做点什么
- 关闭