2012-04-17 3 views
5

Я пытаюсь сделать приложение для чтения файловой системы внешнего хранилища, подключенной с помощью кабеля OTG к XOOM с помощью ICS. Я использую этот код для определения IN и OUT конечной точки для связи с флэш-устройствомфлеш-накопитель android USBHost

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(); 

но не читает какие-либо данные с подключенного устройства. весь этот код работает на отдельном потоке после Granding разрешения на устройство

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); 

как в libusb образце, чтобы получить f0 данные и/или hwstats но всегда возвращает -1 также я попытался заменить запрос асинхронного использования USBRequst для синхронизации bulkTransfers, но результат тоже самое. Кто-нибудь работал с этой частью Android SDK? Спасибо!

+0

Я пытаюсь сделать что-то подобное - подключите USB HID-устройство к Xoom, работающему под управлением ICS. Проведя некоторые исследования, я знаю, что в большинстве случаев Xooms, поставляемые в США, не имеют проблем с USB Host API, но любые другие (например, поставляемые в ЕС или Австралии) устройства имеют API-интерфейс Host API, который не позволяет сделать Control Transfer.Я пытаюсь запустить мое устройство с разными изображениями, я сообщу вам, когда я преуспею. Вы нашли что-то полезное со вчерашнего дня? – syntagma

+0

Да, я почти закончил реализацию синтаксиса fat32, используя usbhost api. и я могу сказать вам, что вам вообще не нужно использовать controltransfer. все, что вам нужно, это документация bulk_transfer и HID – Alexandr

ответ

1

Я написал библиотеку для того, что называют 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()) 
+0

Какой пример приложения? Это usbfileman? Я попытался запустить приложение, но приложение было закрыто. – doraemon

+1

Да, пример приложения usbfileman.Проверьте разрешения и настройки (например, приложение не использует использование разрешения на использование в режиме реального времени для Android). Если у вас есть журнал ошибок, вы также можете отправить вопрос на github. – Magnus

4

Похоже, что вам не хватает всего слоя протокола; вы не можете просто читать 512 байтов с устройства. Что он должен отправить? Как он мог знать, что вы хотите начать читать в начале диска?

Как вы действительно прочитали местоположение памяти с устройства USB-MSC, зависит от типа подкласса устройства и поддерживаемого транспортного протокола.

Скорее всего, обычный флэш-диск использует SCSI transparent command set в сочетании с USB Mass Storage Class Bulk-Only (BBB) Transport.

Вам необходимо изучить дескриптор устройства, чтобы узнать, что поддерживает ваше устройство. См. Также MSC device class overview для всех возможных значений и ссылок на их документацию.

+0

Эй, Александр, я также пытаюсь работать над подобным приложением. Не могли бы вы обновить свои ссылки, пожалуйста? Кажется, теперь они мертвы. – giannileuani

+0

@ user1949634 Спасибо за подсказку. Обновлены ссылки. – Alexander

Смежные вопросы