5

XOOMにOTGケーブルで接続した外部ストレージのファイルシステムをICSで読み込むアプリケーションを作ろうとしています。このコードを使用して、フラッシュ デバイスとの通信の IN および OUT エンドポイントを決定しています

final UsbDeviceConnection connection = manager.openDevice(device);
UsbInterface inf = device.getInterface(0);
if (!connection.claimInterface(inf, true)) {
    Log.v("USB", "failed to claim interface");
}
UsbEndpoint epOut = null;
UsbEndpoint epIn = null;
// look for our bulk endpoints
for (int i = 0; i < inf.getEndpointCount(); i++) {
    UsbEndpoint ep = inf.getEndpoint(i);
    if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
        if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
            epOut = ep;
        } else {
            epIn = ep;
        }
    }
}
if (epOut == null || epIn == null) {
  throw new IllegalArgumentException("not all endpoints found");
}
final UsbEndpoint inEndPoint = epIn;

それは正常に動作します。次に、最初の 512 バイトを読み取って FAT32 ブート セクタを取得しようとしています

ByteBuffer arg1 = ByteBuffer.allocate(512);
UsbRequest request = new UsbRequest();
request.initialize(connection, inEndPoint);
request.queue(arg1, inEndPoint.getMaxPacketSize());
UsbRequest result = connection.requestWait(); // halt here
connection.releaseInterface(inf);
connection.close();

ただし、接続されたデバイスからデータを読み取ることはありません。このコードはすべて、デバイスで権限を付与した後、別のスレッドで実行されます

PendingIntent mPermissionIntent = PendingIntent.getBroadcast(USBHostSampleActivity.this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
manager.requestPermission(lDevices.get(position),mPermissionIntent);

ブロードキャストレシーバーでは、前のコードで新しいスレッドを開始するだけです。私もUSBDeviceConnection.controlTransferを呼び出そうとし ました

byte[] b = new byte[0x10];
int cTransfer = connection.controlTransfer(128, 6, 16, 0,b, 12, 0);

f0データおよび/またはhwstatsを取得するためのlibusbサンプルのように、常に-1を返します。また、USBRequstを使用して非同期要求を置き換えてbulkTransfersを同期しようとしましたが、結果は同じです。Android SDK のこの部分を扱った人はいますか? ありがとう!

4

2 に答える 2

4

プロトコル層全体が欠落しているようです。デバイスから 512 バイトを読み取ることはできません。何を送り返す必要がありますか?ディスクの先頭から読み取りを開始する必要があることをどのように知ることができますか?

USB-MSC デバイスからメモリの場所を実際に読み取る方法は、デバイスのサブクラスの種類とサポートされているトランスポート プロトコルによって異なります。

通常のフラッシュ ディスクは、SCSI トランスペアレント コマンド セットをUSB Mass Storage Class Bulk-Only (BBB) Transportと組み合わせて使用​​する可能性があります。

デバイスが何をサポートしているかを調べるには、デバイス記述子を調べる必要があります。すべての可能な値とそのドキュメントへの参照については、MSC デバイス クラスの概要も参照してください。

于 2012-05-21T07:29:47.070 に答える
2

libaums と呼ばれるライブラリを作成しました: https://github.com/mjdev/libaums

このライブラリは、低レベルの USB 通信を処理し、FAT32 ファイル システムを実装します。また、サンプルアプリも含まれています。ディレクトリの一覧表示は次のように機能します。

UsbMassStorageDevice[] devices = UsbMassStorageDevice.getMassStorageDevices(this);
device.init();

// we only use the first device
device = devices[0];
// we always use the first partition of the device
FileSystem fs = device.getPartitions().get(0).getFileSystem();
Log.d(TAG, "Capacity: " + fs.getCapacity());
Log.d(TAG, "Occupied Space: " + fs.getOccupiedSpace());
Log.d(TAG, "Free Space: " + fs.getFreeSpace());
UsbFile root = fs.getRootDirectory();

for(UsbFile f : root.listFiles())
    Log.d(TAG, f.getName())
于 2016-03-21T00:20:32.430 に答える