如何基于其设备节点名以编程方式删除闪存驱动器?

时间:2017-06-20 20:13:55

标签: c++ linux usb usb-flash-drive

我有一个插入了多个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返回的信息很少。

1 个答案:

答案 0 :(得分:2)

是的,可以使用libusb完成(跟随this link使用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。