Как программно удалить флэш-диск на основе имени его устройства?

У меня есть система 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 возвращает минимальную информацию.

0

Решение

Да, это может быть сделано с помощью 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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]