2012-04-17 69 views
5

我正在嘗試使用OTG電纜連接到使用ICS的XOOM讀取外部存儲文件系統的應用程序。 我使用此代碼來確定通信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(); 

,但它並沒有讀取連接設備的任何數據。 所有這些代碼在單獨的線程運行在廣播接收機設備上

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設備連接到運行ICS的Xoom。在做了一些研究之後,我知道美國發貨的Xooms在大多數情況下對USB Host API沒有任何問題,但任何其他(例如歐盟或澳大利亞出貨的)設備都以不允許製作控制轉移。我試圖用不同的圖像來刷我的設備,當我跑完時我會通知您。你昨天找到有用的東西嗎? – syntagma 2012-04-18 13:39:06

+0

是的,我幾乎完成了使用usbhost api實現fat32解析。我可以告訴你,你根本不需要使用控制轉移。所有你需要的是bulk_transfer和HID官方文檔 – Alexandr 2012-04-20 20:06:54

回答

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 2016-04-20 08:50:25

+1

是usbfileman是示例應用程序。檢查權限和設置(例如,應用程序未使用新的Android運行時許可證獲取)。如果你有錯誤日誌,你也可以在github上提交問題。 – Magnus 2016-04-22 11:33:28

4

看來你缺少一個完整的協議層;你不能從設備讀取512個字節。它應該發回什麼?它如何知道你想在磁盤的開始處開始閱讀?

實際從USB-MSC設備讀取存儲單元的方式取決於設備子類類型和支持的傳輸協議。

普通的閃存盤可能會使用SCSI transparent command setUSB Mass Storage Class Bulk-Only (BBB) Transport一起使用。

您必須檢查設備描述符以找出設備支持的內容。請參閱MSC device class overview瞭解所有可能的值和對其文檔的參考。

+0

嘿亞歷山大,我也試圖在類似的應用程序。你能更新你的鏈接嗎?他們現在似乎已經死了。 – giannileuani 2014-10-07 18:07:00

+0

@ user1949634感謝您的提示。鏈接已更新。 – Alexander 2014-10-10 20:27:29