
मेजबान नियंत्रकों के साथ बातचीत के स्तर के बारे में कहानी
दो लेखों में फैली हुई है और अभी भी कुछ विवरणों को पर्दे के पीछे छोड़ दिया है - जो मुझे आशा है, एक इच्छुक पाठक सीधे
स्रोत से बना सकता है। चैनलों के लिए समर्थन का स्तर बहुत सरल है और मुख्य रूप से इस तथ्य पर कब्जा कर लिया गया है कि यह एपीआई कॉल को आवश्यक होस्ट नियंत्रक के साथ अवरुद्ध करने सहित कार्यों के वांछित अनुक्रम में उच्च स्तर के लिए बदल देता है।
चैनल का उद्घाटन
API से
USBOpenPipe
फ़ंक्शन,
usb_open_pipe
.
inc कोड में
usb_open_pipe
कहलाता है, निर्दिष्ट चैनल विशेषताओं और "पैरेंट" चैनल द्वारा एक नया चैनल खोलता है, जहां डिवाइस की विशेषताओं को रिकॉर्ड किया जाता है। ऐसा करने के लिए, वह:
- चैनल का वर्णन करने वाले
*hci_pipe+usb_pipe
संरचनाओं की एक जोड़ी का चयन करता है और नियंत्रक-विशिष्ट फ़ंक्शन usb_hardware_func.AllocPipe
को कॉल करके नियंत्रक-विशिष्ट सीमा से usb_hardware_func.AllocPipe
; *hci_gtd+usb_gtd
संरचनाओं की एक जोड़ी का चयन करता है, जो एक खाली स्थानांतरण विवरणक का वर्णन करता है और नियंत्रक-विशिष्ट फ़ंक्शन usb_hardware_func.AllocTD
को कॉल करके एक नियंत्रक-विशिष्ट सीमा से usb_hardware_func.AllocTD
;- पॉइंटर्स में भरता है: चैनल संरचना में, नियंत्रक संरचना के लिए एक पॉइंटर को कॉपी करता है और "पैरेंट" चैनल से सभी चैनलों के लिए डेटा डेटा के लिए एक पॉइंटर; चैनल संरचना और खाली विवरणक की संरचना के बीच पॉइंटर्स राउंड-ट्रिप भरता है; एक खाली विवरणक की संरचना इसे चैनलों की दोहरी रूप से जुड़ी सूची का एकमात्र तत्व बनाती है;
- म्यूटेक्स को इनिशियलाइज़ करता है, जो इस चैनल के साथ सभी ऑपरेशंस की रक्षा करेगा यद्यपि USB नियंत्रकों से घटनाओं का सभी प्रसंस्करण एक USB स्ट्रीम में होता है, लेकिन एपीआई तक पहुंचने के लिए भी ऐसा ही नहीं कहा जा सकता है: USB फ्लैश ड्राइव से एक फाइल पढ़ने वाला एप्लिकेशन एक हस्तांतरण शुरू करता है - और एक भी नहीं - एप्लिकेशन स्ट्रीम के संदर्भ में कतार में। ताकि पुराने हस्तांतरण को पूरा करने के लिए नया स्थानांतरण USB स्ट्रीम में हस्तक्षेप न करे, इस म्यूटेक्स की आवश्यकता है;
- डिवाइस के चैनल सेट के म्यूटेक्स को कैप्चर करता है और यह सुनिश्चित करता है कि डिवाइस अभी तक डिस्कनेक्ट नहीं हुआ है।
- नियंत्रक-विशिष्ट आरंभिक कॉल को
usb_hardware_func.InitPipe
, एक म्यूटेक्स द्वारा संरक्षित है जो नियंत्रक के लिए वैश्विक है; - डिवाइस चैनल सेट पर एक नया चैनल जोड़ता है और चैनल सेट म्यूटेक्स जारी करता है;
- यदि कोई एक चरण विफल रहता है, तो पिछले सभी चरणों को वापस ले लेता है। चूंकि नियंत्रक-विशिष्ट प्रारंभ को वापस रोल करना सबसे कठिन है, यह अंतिम चरण में किया गया था, जिसके बाद कोई त्रुटि नहीं हो सकती है।
अंतिम क्रिया के साथ नियंत्रक-विशिष्ट प्रारंभिककरण संबंधित सूची में एक नया चैनल जोड़ता है। नियंत्रण चैनलों के लिए, साथ ही डेटा सरणियों के चैनलों के लिए, केवल एक सूची है, लेकिन इंटरप्ट चैनलों के लिए, आपको अभी भी कई विकल्पों में से एक को चुनने की आवश्यकता है।

यह वह जगह है जहाँ
अनुसूचक । 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 बिट्स के ट्रांसमिशन समय के बराबर है।
मेजबान नियंत्रक लेन-देन के इन सभी विवरणों के कार्यान्वयन को छिपाता है, नियोजन के लिए यह केवल यह जानने के लिए पर्याप्त है कि लेनदेन में कितना समय लगेगा। समय लेनदेन के प्रकार, लेनदेन की दिशा और डिवाइस की गति पर निर्भर करता है।
- इंटरप्ट रीड ट्रांजैक्शन में डिवाइस के टोकन के साथ एक पैकेट होता है, जो डिवाइस से प्रतिक्रिया की प्रतीक्षा करता है, डिवाइस से डेटा वाला पैकेट, प्राप्त पैकेट के बाद पॉज, डिवाइस के फीडबैक वाला पैकेट, भेजे गए पैकेट के बाद पॉज।
- हाईस्पीड बस: पहले पैकेट में 68 बिट्स, 736 वेट बिट्स, 40+ (7/6) * 8 * (डेटा साइज + 3) बिट्स दूसरे पैकेट में, 8 बिट्स पॉज में, 49 बिट्स आखिरी पैकेट में, दूसरे 88 बिट्स पॉज में - कुल 989 + 8 * (7/6) * (डेटा आकार + 3) बिट्स अधिकतम।
- फुलस्पीड बस: पहले पैकेट में 39 बिट्स, वेटिंग के 18 बिट्स (401/400) * (11+ (7/6) * 8 * (डेटा साइज + 3) बिट्स दूसरे पैकेट में, 2 बिट्स ऑफ पॉज, 20 बिट्स अंतिम पैकेट, ठहराव के एक और 2 बिट्स - कुल 93 + 2807/300 * (डेटा आकार + 3) बिट्स अधिकतम।
- लोस्पीड-बस: प्रथम पैकेट के लिए 16 एफएस-बिट्स और हब्स की प्रतिक्रिया के लिए 4 एफएस-बिट्स, पहले पैकेट में 8 * 39 एफएस-बिट्स, 8 * 18 एफएस-बिट्स ऑफ वेटिंग, (406-50) * (11+ (7) / 6) * 8 * (डेटा आकार + 3)) एफएस-बिट्स दूसरे पैकेट में, 8 * 2 एफएस-पॉज बिट्स, 16 एफएस-बिट्स ऑफ द लास्ट पैकेट और 4 एफएस-बिट्स की प्रतिक्रिया के लिए, 8 * 20 एफएस- अंतिम पैकेट में बिट, एक और 8 * 2 विराम बिट्स - कुल 778 + 5684/75 * (डेटा आकार + 3) एफएस-बिट अधिकतम।
- इंटरप्ट राइट ट्रांजैक्शन में डिवाइस के टोकन के साथ एक पैकेट होता है, भेजे गए पैकेट के बाद एक पॉज़, डिवाइस के डेटा के साथ एक पैकेट, डिवाइस से प्रतिक्रिया की प्रतीक्षा में, डिवाइस से फीडबैक के साथ एक पैकेट, प्राप्त पैकेट के बाद एक पॉज़। पढ़ने से अंतर, शब्दों के क्रम की गिनती नहीं, केवल प्रसारण की दिशा में है।
- हाईस्पीड-बस: वही 989 + 8 * (7/6) * (डेटा आकार + 3) बिट्स अधिकतम।
- FullSpeed बस: 401/400 गुणक "चाल" डेटा पैकेट से प्रतिक्रिया पैकेट तक, कुल 93 + 28/3 * (डेटा आकार + 3) बिट्स अधिकतम।
- लोस्पीड बस: 406/50 और 8 मल्टीप्लायर दो डेटा और फीडबैक पैकेट्स में परस्पर जुड़े हुए हैं, कुल 778 + 224/3 * (डेटा आकार + 3) एफएस बिट्स अधिकतम।
- एक समकालिक रीड ट्रांजैक्शन में डिवाइस के टोकन के साथ एक पैकेट होता है, जो डिवाइस से प्रतिक्रिया की प्रतीक्षा करता है, डिवाइस से डेटा के साथ एक पैकेट, प्राप्त पैकेट के बाद एक पॉज।
- हाईस्पीड बस: पहले पैकेट में 68 बिट्स, वेटिंग के 736 बिट्स, 40+ (7/6) * 8 * (डेटा साइज + 3) बिट्स दूसरे पैकेट में, 8 बिट्स ऑफ ए पॉज - कुल 852 + 8 * (7/6) * (डेटा आकार + 3) बिट्स अधिकतम।
- फुलस्पीड बस: पहले पैकेट में 39 बिट्स, वेटिंग के 18 बिट्स (401/400) * (11+ (7/6) * 8 * (डेटा साइज + 3) बिट्स दूसरे पैकेट में, 2 पॉज बिट्स- कुल 71 + 2807/300 * (डेटा आकार + 3) बिट्स अधिकतम।
- LowSpeed बस पर, विशिष्ट समरूप लेनदेन को विनिर्देश द्वारा अनुमति नहीं है।
- एक समकालिक लेखन लेन-देन में एक टोकन होता है जिसमें डिवाइस का टोकन होता है, भेजे गए पैकेट के बाद एक पॉज़, डिवाइस के डेटा के साथ एक पैकेट, भेजे गए पैकेट के बाद एक अन्य पॉज़।
- हाईस्पीड बस: पहले पैकेट में 68 बिट्स, 88 बिट्स ऑफ पॉज, 40+ (7/6) * 8 * (डाटा साइज + 3) बिट्स दूसरे पैकेट में, 88 बिट्स ऑफ पॉज - कुल 284 + 8 * (7/6) * (डेटा आकार + 3) बिट्स अधिकतम।
- फुलस्पीड बस: पहले पैकेट में 39 बिट्स, 2 पॉज बिट्स, 11+ (7/6) * 8 * (डेटा का आकार + 3) बिट्स दूसरे पैकेट में, 2 और पॉज बिट्स - कुल 54 + 8 * (7/6) * (डेटा आकार + 3) बिट्स अधिकतम।
- LowSpeed बस पर, विशिष्ट समरूप लेनदेन को विनिर्देश द्वारा अनुमति नहीं है।
स्प्लिट ट्रांजेक्शन में दो बसों पर तीन प्रकार के "प्रारंभिक" लेन-देन होते हैं: होस्ट और TT के बीच हाईस्पीड बस पर स्टार्ट-स्प्लिट ट्रांजेक्शन, TT और डिवाइस के बीच FullSpeed / LowSpeed बस में एक सामान्य लेन-देन, एक होस्ट के बीच हाईस्पीड बस में एक स्प्लिट-स्प्लिट ट्रांजैक्शन। टीटी। बीच में लेन-देन का समय टीटी के बिना एक ही लेन-देन के समय से अलग होता है जो केवल टीटी द्वारा पेश किए गए अतिरिक्त ठहराव से होता है और टीटी के साथ हब के हैंडल में वर्णित होता है। स्टार्ट-स्प्लिट और कम्प्लीट-स्प्लिट ट्रांजेक्शन विशेष 4-बाइट SPLIT पैकेज से शुरू होते हैं, SYNC + EOP की गिनती नहीं करते।
- स्प्लिट रीड इंटरप्ट ट्रांजेक्शन और आइसोक्रोनस रीड ट्रांजैक्शन। स्टार्ट-स्प्लिट ट्रांजेक्शन में SPLIT पैकेट, भेजे गए पैकेट के बाद पॉज़, टोकन के साथ एक पैकेट, भेजे गए पैकेट के बाद पॉज़ - कुल 321 बिट्स होते हैं। कम्पलीट-स्प्लिट ट्रांजेक्शन में एक SPLIT पैकेट, एक भेजा पैकेट के बाद एक पॉज़, एक टोकन वाला एक पैकेट, डिवाइस से प्रतिक्रिया की प्रतीक्षा में, एक डेटा पैकेट, एक प्राप्त पैकेट के बाद एक पॉज़ - कुल 1017-8 * (7/6) * (डेटा आकार + 3) बिट्स ।
- विभाजन व्यवधान लेखन लेनदेन। स्टार्ट-स्प्लिट ट्रांजेक्शन में एक SPLIT पैकेट, एक भेजा पैकेट के बाद एक पॉज़, एक टोकन के साथ एक पैकेट, भेजे गए पैकेट के बाद एक पॉज़, एक डेटा पैकेट, भेजे गए पैकेट के बाद एक पॉज़ - कुल 448 + 8 * (7/6) * (डेटा का आकार + 3) बिट्स होता है। । कम्पलीट-स्प्लिट ट्रांजेक्शन में एक SPLIT पैकेट, एक भेजा पैकेट के बाद एक पॉज़, एक टोकन के साथ एक पैकेट, एक डिवाइस प्रतिक्रिया के लिए प्रतीक्षा कर रहा है, एक फीडबैक पैकेट, प्राप्त पैकेट के बाद एक पॉज़ - कुल 1026 बिट्स।
- स्प्लिट आइसोक्रोनस राइट ट्रांजेक्शन है। स्टार्ट-स्प्लिट ट्रांजेक्शन में वही संरचना होती है, जो किसी व्यवधान लिखने के लेन-देन, 449 + 8 * (7/6) * (डेटा आकार + 3) बिट्स के मामले में होती है। लेन-देन पूर्ण-विभाजन गायब है।
योजनाकार
एक फ्रेम के लिए 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_hardware_func.UnlinkPipe
, , scheduler.inc .
- , , -
usb_pipe_closed
, :
- , callback- « » ;
- « » , , ;
- « » , , ;
- ,
DeviceDisconnected
, , , , , , , , , .
,
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: