2017-06-20 15 views
0

私は/ dev/sda1、/ dev/sdb1などのように複数のUSBフラッシュドライブを接続したLinuxシステムを持っています。私はプログラムの中からこれらのファイルを取り出してください。ドライブを再度挿入します。デバイスノード名に基づいてフラッシュドライブをプログラムで削除するにはどうすればよいですか?

私は、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

slwaysには、「eject」プログラムがあります。 –

+0

だからです。しかし、私はまた、プログラムで再挿入する必要があるので、問題の半分しか解決できません。それを明確にするために質問を編集します。ありがとうございました。 – IndefatibableGoodForm

+0

マニュアルページを調べましたか?システム上のUSBドライブをリストするコマンドがあれば、それは何ですか? (googleを使ってください)どうしてあなたはバス、ポート、デバイスを知っていますか?あなたが知らないときはどうやって見つけますか? (ヒント - グーグル "どのように私はすべてのUSBデバイスをリストしていますか?)おそらくあなたはもっと多くの研究をするかもしれません...これらの質問のための他のリソースがありますが、これらのどれもC++ではありません –

答えて

1

はい、libusbを使用して行うことができます(libusbをC++で使用する場合は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 - デバイスはルートハブポートまたはハブポートに接続されていますか?

libusb_get_parent (libusb_device *dev) 

3(これは、親の/ dev/SDB1のデバイスまたはSDA1を読み取ることにより行うことができる) - ハブへのその接続されている場合、そのポートの「クリア」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

これは、 USBデバイスをそのデバイスノード名で識別し、それを「排出」することを示す最小限のコードスニペット(特定のhw/swセットアップでのみ検証されたとしても)は、欠けているものです – TheCodeArtist

+0

@TheCodeArtist提案をいただきありがとうございます。APIが追加されました。 – Shaibal

関連する問題