2017-06-20 24 views
0

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

+0

有'sject'弹出程序.. –

+0

所以有。但我也(可能)需要以编程方式重新插入它,以便只解决我的一半问题。我会编辑这个问题来说明问题。谢谢。 – IndefatibableGoodForm

+0

您是否探索过手册页?在系统上列出USB驱动器的命令是什么,如果有的话? (使用谷歌)那么你怎么知道巴士,港口,设备?你怎么知道你什么时候不知道? (提示 - 谷歌“我如何列出所有的USB设备?)也许你可能会做更多的研究......有这些问题的其他资源,但没有一个是C++ –

回答

1

是的,它可以使用libusb完成(使用C++的libusb用法,请参阅this link)。现在有几件事要记住 -

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的用法。

+1

这可能是一个很好的答案,如果它提到了实际的'可以使用的libusb' APIs。一个最小的代码片段(即使它只在特定的hw/sw设置中被验证),演示如何通过其设备节点名称识别USB设备并“弹出”它,这是缺少的在这个答案中。 – TheCodeArtist

+0

@ TheCode艺术家感谢您的建议。添加了API。 – Shaibal

相关问题