2012-01-17 17 views
6

मैं वर्तमान में अपने एंड्रॉइड 3.2 टैबलेट (होस्ट मोड समर्थित) पर एक आईसोक्रोनस एंडपॉइंट पर यूएसबी डेटा ट्रांसफर को संभालने का तरीका खोजने का प्रयास कर रहा हूं। कुछ प्रोटोटाइप कोड लिखने के बाद, मैंने देखा कि USB_ENDPOINT_XFER_ISOC के लिए स्थिरांक फ़ाइल में कहा गया है कि "Isochronous एंडपॉइंट प्रकार (वर्तमान में समर्थित नहीं है)"।एंड्रॉइड यूएसबी आइसोक्रोनस डेटा ट्रांसफर

क्या यह डिवाइस को रूट किए बिना संभव है? यदि ऐसा है तो मैं ऐसा करने के बारे में कैसे जाऊं?

आदर्श रूप में मैं जावा एपीआई के भीतर रहने की उम्मीद कर रहा था, लेकिन अगर यह संभव है तो एनडीके के माध्यम से मुझे इसके बजाय आगे बढ़ना होगा। मैं यह भी समझता हूं कि निम्न पोस्ट के आधार पर कुछ यूएसबी बैंडविड्थ मुद्दे हो सकते हैं: User mode USB isochronous transfer from device-to-host

उत्तर

5

आप इसे बिना रूट के कर सकते हैं, मुझे विश्वास है।

यूएसबीएफएस का उपयोग कर यूएसबी डिवाइस के साथ आपको कुछ देशी सी कोड इंटरफेसिंग का उपयोग करके इसे सब कुछ करने की आवश्यकता होगी। बड़ा मुद्दा लिनक्स के यूएसबीएफ के दस्तावेज की कमी से आता है। मूल रूप से सब कुछ ioctls के माध्यम से किया जाना है। उस ने कहा कि आप सामान्य रूप से जावा से एक डिवाइस खोलते हैं। फिर आप USBDeviceConnection

से फ़ाइल डिस्क्रिप्टर पास करते हैं, इसमें आपको सभी यूएसबी डिस्क्रिप्टर स्वयं को पार्स करने की आवश्यकता होगी। आप उन्हें USBDeviceConnection से फिर से प्राप्त कर सकते हैं। वर्णनकर्ता से लेकर वर्णक तक कूदना सरल है कि प्रत्येक वर्णनकर्ता का अर्थ एक प्रमुख सिरदर्द है, लेकिन आप www.usb.org पर अधिकांश दस्तावेज पा सकते हैं।

मैंने ऑडियो कोड के लिए पार्सिंग करने के लिए आवश्यक अधिकांश कोड लिखा है और मुझे एक आइसोक्रोनस ट्रांसफर जमा करने की कोशिश करने के लिए सभी तरह से मिला है और फिर त्रुटियां प्राप्त करना शुरू कर दिया है।

libusb पर स्विच करने के बाद मुझे पता चला कि समस्या मेरे मामले में थी क्योंकि ऑडियो डिवाइस में छिपा नियंत्रक भी थे और डिफ़ॉल्ट चालक उन लोगों के लिए अटैचिंग कर रहा था और सभी बैंडविड्थ को आइसोक्रोनस ट्रांसफर से दूर कर रहा था। अगर मैं इसे पहले जानता था तो मैं गैर-रूट गैर-libusb विधि के साथ persevered हो सकता है। के रूप में यह था मैं समकालिक lib यूएसबी के माध्यम से काम स्थानान्तरण प्राप्त किया था लेकिन यह एक निहित डिवाइस :(

आवश्यक कुछ बिंदु पर मैं इसे वापस करने के लिए जाना होगा।

सारांश में, मैं बहुत यकीन है कि यह संभव है कर रहा हूँ लेकिन इसकी आसान नहीं होने वाला !!

+0

Wou क्या आप अपना कोड साझा करना चाहते हैं, हालांकि यह अधूरा हो सकता है? – JellicleCat

6

मैं एंड्रॉयड (या लिनक्स) के तहत यूएसबी समकालिक आंकड़ा अंतरण के लिए एक जावा वर्ग में लिखा है:। UsbIso

यह JNA का उपयोग करता है के माध्यम से IOCTL कॉल USBFS API एक्सेस करने की

+0

क्या आप मुझे बता सकते हैं कि 'setInterface' फ़ंक्शन' के लिए 'altSetting'' के रूप में प्रदान करने के लिए क्या मूल्य निर्धारित करना है? – JellicleCat

+1

@JellicleCat आप अपने यूएसबी डिवाइस के डिवाइस डिस्क्रिप्टर को सूचीबद्ध करने के लिए 'lsusb -v -d xxxx: xxxx' (Linux) या 'USBView' (Windows) का उपयोग कर सकते हैं। वहां आपको डिवाइस द्वारा समर्थित वैकल्पिक सेटिंग मूल्य मिलते हैं। यदि आपके पास एंड्रॉइड 5.0 या नया है, तो आप UsbInterface.getAlternateSetting() का उपयोग कर सकते हैं। –

+0

धन्यवाद। मुझे आश्चर्य है कि क्या आप 'UsbIso' को तुरंत चालू करने का प्रयास करते समय "डिवाइस या संसाधन व्यस्त" त्रुटि संदेश पर कोई सलाह दे सकते हैं। मैंने इस समस्या का विवरण अलग थ्रेड के रूप में लिखा है: http://stackoverflow.com/questions/37356148/android-app-device-or-resource-busy-when-accessing-usb-device-via-jna – JellicleCat

संबंधित मुद्दे