gpt4 book ai didi

c++ - 如何根据设备节点名称以编程方式删除闪存驱动器?

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:19 25 4
gpt4 key购买 nike

我有一个 Linux 系统,其中插入了多个 USB 闪存驱动器,如/dev/sda1、/dev/sdb1 等。我需要从我的程序中弹出其中一个——类似于 EjectDrive("/dev/sdb1"); 然后我可能需要以编程方式重新插入驱动器。

我知道如果我知道 USB 总线、端口和设备编号,我可以从命令行执行此操作。例如echo '2-1.3' >/sys/bus/usb/drivers/usb/unbind 然后 echo '2-1.3' >/sys/bus/usb/drivers/usb/bind

我不确定如何从 C++ 执行此操作,并且 100% 确定我为指定的驱动器使用了正确的总线、端口和设备。

这是一个带有 BusyBox v1.22.1 的嵌入式平台,所以 udev 对我不可用,并且 lsusb 返回最少的信息。

最佳答案

是的,它可以使用 libusb 来完成(请按照 this link 了解 libusb 与 C++ 的用法)。现在要记住一些事情 -

1 - 设备地址是什么? (您可以使用 libusb API 获取它)

libusb_get_device_list (libusb_context *ctx, libusb_device ***list)
libusb_get_device_address (libusb_device *dev)
libusb_get_port_number (libusb_device *dev)

2 - 设备是连接到根集线器端口还是集线器端口? (这可以通过读取/dev/sdb1或sda1的父设备来完成)

libusb_get_parent (libusb_device *dev)

3 - 如果它连接到集线器,则执行控制传输以“清除”该端口的 PORT_POWER 功能。这将关闭端口并且设备将断开连接。您可以“设置”PORT_POWER 功能以打开端口,设备将再次连接。请记住,您不会收到任何符合规范的断开连接事件。 (EHCI 或 XHCI)

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

4 - 如果设备直接连接到根集线器端口,请检查libusb是否支持清除根集线器端口电源。我不确定这一点。这也取决于主机 Controller 驱动程序堆栈。

请点击我在顶部提到的链接,了解这些 API 的使用示例。

关于c++ - 如何根据设备节点名称以编程方式删除闪存驱动器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44662220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com