2012-02-02 13 views
35

मैं एक एफटीडीआई 2232 एच चिप के आधार पर एक कस्टम डिवाइस से डेटा प्राप्त करने की कोशिश कर रहा हूं।एंड्रॉइड यूएसबी होस्ट - bulkTransfer() डेटा खो रहा है

मैं एक साधारण Async फीफो मोड का उपयोग कर रहा हूं, और आने वाली डेटा दर 3.2 एमबी/सेकंड है।

सब कुछ मेरे पीसी पर टेस्ट कोड के साथ पूरी तरह से काम करता है, लेकिन मुझे अपने तोशिबा उत्तेजना पर डेटा प्राप्त करने में समस्याएं आ रही हैं।

टीडीआई का एंड्रॉइड ड्राइवर विफल रहता है, इसलिए मैं जावा का उपयोग कर कोडिंग कर रहा हूं।

मैं डेटा का 95% + पूरी तरह से प्राप्त कर सकता हूं, लेकिन प्रत्येक बार एक बार डेटा 'स्पटर' और मुझे दो या तीन बार डेटा के समान 4-5K के भाग मिलते हैं, फिर अच्छे डेटा पर।

मैं थ्रिव या एंड्रॉइड के लिए बहुत तेज़ नहीं जा रहा हूं, क्योंकि मेरे पास पहले डेटा (डबल/6.4 एमबी/सेकंड) में आने वाला था और इसमें लगभग 9 5% भी था। (इसलिए इसे आधे दर पर कोई समस्या नहीं होनी चाहिए।)

ऐसा लगता है कि एंड्रॉइड के भीतर होने वाली बफरिंग (या डबल-बफरिंग) में कुछ प्रकार की बग है। (यह एफटीडीआई 2232 एच के भीतर बफर नहीं है क्योंकि दोहराया गया डेटा चिप के 4 के आंतरिक बफर से बड़ा होता है।)

सेटअप कोड सरल है, और फिर यह लगभग ~ पूरी तरह से काम कर रहा है।

पाश जहां डाटा हड़पने होता है बहुत सरल है:

while(!fStop) 
    if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN) 
    { 
    len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0); 
    System.arraycopy(inBuff, 0, bigBuff, totalLen, len); 
    totalLen+=len; 
    } 

मामले में आप लगता है कि यह arraycopy के लिए समय विलंब होता है - भले ही मैं उस लाइन बाहर टिप्पणी मैं अभी भी डेटा खो देते हैं।

IN_BUFF_LEN 16384 है (यदि मैं इनफफ के आकार को बढ़ाता हूं तो भी थोक ट्रांसफर उस से अधिक वापस नहीं लौटाएगा)।

बिगबफ कई मेगाबाइट्स है।

एक माध्यमिक सवाल के रूप में - किसी को भी कैसे पर bulkTransfer के लिए सूचक है कि bigBuff सीधे से स्थापित हो जाएगा --- पारित करने के लिए पता है एक ऑफसेट ('0' स्थिति पर शुरू नहीं

+0

इस के लिए कोई समाधान? –

+1

शायद एंड्रॉइड उन समय के दौरान कचरा इकट्ठा कर रहा है और कुछ खो रहा है। यह देखने के लिए कि आप डेटा खो देते समय ओएस में क्या हो रहा है, यह देखने के लिए अपने लॉगकट को जांचें। – RightHandedMonkey

+0

अजीब समस्या, क्योंकि यदि आप एक फीफो का उपयोग करते हैं तो यह कभी नहीं होना चाहिए। क्योंकि जब आप फीफो पढ़ते हैं तो डेटा बाहर जाता है। क्या आपने फीफो पढ़ने से पहले हर बार बफर को साफ़ करने का प्रयास किया है? यानी यह सुनिश्चित करना कि आप दो बार एक ही डेटा नहीं पढ़ रहे हैं, फीफो से बाहर नहीं बल्कि आपका बफर। – fonZ

उत्तर

0

तुम्हें यकीन होना जरूरी है कि वहाँ? एक ही बस पर - एक ही बस पर - आपके यातायात की तुलना में उच्च प्राथमिकता के साथ।

+1

कोई अन्य यातायात, अवधि - यह एकमात्र दिमागी ऑपरेशन है। – Greg

2

बस कुछ दृष्टिकोणों को स्पष्ट करने के लिए मैंने कोशिश की ... यूएसबी कोड अपने स्वयं के धागे में भाग गया और अधिकतम प्राथमिकता दी गई (कोई भाग्य नहीं) - मैंने एपीआई कॉल, libUSB, देशी सी, और अन्य तरीकों (कोई किस्मत) की कोशिश की - मैंने buffered, और मतदान किया, और queued (कोई किस्मत) - अंत में मैंने फैसला किया कि एंड्रॉइड 'उच्च गति' पर यूएसबी डेटा संभाल नहीं सकता (निरंतर 3.2 एमबी/सेकंड डब्ल्यू/नहीं प्रवाह नियंत्रण)। मैंने बनाया इसके लिए तैयार करने के लिए मेरे डिजाइन में एक 8 एमबी हार्डवेयर फीफो बफर। (यदि आपको लगता है कि आपके पास कोई जवाब है, तो उस डेटा के साथ आओ जो 3.2 एमबी/सेकेंड में डेटा खिलाती है और देखें कि एंड्रॉइड बिना किसी हिचकी के इसे संभाल सकता है। मुझे यकीन है कि यह नहीं हो सकता है।)

1

नेक्सस में मीडिया आयातक मैं लगातार 9 एमबी/एस के माध्यम से धक्का दे सकता हूं, इसलिए यह संभव है। मुझे यकीन नहीं है कि क्या आपके पास स्रोत का नियंत्रण है, लेकिन आप किसी प्रकार के अनुक्रमित शीर्षलेख के साथ फ़ीड को 16 के ब्लॉक में तोड़ना चाह सकते हैं ताकि आप लापता ब्लॉक और भ्रष्टाचार का पता लगा सकें।

इसके अलावा, आप लेन < 0 की जांच नहीं कर रहे हैं। मुझे यकीन नहीं है कि अगर अंतर्निहित स्टैक को दूसरे छोर से एनएके या एनवाईईटी मिल जाए तो क्या होगा। मुझे यह पर्याप्त लगता है कि मेरे पास इसे संभालने के लिए रिकवरी कोड है।

मैंने थोक ट्रांसफर गंतव्य बफर को ऑफ़सेट करने के तरीके के लिए लंबा और कठिन देखा है, लेकिन मुझे अभी तक यह नहीं मिला है। एफवाईआई: USBRequest.queue() ByteBuffer.position() का सम्मान नहीं करता है।

मुझे आश्चर्य है कि हम थोक पर 16K कर सकते हैं ट्रांसफर पर वैसे भी। यूएसबी 2.0 स्पेक के मुताबिक अधिकतम को बल्ले ट्रांस्फर एंडपॉइंट के लिए 512 बाइट माना जाता है। क्या एंड्रॉइड बल्कट्रांसर्स को बंडल कर रहा है, या क्या हम नियम तोड़ रहे हैं?

3

@ ग्रेग मुझे एक पूर्ण गति यूएसबी डिवाइस के साथ एक ही समस्या है और फिक्स प्रत्येक एएनडीड्रॉइड आंतरिक यूएसबी बफर में 50 मतदान की देरी शामिल करना था।

3

UsbConnection.bulktransfer (...) छोटी है। UsbRequest.queue का उपयोग करें (...) एपीआई। कई लोगों ने बताया है कि थोक ट्रांसफर का उपयोग इनपुट ट्रांसफर के लगभग 1% या 2% में विफल रहता है।

+0

क्या UsbRequest.queue (..) विफल होने के बिना 100% काम करता है? मुझे उस तरह की समस्या का सामना करना पड़ रहा है। –

+0

मैंने एक प्रोजेक्ट किया था जिसमें UsbRequest API का उपयोग करके भारी यूएसबी यातायात था। मुझे डेटा खोने पर कभी शिकायत नहीं हुई। हालांकि, मुझे याद है कि मैं केवल आने वाले डेटा के लिए UsbRequest.queue (..) का उपयोग करता हूं। डेटा भेजने के लिए मैंने टाइमआउट 1 सेकंड के साथ सिंक्रोनस एपीआई का उपयोग किया। UsbRequest.queue (..) का उपयोग करते समय सुनिश्चित करें कि आपके द्वारा कतार में डाला गया अनुरोध कतार से प्राप्त वही अनुरोध है। मैंने रीडिंग कॉल को अवरुद्ध करने के लिए एक नया अनुरोध भी बनाया। –

+0

@PabloValdes प्राप्त थ्रूपुट क्या था? मुझे थोक के साथ मुद्दों का सामना करना पड़ा और यूएसबी अनुरोध पर स्विच किया गया। मुझे अभी भी बहुत तेज गति नहीं मिल रही है। क्या आप स्रोत साझा कर सकते हैं, अगर यह ठीक है। – RohitMat

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