我正在尝试使用OTG电缆将外部存储文件系统连接到带有ICS的XOOM。 我正在使用此代码来确定与闪存设备进行通信的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);
就像在libusb示例中获取f0数据和/或hwstats但总是返回-1 我也尝试使用USBRequst替换异步请求来同步bulkTransfers,但结果是一样的。 有没有人使用Android SDK的这一部分? 谢谢!
答案 0 :(得分:4)
您似乎缺少整个协议层;你不能从设备读取512个字节。它应该送回什么?怎么知道你想开始在磁盘的开头阅读?
如何从USB-MSC设备实际读取内存位置取决于设备子类类型和支持的传输协议。
普通闪存盘可能会将SCSI transparent command set与USB Mass Storage Class Bulk-Only (BBB) Transport结合使用。
您必须检查设备描述符以找出您的设备支持的内容。另请参阅MSC device class overview了解所有可能的值以及对其文档的引用。
答案 1 :(得分: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())