2012-04-17 13 views
5

Estoy tratando de hacer una aplicación para leer el sistema de archivos de almacenamiento externo conectado mediante un cable OTG a XOOM con ICS. estoy utilizando este código para determinar IN y OUT extremo de una comunicación con el dispositivo flashandroid USBHost 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; 

funciona normal. entonces estoy tratando de leer primeros 512 bytes para obtener sector de arranque 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(); 

pero no lee los datos desde el dispositivo conectado. todo este código se ejecutan en hilo separado después Granding permiso en el dispositivo

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

en Receptor de radio acabo de empezar con el nuevo hilo de código anterior; también traté de hacer llamada a USBDeviceConnection.controlTransfer

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

como en la muestra de libusb para obtener datos y/o hwstats f0 pero siempre devuelven -1 También probé reemplazar petición asincrónico utilizando USBRequst sincronizar bulkTransfers pero resultado es lo mismo. ¿Alguien ha trabajado con esta parte de Android SDK? Gracias!

+0

Estoy tratando de hacer algo similar: conectar un dispositivo USB HID a Xoom que ejecute ICS. Después de investigar un poco, sé que Xooms enviados por EE. UU. La mayor parte del tiempo no tienen problemas con USB Host API, pero cualquier otro dispositivo (por ejemplo, enviado por la UE o Australia) ha implementado la API de manera que no permite Control de transferencia. Estoy tratando de flashear mi dispositivo con diferentes imágenes, le avisaré cuando lo suceda. ¿Has encontrado algo útil desde ayer? – syntagma

+0

Sí, casi termino de implementar el análisis fat32 usando usbhost api. y puedo decirte que no necesitas usar controltransfer en absoluto. todo lo que necesita es bulk_transfer y la documentación oficial de HID – Alexandr

Respuesta

1

escribí una biblioteca para que los llamados libaums: https://github.com/mjdev/libaums

La biblioteca se encarga de la comunicación USB de bajo nivel e implementa el sistema de archivos FAT32. También incluye una aplicación de ejemplo. El listado de un directorio funcionaría de la siguiente manera:

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

¿cuál es la aplicación de ejemplo? ¿Es usbfileman? Intenté ejecutar la aplicación pero la aplicación se vio forzada a cerrarse. – doraemon

+1

Sí usbfileman es la aplicación de ejemplo.Compruebe los permisos y en la configuración (la aplicación de ejemplo no hace uso del nuevo permiso de tiempo de ejecución de Android). Si tiene un registro de errores, también puede enviar un problema en github. – Magnus

4

Parece que le falta una capa de protocolo completa; no puedes simplemente leer 512 bytes desde el dispositivo. ¿Qué debería enviar de vuelta? ¿Cómo podría saber que quiere comenzar a leer al principio del disco?

La forma en que realmente lee una ubicación de memoria del dispositivo USB-MSC depende del tipo de subclase del dispositivo y del protocolo de transporte admitido.

Es probable que un disco flash ordinario utilice el SCSI transparent command set junto con el USB Mass Storage Class Bulk-Only (BBB) Transport.

Debe examinar el descriptor del dispositivo para averiguar qué es lo que admite su dispositivo. Vea también MSC device class overview para todos los valores posibles y referencias a su documentación.

+0

Hola, Alexander, también estoy tratando de trabajar en una aplicación similar. ¿Podrías actualizar tus enlaces por favor? Parecen estar muertos ahora. – giannileuani

+0

@ user1949634 Gracias por la pista. Enlaces actualizados – Alexander