У меня есть система 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 (следуйте эта ссылка для использования 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 отключение питания порта корневого концентратора. Я не уверен в этом. Это также зависит от стека драйверов хост-контроллера.
Пожалуйста, перейдите по ссылке, которую я упомянул вверху, например, для использования этих API.
Других решений пока нет …