2012-01-17 52 views
6

Tôi hiện đang cố gắng tìm cách xử lý truyền dữ liệu USB trên điểm cuối đẳng thời trên máy tính bảng Android 3.2 của tôi (Chế độ máy chủ được hỗ trợ). Sau khi viết một số mã mẫu, tôi nhận thấy rằng trong tập tin hằng số cho USB_ENDPOINT_XFER_ISOC nói rằng "loại điểm cuối không đồng bộ (hiện không được hỗ trợ)".Truyền dữ liệu không đồng bộ USB Android

Điều này có thể thực hiện mà không cần khởi động thiết bị không? Nếu vậy làm thế nào tôi sẽ đi về việc này?

Lý tưởng nhất là tôi hy vọng sẽ ở trong API java, nhưng nếu điều này chỉ có thể thông qua NDK, tôi sẽ phải theo đuổi điều đó thay thế. Tôi cũng hiểu rằng có thể có một số vấn đề về băng thông USB dựa trên bài đăng sau đây: User mode USB isochronous transfer from device-to-host

Trả lời

5

Bạn "có thể" làm điều đó mà không có gốc, tôi tin.

Bạn sẽ cần phải làm tất cả bằng cách sử dụng một số mã C gốc giao tiếp với thiết bị USB bằng USBFS. Vấn đề lớn xuất phát từ việc thiếu tài liệu về usbfs của linux. Về cơ bản mọi thứ phải được thực hiện thông qua ioctls. Điều đó nói rằng bạn mở một thiết bị như bình thường từ Java. Sau đó, bạn chuyển phần mô tả tệp từ số USBDeviceConnection

Thêm vào đó bạn sẽ cần phải phân tích cú pháp tất cả các bộ mô tả USB. Bạn có thể nhận được chúng, một lần nữa từ USBDeviceConnection. Nhảy từ bộ mô tả đến bộ mô tả đơn giản là tìm tài liệu cho những gì mỗi bộ mô tả có nghĩa là một MASSIVE nhức đầu nhưng bạn có thể tìm thấy hầu hết các tài liệu trên www.usb.org.

Tôi đã viết hầu hết mã được yêu cầu để thực hiện phân tích cú pháp cho các thiết bị âm thanh và tôi có tất cả các cách để cố gửi một giao dịch đẳng thời và sau đó bắt đầu gặp lỗi.

Sau khi chuyển sang libusb Tôi phát hiện ra rằng vấn đề, trong trường hợp của tôi, là do thiết bị âm thanh cũng có bộ điều khiển HID và trình điều khiển mặc định đã được kết nối với chúng và ăn cắp toàn bộ băng thông. Tôi đã biết điều này trước đây tôi có thể đã kiên trì với phương pháp non-libusb không root. Vì nó là tôi đã nhận được chuyển đẳng thời làm việc thông qua usb lib nhưng nó đòi hỏi một thiết bị bắt nguồn từ :(

Tại một số điểm tôi sẽ quay trở lại với nó.

Nói tóm lại, tôi khá chắc chắn nó có thể nhưng nó không sẽ được dễ dàng !!

+0

Wou ld bạn quan tâm để chia sẻ mã của bạn, tuy nhiên không đầy đủ nó có thể được? – JellicleCat

6

tôi đã viết một lớp Java để chuyển USB dữ liệu đẳng thời dưới Android (hoặc Linux):. UsbIso

Nó sử dụng JNA để truy cập USBFS API qua IOCTL gọi

+0

Bạn có thể cho tôi biết cách xác định giá trị nào cung cấp là 'altSetting' cho hàm' setInterface'? – JellicleCat

+1

@JellicleCat Bạn có thể sử dụng 'lsusb -v -d xxxx: xxxx' (Linux) hoặc' USBView' (Windows) để liệt kê bộ mô tả thiết bị của thiết bị USB của bạn. Ở đó bạn tìm thấy các giá trị AlternateSetting được thiết bị hỗ trợ. Nếu bạn có Android 5.0 trở lên, bạn có thể sử dụng UsbInterface.getAlternateSetting(). –

+0

Cảm ơn bạn. Tôi tự hỏi nếu bạn có thể cung cấp bất kỳ lời khuyên nào về thông báo lỗi "Thiết bị hoặc tài nguyên bận rộn" tôi nhận được khi cố gắng khởi tạo 'UsbIso'. Tôi đã viết chi tiết về vấn đề này dưới dạng một chuỗi riêng biệt: http://stackoverflow.com/questions/37356148/android-app-device-or-resource-busy-when-accessing-usb-device-via-jna – JellicleCat

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