2012-04-17 14 views
5

Próbuję zrobić aplikację do odczytu zewnętrznego systemu plików pamięci podłączonego za pomocą kabla OTG do XOOM z ICS. używam tego kodu, aby określić punkt końcowy i obecnie do komunikacji z urządzeniem typu flashUSBHost USB flash drive

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; 

to działa normalnie. następnie staram się czytać pierwsze 512 bajtów, aby sektor rozruchowy 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(); 

ale nie odczytuje żadnych danych z podłączonego urządzenia. cały ten kod działa na osobnym wątku po granding zgodę na urządzeniu

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

odbiornik Broadcast Właśnie rozpocząć nowy wątek z poprzedniego kodu; Próbowałem też zrobić wezwanie do USBDeviceConnection.controlTransfer

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

jak w próbce libusb, aby uzyskać dane f0 i/lub hwstats ale zawsze zwracają -1 również próbowałem zastąpić żądania transmisji asynchronicznej z wykorzystaniem USBRequst synchronizować bulkTransfers ale wynik jest to samo. Czy ktoś pracował z tą częścią Androida SDK? Dzięki!

+0

Próbuję zrobić coś podobnego - podłącz urządzenie USB HID do Xoom z uruchomionym ICS. Po przeprowadzeniu pewnych badań wiem, że Xooms dostarczany przez USA najczęściej nie ma problemów z interfejsem USB Host API, ale inne urządzenia (np. Wysyłane z UE lub Australii) mają interfejs Host API w sposób, który nie pozwala na stworzenie Control Transfer. Próbuję flashować moje urządzenie różnymi obrazami, dam ci znać, kiedy się uda. Czy znajdziesz coś przydatnego od wczoraj? – syntagma

+0

Tak, prawie skończyłem wdrażanie analizy fat32 przy użyciu interfejsu API usbhost. i mogę ci powiedzieć, że wcale nie musisz używać controltransfer. wszystko czego potrzebujesz to bulk_transfer i oficjalna dokumentacja HID. – Alexandr

Odpowiedz

1

Napisałem bibliotekę który wywołał libaums: https://github.com/mjdev/libaums

Biblioteka dba o niskim poziomie komunikacji USB i wdraża system plików FAT32. Zawiera również przykładową aplikację. Lista katalogów będzie wyglądała następująco:

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

która z nich jest przykładową aplikacją? Czy to usbfileman? Próbowałem uruchomić aplikację, ale aplikacja została zmuszona do zamknięcia. – doraemon

+1

Przykładem aplikacji jest usbfileman.Sprawdź uprawnienia i ustawienia (przykładowa aplikacja nie pozwala na korzystanie z nowych uprawnień do uruchamiania środowiska wykonawczego systemu Android). Jeśli masz dziennik błędów, możesz również wysłać problem na github. – Magnus

4

Wygląda na to, że brakuje całej warstwy protokołu; nie można po prostu odczytać 512 bajtów z urządzenia. Co powinien odesłać? Skąd mógł wiedzieć, że chcesz zacząć czytać na początku dysku?

Sposób odczytywania miejsca w pamięci z urządzenia USB-MSC zależy od typu podklasy urządzenia i obsługiwanego protokołu transportu.

Jest prawdopodobne, że zwykły dysk flash używa SCSI transparent command set w połączeniu z USB Mass Storage Class Bulk-Only (BBB) Transport.

Musisz sprawdzić deskryptor urządzenia, aby dowiedzieć się, jakie urządzenie obsługuje. Zobacz także MSC device class overview dla wszystkich możliwych wartości i odniesień do ich dokumentacji.

+0

Hej Alexander, próbuję też pracować nad podobną aplikacją. Czy mógłbyś zaktualizować swoje linki? Wydają się teraz martwi. – giannileuani

+0

@ user1949634 Dzięki za podpowiedź. Linki zaktualizowane. – Alexander