繁体   English   中英

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

[英]How do I programatically remove a flash drive based on its device node name?

我有一个装有多个USB闪存驱动器的Linux系统,例如/ 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(在C ++中使用libusb跟随此链接 )完成此操作。 现在要记住几件事-

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是否支持清除根集线器端口电源。 我对此不确定。 这也取决于主机控制器驱动程序堆栈。

请按照我在顶部提到的链接了解这些API的示例用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM