2012-04-17 39 views
5

Tôi đang cố gắng tạo ứng dụng để đọc hệ thống tệp lưu trữ ngoài được kết nối bằng cáp OTG với XOOM với ICS. Tôi đang sử dụng mã này để xác định IN và OUT điểm cuối để liên lạc với thiết bị flashỔ flash USBHost USB android

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; 

hoạt động bình thường. sau đó tôi đang cố gắng để đọc 512 byte đầu tiên nhận được boot sector 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(); 

nhưng nó không đọc bất kỳ dữ liệu từ thiết bị được kết nối. tất cả các mã này chạy trên một chuỗi riêng biệt sau khi cấp phép granding trên thiết bị

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

trong Broadcast Receiver i chỉ bắt đầu chủ đề mới với mã trước đó; tôi cũng đã cố gắng để thực hiện cuộc gọi đến USBDeviceConnection.controlTransfer

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

như trong mẫu libusb để lấy dữ liệu f0 và/hoặc hwstats nhưng nó luôn luôn trở về -1 tôi cũng đã cố gắng thay thế yêu cầu async sử dụng để đồng bộ hóa USBRequst bulkTransfers nhưng kết quả là giống nhau. Có ai đã làm việc với bộ phận này của SDK Android không? Cảm ơn!

+0

Tôi đang cố gắng làm điều gì đó tương tự - kết nối thiết bị USB HID với Xoom đang chạy ICS. Sau khi thực hiện một số nghiên cứu, tôi biết rằng Xooms do Mỹ vận chuyển hầu như không gặp sự cố với USB Host API nhưng bất kỳ thiết bị nào khác (ví dụ như EU hoặc Úc được vận chuyển) có API máy chủ được triển khai theo cách không cho phép thực hiện Kiểm soát Transfer.Tôi đang cố gắng để flash thiết bị của tôi với hình ảnh khác nhau, tôi sẽ cho bạn biết khi tôi thành công. Bạn đã tìm thấy một cái gì đó hữu ích từ ngày hôm qua? – syntagma

+0

Có, tôi gần như đã hoàn thành việc thực hiện phân tích cú pháp fat32 bằng cách sử dụng api usbhost. và tôi có thể nói với bạn rằng bạn không cần phải sử dụng controltransfer cả. tất cả những gì bạn cần là bulk_transfer và tài liệu chính thức của HID – Alexandr

Trả lời

1

Tôi đã viết một thư viện cho rằng gọi libaums: https://github.com/mjdev/libaums

Thư viện chăm sóc giao tiếp USB ở mức độ thấp và thực hiện các hệ thống tập tin FAT32. Nó cũng bao gồm một ứng dụng ví dụ. Liệt kê một thư mục sẽ hoạt động như sau:

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

ứng dụng mẫu nào là ứng dụng mẫu? Là nó usbfileman? Tôi đã cố chạy ứng dụng nhưng ứng dụng buộc phải đóng. – doraemon

+1

Có usbfileman là ứng dụng ví dụ.Kiểm tra các điều khoản và trong các thiết lập (ví dụ ứng dụng không sử dụng quyền truy cập Android thời gian chạy mới có được). Nếu bạn có nhật ký lỗi, bạn cũng có thể gửi một vấn đề về github. – Magnus

4

Dường như bạn đang thiếu một lớp giao thức toàn bộ; bạn không thể chỉ đọc 512 byte từ thiết bị. Những gì nó nên gửi lại? Làm thế nào nó có thể biết bạn muốn bắt đầu đọc ở đầu đĩa?

Cách bạn thực sự đọc vị trí bộ nhớ từ thiết bị USB-MSC tùy thuộc vào loại lớp phụ của thiết bị và giao thức truyền tải được hỗ trợ.

Có khả năng một đĩa flash thông thường sử dụng SCSI transparent command set kết hợp với USB Mass Storage Class Bulk-Only (BBB) Transport.

Bạn phải kiểm tra bộ mô tả thiết bị để tìm hiểu thiết bị của mình hỗ trợ. Xem thêm MSC device class overview để biết tất cả giá trị và tham chiếu có thể có cho tài liệu của họ.

+0

Hey Alexander, tôi cũng đang cố gắng làm việc trên một ứng dụng tương tự. Bạn có thể cập nhật liên kết của mình không? Họ dường như đã chết rồi. – giannileuani

+0

@ user1949634 Cảm ơn gợi ý. Đã cập nhật liên kết. – Alexander

Các vấn đề liên quan