簡體   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