KolibriOS में USB समर्थन: अंदर क्या है? भाग 4: चैनल समर्थन स्तर

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

चैनल का उद्घाटन


API से USBOpenPipe फ़ंक्शन, usb_open_pipe . inc कोड में usb_open_pipe कहलाता है, निर्दिष्ट चैनल विशेषताओं और "पैरेंट" चैनल द्वारा एक नया चैनल खोलता है, जहां डिवाइस की विशेषताओं को रिकॉर्ड किया जाता है। ऐसा करने के लिए, वह:

अंतिम क्रिया के साथ नियंत्रक-विशिष्ट प्रारंभिककरण संबंधित सूची में एक नया चैनल जोड़ता है। नियंत्रण चैनलों के लिए, साथ ही डेटा सरणियों के चैनलों के लिए, केवल एक सूची है, लेकिन इंटरप्ट चैनलों के लिए, आपको अभी भी कई विकल्पों में से एक को चुनने की आवश्यकता है।

यह वह जगह है जहाँ अनुसूचक । Cc खेल में आता है। वह सिर्फ इंटरप्ट चैनलों की सूची में से एक का चयन करता है, और यह भी सुनिश्चित करता है कि नए चैनल के लिए "पर्याप्त जगह है"। मैं आपको याद दिलाता हूं कि आवधिक प्रसारण के लिए फुलस्पीड बस के प्रत्येक फ्रेम में, आप 90% से अधिक समय का उपयोग नहीं कर सकते हैं, और हाईस्पीड बस के प्रत्येक माइक्रोफ्रेम में - 80% से अधिक समय।

यहां मुझे ध्यान देना चाहिए कि यदि किसी कारण से आप USB कार्यान्वयन लिखते हैं जो आपकी स्थितियों में काम करना चाहिए, तो आप शेड्यूलर पर गंभीरता से बचत कर सकते हैं। आपको लेखों की इस श्रृंखला में वर्णित सभी चीजों को एक या दूसरे तरीके से लागू करना होगा, लेकिन एक बड़े लोड की अनुपस्थिति में, आप एक पूर्ण पेड़ के बजाय रुकावट चैनलों की सिर्फ एक सूची के साथ प्रबंधन कर सकते हैं, प्रत्येक फ्रेम / माइक्रोफ्रेम द्वारा संसाधित किया जा सकता है। थोड़ी अधिक किफायती योजना, जो कार्यान्वयन को बहुत अधिक जटिल नहीं करती है, 1, 2, 4, 8, 16, 32 फ्रेम के प्रत्येक प्रसंस्करण अंतराल के लिए चैनलों की एक सूची है। हालांकि यह एक साथ एक उपकरण से अधिक संसाधित करने के लिए आवश्यक नहीं है, जहां प्रति मेजबान नियंत्रक बहुत सारे ट्रैफ़िक के साथ है, यह दृष्टिकोण किसी भी तरह से पूर्ण शेड्यूलर से नीच नहीं है। एक साधारण सर्किट फुलस्पीड उपकरणों के दो या अधिक समकालिक चैनलों के साथ कुछ विशिष्ट विन्यासों में "ब्रेक" करेगा और हाईस्पीड उपकरणों के तीन या अधिक समकालिक चैनलों पर, लेकिन शायद कोई भी ऐसे विशिष्ट परिस्थितियों में आपके कार्यान्वयन को नहीं चलाएगा?

यदि आप एक USB कार्यान्वयन लिख रहे हैं जो हर जगह और हमेशा काम करना चाहिए, तो आपको एक अनुसूचक भी लिखना होगा।


लेन-देन का समय अनुमान


निपटान डेटा और आंतरिक लेनदेन संरचना
फुलस्पीड गति में एक बिट फ्रेम के 1/12000 भाग के लिए नाममात्र प्रसारित किया जाता है, जो 12 मेगाबिट्स / सेकंड की गति देता है। दूसरे शब्दों में, एक फ्रेम का "आकार", जैसा कि मेजबान नियंत्रक द्वारा मापा जाता है, 12,000 बिट्स है। होस्ट और डिवाइस दोनों एक टाइमर को टिक कर रहे हैं, जो 1/12000 मिलीसेकंड गिनता है, टाइमर के अनुसार, होस्ट या डिवाइस अगले बिट को भेजना शुरू कर देता है। होस्ट टाइमर के लिए सटीकता की आवश्यकताएं काफी कठोर हैं, और गणना में मेजबान टाइमर को सटीक माना जा सकता है। बाहरी फुलस्पीड उपकरणों के लिए, विनिर्देश, 0.25% की एक टाइमर त्रुटि की अनुमति देता है, जिसका अर्थ है कि डिवाइस से 400-बिट रिसेप्शन का समय 399 से 401 "नाममात्र एफएस-बिट्स" के अनुरूप हो सकता है। लोस्पीस्पीड गति में एक बिट फुलस्पीड गति से 8 गुना अधिक समय तक नामांकित है, जो 1.5 मेगाबिट्स की गति देता है। लोस्पीड की कल्पना एक मोड के रूप में की गई थी जिसमें माउस / कीबोर्ड जैसे सरल उपकरणों की कमजोर आवश्यकताएं होती हैं, और लोस्पीड डिवाइस की टाइमर त्रुटि ± 1.5% के भीतर होनी चाहिए: डिवाइस से 50 बिट्स का रिसेप्शन समय 394 से 406 "नाममात्र एफएस-बिट्स" के अनुरूप हो सकता है।

हाईस्पीड गति में एक बिट सूक्ष्म रूप से 1/60000 माइक्रोफ्रेम के लिए प्रेषित होता है, जो 480 मेगाबिट्स / सेकंड की गति देता है। हाईस्पीड उपकरणों के टाइमर की सटीकता आवश्यकताओं को timer 0.05% तक बढ़ाया गया है, ताकि लेनदेन की योजना बनाते समय, टाइमर में अंतर के कारण होने वाली त्रुटि को नजरअंदाज किया जा सके।

लेन-देन की अपनी आंतरिक संरचना होती है। आइए हम विभाजित लेनदेन को छोड़ दें। सामान्य लेन-देन में कई पैकेट होते हैं, जो अन्य बसों के विकल्प के बिना USB बस का सख्ती से क्रमिक रूप से पालन करते हैं: एक टोकन (टोकन) के साथ एक पैकेट, डेटा (डेटा) के साथ एक वैकल्पिक पैकेट, एक वैकल्पिक प्रतिक्रिया पैकेट (हैंडशेक)। होस्ट से लेकर लोस्पीड डिवाइस तक निर्देशित पैकेट एक अलग विशेष PRE पैकेट से पहले होते हैं। PRE पैकेट और उसके बाद एक ठहराव जिसके साथ न्यूनतम 4 "नाममात्र FS बिट" की आवश्यकता होती है ताकि बस पर हब उन पोर्ट को अनब्लॉक कर सकें जिनमें LowSpeed ​​डिवाइस कनेक्ट हैं। सामान्य फ़ुलस्पीड ट्रैफ़िक को ऐसे बंदरगाहों तक नहीं पहुँचाया जाता है।

प्रत्येक पैकेट 8 बिट = 1 बाइट की SYNC घड़ी के साथ लो / फुल-स्पीड पर और 32 बिट्स = 4 बाइट्स हाईस्पीड पर शुरू होता है। प्रत्येक पैकेट, विशेष PRE पैकेट को छोड़कर, EOP (पैकेट का अंत) 3 बिट्स के निम्न / पूर्ण-गति पर और 8 बिट्स हाईस्पीड पर होता है।

टोकन डेटा प्राप्त करने / संचारित करने वाले उपकरण के संचरण, पते और समापन बिंदु की कार्रवाई, दिशा निर्धारित करता है। सामान्य लेनदेन में, तीन टोकन संभव हैं: IN, OUT और SETUP, क्रमशः डेटा प्राप्त करने, डेटा भेजने और नियंत्रण हस्तांतरण का पहला चरण। टोकन के साथ एक पैकेट में 3 बाइट्स लगते हैं, जिसमें SYNC + EOP की गिनती नहीं होती है: पैकेट के प्रकार के लिए 8 बिट्स, डिवाइस एड्रेस के 7 बिट्स, एंडपॉइंट के 4 बिट्स और सीआरसी के 5 बिट्स, डिवाइस के पते और एंडपॉइंट को सेट करते समय त्रुटियों की अनुपस्थिति की पुष्टि करते हैं।

डेटा पैकेट में डिवाइस से भेजे गए या प्राप्त किए गए वास्तविक डेटा, साथ ही 3 अतिरिक्त बाइट्स शामिल हैं, जो कि SYNC + EOP की गिनती नहीं करते: पैकेट के प्रकार के लिए 8 बिट्स और सीआरसी डेटा के 16 बिट्स।

प्रतिक्रिया पैकेट में एक बाइट होता है, जो SYNC + EOP की गिनती नहीं करता: पैकेट प्रकार के लिए 8 बिट्स। पैकेट को पिछले पैकेट के विपरीत दिशा में भेजा जाता है। एक एसीके पैकेट का मतलब है कि सभी डेटा सफलतापूर्वक प्राप्त हुए हैं। IN लेन-देन में, एक NAK पैकेट डेटा पैकेट के बजाय डिवाइस द्वारा भेजा जाता है और इसका मतलब है कि अभी तक कोई डेटा नहीं है। उदाहरण के लिए, माउस इस तरह से प्रतिक्रिया देगा जबकि नियंत्रक इसे नियमित रूप से सर्वेक्षण करता है, लेकिन राज्य पिछले चुनाव के बाद से नहीं बदला है। OUT लेनदेन में, NAK पैकेट को डेटा पैकेट के बाद डिवाइस द्वारा भेजा जाता है और इसका मतलब है कि डिवाइस आंतरिक मामलों में व्यस्त है, इसलिए होस्ट को बाद में फिर से प्रयास करना चाहिए। NAK कोई गलती नहीं है। किसी त्रुटि का संकेत देने के लिए, डिवाइस बिल्कुल भी प्रतिक्रिया नहीं दे सकता है, एक अमान्य पैकेट के साथ प्रतिक्रिया कर सकता है या एक STALL पैकेट के साथ प्रतिक्रिया कर सकता है। पहले दो मामलों में, नियंत्रक बस में कहीं न कहीं एक त्रुटि पर विचार करेगा और तीन बार तक पुन: प्रयास करेगा, जिसके बाद वह छोड़ देगा और एक त्रुटि की रिपोर्ट करेगा। बाद के मामले में, नियंत्रक तुरंत एक त्रुटि की रिपोर्ट करेगा।
समकालिक लेनदेन में, कोई प्रतिक्रिया पैकेट नहीं है। बीच में लेन-देन में, एक प्रतिक्रिया पैकेट की आवश्यकता होती है।

यूएसबी के माध्यम से प्रसारित डेटा में, प्रत्येक छह यूनिट बिट्स के बाद एक शून्य बिट डाला जाता है। एकल बिट्स को इनकोड किया गया है ताकि बस राज्य एक बिट के साथ नहीं बदले, व्यक्तिगत बिट्स का चयन करने के लिए एक टाइमर का उपयोग किया जाता है। एक शून्य बिट डाला जाता है ताकि टाइमर में सहनशीलता की समस्या न हो। इसलिए, सबसे खराब स्थिति में, पैकेज की डिलीवरी का समय 7/6 से गुणा किया जाना चाहिए। गुणक SYNC और EOP पर लागू नहीं होता है: वे एक विशेष तरीके से एन्कोड किए जाते हैं, बस की स्थिति में गारंटीकृत परिवर्तन उत्पन्न करते हैं।

यदि होस्ट नियंत्रक एक पंक्ति में दो पैकेट भेजता है, तो केवल एक छोटा अंतर-पैकेट विलंब पर्याप्त है, जो FullSpeed ​​और LowSpeed ​​के मामले में 2-बिट ट्रांसमिशन और HighSpeed ​​के मामले में 88 बिट्स के अनुरूप है। यदि नियंत्रक को एक पैकेट प्राप्त हुआ है और उसे एक प्रतिक्रिया पैकेट भेजना है, तो हाईस्पीड के मामले में ठहराव 8 बिट तक कम हो जाता है और वही 2 बिट्स फुलस्पीड और लोस्पीड के मामले में। यदि मेजबान नियंत्रक ने एक पैकेट भेजा है और एक प्रतिक्रिया पैकेट की प्रतीक्षा कर रहा है, तो आपको डिवाइस को पैकेट पास करने में देरी और डिवाइस से प्रतिक्रिया पैकेट (बारी-बारी से समय) पर विचार करने की आवश्यकता है। फुलस्पीड और लोस्पीड बसों के लिए, विनिर्देश अधिकतम देरी को परिभाषित करता है, जिसमें दोनों दिशाओं में सिग्नल पास करना और डिवाइस की प्रतिक्रिया शामिल है, क्योंकि ट्रांसमिशन टाइम 18 बिट्स के साथ संबंधित गति है। हाईस्पीड के लिए, अधिकतम देरी 736 बिट्स के ट्रांसमिशन समय के बराबर है।

मेजबान नियंत्रक लेन-देन के इन सभी विवरणों के कार्यान्वयन को छिपाता है, नियोजन के लिए यह केवल यह जानने के लिए पर्याप्त है कि लेनदेन में कितना समय लगेगा। समय लेनदेन के प्रकार, लेनदेन की दिशा और डिवाइस की गति पर निर्भर करता है।
स्प्लिट ट्रांजेक्शन में दो बसों पर तीन प्रकार के "प्रारंभिक" लेन-देन होते हैं: होस्ट और TT के बीच हाईस्पीड बस पर स्टार्ट-स्प्लिट ट्रांजेक्शन, TT और डिवाइस के बीच FullSpeed ​​/ LowSpeed ​​बस में एक सामान्य लेन-देन, एक होस्ट के बीच हाईस्पीड बस में एक स्प्लिट-स्प्लिट ट्रांजैक्शन। टीटी। बीच में लेन-देन का समय टीटी के बिना एक ही लेन-देन के समय से अलग होता है जो केवल टीटी द्वारा पेश किए गए अतिरिक्त ठहराव से होता है और टीटी के साथ हब के हैंडल में वर्णित होता है। स्टार्ट-स्प्लिट और कम्प्लीट-स्प्लिट ट्रांजेक्शन विशेष 4-बाइट SPLIT पैकेज से शुरू होते हैं, SYNC + EOP की गिनती नहीं करते।

योजनाकार


एक फ्रेम के लिए FullSpeed ​​/ LowSpeed ​​बस पर, एक चैनल पर एक से अधिक लेनदेन नहीं हो सकते हैं, एक से अधिक लेनदेन से हस्तांतरण कई फ्रेम में विभाजित हैं। एक हाईस्पीड बस में, माइक्रोफ़्रेम के प्रति लेनदेन की अधिकतम संख्या 3 तक पहुंच सकती है और अधिकतम लेनदेन आकार के साथ चैनल की विशेषताओं में से एक है।

जब एक चैनल खोला जाता है, तो शेड्यूलर को चैनल के पीछे 90% फ्रेम / 80% माइक्रोफ्रेम के एक हिस्से को आरक्षित करना चाहिए, चैनल का उपयोग करने के सबसे खराब मामले के आधार पर - अधिकतम लंबी लेनदेन की अधिकतम संभव संख्या मानकर। लेन-देन की अवधि पिछले अनुभाग में वर्णित है। यदि आप इस तथ्य के कारण चैनल का हिस्सा आरक्षित नहीं कर सकते हैं कि सब कुछ पहले से ही अन्य चैनलों द्वारा लिया गया है, तो शेड्यूलर को एक त्रुटि वापस करनी चाहिए। जब कोई ड्राइवर किसी त्रुटि का पता लगाता है, तो, उदाहरण के लिए, किसी चीज़ के कारण ट्रैफ़िक को कम करने के लिए डिवाइस से बातचीत करने का प्रयास करें या उपयोगकर्ता (नियंत्रण कार्यक्रम के माध्यम से) को सूचित करें कि ऐसी परिस्थितियों में काम करना असंभव है।

विभाजन लेनदेन जटिलता को जोड़ते हैं। सबसे पहले, आपको दो टायरों पर रिकॉर्ड रखने और रखने की आवश्यकता है। दूसरे, माइक्रोफ्रेम फुलस्पीड / लोस्पीड बस में दिखाई देते हैं: यदि होस्ट से टीटी के लिए स्टार्ट-स्प्लिट ट्रांजैक्शन माइक्रोफ्रेम एन में आता है, तो टीटी केवल माइक्रोफ्रेम एन + 1 में ही इस ट्रांजैक्शन को शुरू कर सकता है, और ट्रांजैक्शन में रिटर्न रिजल्ट पूरी तरह से पहले नहीं आए। माइक्रोफ्रेम एन + २। तीसरा, हालांकि सबसे खराब स्थिति में सभी आवधिक लेनदेन के लिए फ्रेम का अधिकतम 90% हिस्सा रहता है, एफएस / एलएस बस पर योजना 7/6 गुणक के बिना बिट सम्मिलन के कारण आशावादी अनुमान पर आधारित होनी चाहिए, धारा 11.18 की अवधि में यूएसबी 2 विनिर्देशन "आवधिक स्प्लिट ट्रांजेक्शन पाइपलाइनिंग और बफर मैनेजमेंट "इस आकलन को" बेस्ट-केस बजट "कहता है - इससे यह संभावना कम हो जाती है कि एफएस / एलएस बस इस तथ्य के कारण निष्क्रिय हो जाएगी कि एक आवधिक लेनदेन पहले की गणना से पहले पूरा हो गया है, अगला आवधिक लेनदेन शुरू हो सकता है। अगले माइक्रोफ्रेम से पहले, क्योंकि उसके लिए, ई स्टार्ट-स्प्लिट ट्रांजैक्शन डेटा अभी तक नहीं आया है, और वर्तमान माइक्रोफ्रेम के शेष हिस्से में अगले गैर-आवधिक लेनदेन के लिए पर्याप्त समय नहीं है। अंत में, मेजबान को यह नहीं पता है कि लेनदेन कब खत्म होगा, और परिणामों को संग्रहीत करने के लिए टीटी बफ़र्स रबर नहीं हैं, इसलिए पूर्ण-विभाजन लेनदेन को कई बार निर्धारित करना होगा - माइक्रोफ्रेम के बाद प्रत्येक माइक्रोफ्रेम में एक, जिसमें लेनदेन पूरा हो सकता है। विशिष्ट आवश्यकताओं को एक ही खंड 11.18 में आवाज दी गई है: एक रुकावट लेनदेन के भाग के रूप में, माइक्रोफ्रेम एन में बजट शुरू, माइक्रोफ्रेम एन -1 में एक स्टार्ट-स्प्लिट लेनदेन और माइक्रोफ्रेम एन + 1, एन + 2 में तीन पूर्ण-विभाजन लेनदेन निर्धारित होने चाहिए। , एन + ३। Isochronous रीड ट्रांज़ैक्शन में केवल इतना अंतर होता है कि वे बजट में कई माइक्रोफ़्रेम्स N, ..., L पर कब्जा कर सकते हैं, यही कारण है कि पूर्ण-स्प्लिट लेनदेन को N + 1 से L + 3 समावेशी तक माइक्रोफ़्रेम में नियोजित करने की आवश्यकता होती है। समकालिक लेनदेन में, कंप्लीट-स्प्लिट ट्रांजेक्शन नहीं लिखे जाते हैं, लेकिन कई स्टार्ट-स्प्लिट ट्रांजेक्शन हो सकते हैं: 188 बाइट्स से कम एफएस बस में एक माइक्रोफ्रेम में फिट हो सकते हैं, और यदि अधिक डेटा है, तो उन्हें 188 की सीमा के साथ कई स्टार्ट-स्प्लिट ट्रांजेक्शन में विभाजित किया जाएगा। एक लेन-देन में बाइट्स।

KolibriOS अनुसूचक विभिन्न फ्रेम / माइक्रोफ्रेम में आरक्षित भागों के सबसे अधिक वितरण को प्राप्त करने की कोशिश कर रहा है, यह सुनिश्चित करने की कोशिश कर रहा है कि वाक्यांश में "प्रत्येक फ्रेम / माइक्रोफ्रेम में X या अधिक खाली समय है", संख्या X जितना संभव हो उतना बड़ा होगा। यदि कोई चैनल बाद में दिखाई देता है जिसे प्रत्येक फ्रेम / माइक्रोफ्रेम पर ध्यान देने की आवश्यकता होती है, तो सफल आरक्षण के लिए एक बड़ा X मान आवश्यक है। यदि यह प्रकट नहीं होता है, तो समय-समय पर गैर-प्रसारण प्रसारण के काम आएगा।

सबसे पहले, अनुसूचक वास्तविक अंतराल का चयन करता है जिस पर मेजबान नियंत्रक चैनल को पोल करेगा। यह कार्य का आसान हिस्सा है: संख्या 1, 2, 4, 8, 16, 32 से चुनने के लिए अधिकतम, दिए गए से अधिक नहीं। . USB1 8 . 8 : , 8k+0, ..., , 8k+7. 32 ; 8k+0 4 0,8,16,24, . , , , 24, , 32k+24, 16k+8, 8k+0, 4k+0, 2k+0, . 0,8,16,24, 8k+0. , , 8k+1, ..., 8k+7. — , , , , . , , 90% , .

HighSpeed- USB2 USB1 : 8 ; , , , .

USB2 , . , , . FS- . , . , HS-, Start-Split Complete-Split .


USBClosePipe API, usb_close_pipe pipe.inc, . , « », usb_close_pipe_nolock , USB-, .

- usb_device_disconnected , , , usb_close_pipe_nolock , , , . USB- , , .

usb_close_pipe_nolock :
- , , - usb_pipe_closed , :


, USBNormalTransferAsync API, usb_normal_transfer_async pipe.inc, : , , , - usb_hardware_func.AllocTransfer , , , usb_hardware_func.InsertTransfer .


, , USBControlTransferAsync API, usb_control_async pipe.inc, USBNormalTransferAsync .

- usb_hardware_func.AllocTransfer , . . , — Toggle. USB « » , - . : Toggle=0, Toggle=1 . Toggle , .


1:
2: -
3: -
4:
5:
6:

Source: https://habr.com/ru/post/In186276/


All Articles