इनपुट

Android Input HAL का आइकॉन

Android इनपुट सबसिस्टम में, इवेंट पाइपलाइन होती है, जो सिस्टम की कई लेयर से गुज़रती है.

इनपुट पाइपलाइन

सबसे निचली लेयर पर, फ़िज़िकल इनपुट डिवाइस ऐसे सिग्नल जनरेट करता है जिनसे डिवाइस की स्थिति में हुए बदलावों के बारे में पता चलता है. जैसे, बटन दबाने और टच पॉइंट को छूने से. डिवाइस फ़र्मवेयर, इन सिग्नल को किसी तरह से कोड में बदलता है और उन्हें ट्रांसमिट करता है. जैसे, सिस्टम को यूएसबी एचआईडी रिपोर्ट भेजकर या I2C बस पर रुकावटें पैदा करके.

इसके बाद, Linux kernel में मौजूद डिवाइस ड्राइवर, सिग्नल को डिकोड करता है. Linux kernel, कई स्टैंडर्ड डिवाइसों के लिए ड्राइवर उपलब्ध कराता है. खास तौर पर, उन डिवाइसों के लिए जो एचआईडी प्रोटोकॉल का पालन करते हैं. हालांकि, OEM को अक्सर एम्बेड किए गए ऐसे डिवाइसों के लिए कस्टम ड्राइवर उपलब्ध कराने होते हैं जो सिस्टम में कम लेवल पर ज़ोर से इंटिग्रेट किए गए होते हैं. जैसे, टच स्क्रीन.

इनपुट डिवाइस ड्राइवर, Linux इनपुट प्रोटोकॉल की मदद से, डिवाइस के हिसाब से सिग्नल को स्टैंडर्ड इनपुट इवेंट फ़ॉर्मैट में बदलने की ज़िम्मेदारी लेते हैं. Linux इनपुट प्रोटोकॉल, linux/input.h कर्नेल हेडर फ़ाइल में इवेंट टाइप और कोड का स्टैंडर्ड सेट तय करता है. इस तरह, कर्नेल के बाहर के कॉम्पोनेंट को फ़िज़िकल स्कैन कोड, एचआईडी के इस्तेमाल, I2C मैसेज, जीपीआईओ पिन वगैरह जैसी जानकारी की ज़रूरत नहीं होती.

इसके बाद, Android EventHub कॉम्पोनेंट, हर इनपुट डिवाइस से जुड़े evdev ड्राइवर को खोलकर, kernel से इनपुट इवेंट पढ़ता है. इसके बाद, Android InputReader कॉम्पोनेंट, डिवाइस क्लास के हिसाब से इनपुट इवेंट को डिकोड करता है और Android इनपुट इवेंट की स्ट्रीम बनाता है. इस प्रोसेस के तहत, Linux इनपुट प्रोटोकॉल इवेंट कोड को इनपुट डिवाइस कॉन्फ़िगरेशन, कीबोर्ड लेआउट फ़ाइलों, और अलग-अलग मैपिंग टेबल के हिसाब से, Android इवेंट कोड में बदल दिया जाता है.

आखिर में, InputReader, InputDispatcher को इनपुट इवेंट भेजता है, जो उन्हें सही विंडो पर भेजता है.

कंट्रोल पॉइंट

इनपुट पाइपलाइन में कई चरण होते हैं, जिनसे इनपुट डिवाइस के व्यवहार पर असर पड़ता है.

ड्राइवर और फ़र्मवेयर कॉन्फ़िगरेशन

इनपुट डिवाइस के ड्राइवर, रजिस्टर में पैरामीटर सेट करके या फ़र्मवेयर को खुद अपलोड करके, इनपुट डिवाइस के व्यवहार को अक्सर कॉन्फ़िगर करते हैं. खास तौर पर, टच स्क्रीन जैसे एम्बेड किए गए डिवाइसों के लिए ऐसा होता है. इनमें कैलिब्रेशन की प्रोसेस का ज़्यादातर हिस्सा, इन पैरामीटर को ट्यून करने या फ़र्मवेयर को ठीक करने में बीतता है. इससे, डिवाइस की परफ़ॉर्मेंस को बेहतर बनाने, सटीक नतीजे देने, और ग़ैर-ज़रूरी आवाज़ों को कम करने में मदद मिलती है.

ड्राइवर कॉन्फ़िगरेशन के विकल्पों को अक्सर kernel board support package (BSP) में मॉड्यूल पैरामीटर के तौर पर बताया जाता है, ताकि एक ही ड्राइवर कई अलग-अलग हार्डवेयर के साथ काम कर सके.

इस दस्तावेज़ में ड्राइवर या फ़र्मवेयर कॉन्फ़िगरेशन के बारे में बताया गया है. हालांकि, इसमें डिवाइस के कैलिब्रेशन के बारे में सामान्य दिशा-निर्देश दिए गए हैं.

बोर्ड के कॉन्फ़िगरेशन की प्रॉपर्टी

कर्नेल बोर्ड सपोर्ट पैकेज (बीएसपी), SysFS के ज़रिए बोर्ड कॉन्फ़िगरेशन की प्रॉपर्टी एक्सपोर्ट कर सकता है. इन प्रॉपर्टी का इस्तेमाल, Android InputReader कॉम्पोनेंट करता है. जैसे, टच स्क्रीन पर वर्चुअल बटन की जगह तय करना.

अलग-अलग डिवाइस, बोर्ड कॉन्फ़िगरेशन प्रॉपर्टी का इस्तेमाल कैसे करते हैं, इस बारे में जानने के लिए डिवाइस क्लास सेक्शन देखें.

रिसॉर्स ओवरले

config.xml में रिसॉर्स ओवरले की मदद से, इनपुट के कुछ व्यवहार कॉन्फ़िगर किए जाते हैं. जैसे, लिड स्विच का इस्तेमाल.

यहां कुछ उदाहरण दिए गए हैं:

  • config_lidKeyboardAccessibility: यह बताता है कि लिड स्विच के चालू या बंद होने पर, हार्डवेयर कीबोर्ड को ऐक्सेस किया जा सकता है या नहीं.

  • config_lidNavigationAccessibility: यह बताता है कि लिड स्विच के चालू या बंद होने पर, ट्रैकपैड को ऐक्सेस किया जा सकता है या नहीं.

  • config_longPressOnPowerBehavior: इससे यह तय होता है कि जब उपयोगकर्ता पावर बटन को दबाकर रखता है, तो क्या करना चाहिए.

  • config_lidOpenRotation: इससे पता चलता है कि स्क्रीन के ओरिएंटेशन पर, लिड स्विच का क्या असर पड़ता है.

कॉन्फ़िगरेशन के हर विकल्प के बारे में जानकारी पाने के लिए, frameworks/base/core/res/res/values/config.xml में मौजूद दस्तावेज़ देखें.

मुख्य मैप

Android EventHub और InputReader कॉम्पोनेंट, बटन, जॉयस्टिक बटन, और जॉयस्टिक ऐक्सिस के लिए, Linux इवेंट कोड से Android इवेंट कोड में मैपिंग को कॉन्फ़िगर करने के लिए, बटन मैप का इस्तेमाल करते हैं. मैपिंग, डिवाइस या भाषा पर निर्भर हो सकती है.

अलग-अलग डिवाइस, मुख्य मैप का इस्तेमाल कैसे करते हैं, इस बारे में जानने के लिए डिवाइस क्लास सेक्शन देखें.

इनपुट डिवाइस की कॉन्फ़िगरेशन फ़ाइलें

इनपुट डिवाइस की कॉन्फ़िगरेशन फ़ाइलों का इस्तेमाल, Android के EventHub और InputReader कॉम्पोनेंट करते हैं. इससे डिवाइस की खास विशेषताओं को कॉन्फ़िगर किया जाता है. जैसे, टच साइज़ की जानकारी को कैसे रिपोर्ट किया जाता है.

अलग-अलग डिवाइस, इनपुट डिवाइस कॉन्फ़िगरेशन मैप का इस्तेमाल कैसे करते हैं, इस बारे में जानने के लिए डिवाइस क्लास सेक्शन देखें.

एचआईडी के इस्तेमाल और इवेंट कोड के बारे में जानकारी

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

फ़िज़िकल स्कैन कोड

फ़िज़िकल स्कैन कोड, डिवाइस के हिसाब से एक आइडेंटिफ़ायर होता है. यह हर बटन, बटन या अन्य कंट्रोल से जुड़ा होता है. फ़िज़िकल स्कैन कोड अक्सर एक डिवाइस से दूसरे डिवाइस में अलग-अलग होते हैं. इसलिए, फ़र्मवेयर या डिवाइस ड्राइवर की ज़िम्मेदारी होती है कि वे उन्हें स्टैंडर्ड आइडेंटिफ़ायर से मैप करें. जैसे, एचआईडी के इस्तेमाल या Linux की-कोड.

स्कैन कोड का इस्तेमाल मुख्य रूप से कीबोर्ड के लिए किया जाता है. आम तौर पर, अन्य डिवाइस जीपीआईओ पिन, I2C मैसेज या अन्य तरीकों का इस्तेमाल करके, कम लेवल पर कम्यूनिकेट करते हैं. इसलिए, सॉफ़्टवेयर स्टैक की ऊपरी लेयर, डिवाइस ड्राइवर पर निर्भर करती हैं, ताकि वे यह समझ सकें कि क्या हो रहा है.

एचआईडी का इस्तेमाल

एचआईडी का इस्तेमाल, एक स्टैंडर्ड आइडेंटिफ़ायर होता है. इसका इस्तेमाल, किसी कंट्रोल की स्थिति की जानकारी देने के लिए किया जाता है. जैसे, कीबोर्ड बटन, जॉयस्टिक ऐक्सिस, माउस बटन या टच संपर्क बिंदु. ज़्यादातर यूएसबी और ब्लूटूथ इनपुट डिवाइस, एचआईडी स्पेसिफ़िकेशन के मुताबिक होते हैं. इससे सिस्टम, इन डिवाइसों के साथ एक जैसी तरह से इंटरफ़ेस कर पाता है.

Android फ़्रेमवर्क, HID के इस्तेमाल से जुड़े कोड को Linux के बटन कोड और अन्य आइडेंटिफ़ायर में बदलने के लिए, Linux कर्नेल के HID ड्राइवर पर निर्भर करता है. इसलिए, एचआईडी का इस्तेमाल मुख्य रूप से, पीरियफ़रल बनाने वाली कंपनियां करती हैं.

Linux पासकोड

Linux की बटन कोड, किसी बटन या बटन के लिए स्टैंडर्ड आइडेंटिफ़ायर होता है. Linux की मुख्य कुंजियों के कोड, linux/input.h हेडर फ़ाइल में तय किए जाते हैं. इसके लिए, KEY_ या BTN_ प्रीफ़िक्स से शुरू होने वाली स्थिर वैल्यू का इस्तेमाल किया जाता है. Linux kernel इनपुट ड्राइवर, फ़िज़िकल स्कैन कोड, HID के इस्तेमाल, और डिवाइस के हिसाब से अन्य सिग्नल को Linux कीबोर्ड कोड में बदलने के लिए ज़िम्मेदार होते हैं. साथ ही, EV_KEY इवेंट के हिस्से के तौर पर, इनके बारे में जानकारी देते हैं.

Android API कभी-कभी किसी पासकोड से जुड़े Linux पासकोड को "स्कैन कोड" के तौर पर दिखाता है. तकनीकी तौर पर यह गलत है, लेकिन इससे एपीआई में Linux पासकोड को Android पासकोड से अलग करने में मदद मिलती है.

Linux रिलेटिव या एब्सोल्यूट ऐक्सिस कोड

Linux का रिलेटिव या एब्सोल्यूट ऐक्सिस कोड, किसी ऐक्सिस के साथ रिलेटिव मूवमेंट या एब्सोल्यूट पोज़िशन की रिपोर्टिंग के लिए एक स्टैंडर्ड आइडेंटिफ़ायर होता है. जैसे, माउस के X ऐक्सिस के साथ रिलेटिव मूवमेंट या X ऐक्सिस के साथ जॉयस्टिक की एब्सोल्यूट पोज़िशन. Linux ऐक्सिस कोड, linux/input.h हेडर फ़ाइल में तय किए जाते हैं. इसके लिए, REL_ या ABS_ प्रीफ़िक्स से शुरू होने वाली कॉन्स्टेंट का इस्तेमाल किया जाता है. Linux kernel इनपुट ड्राइवर, HID के इस्तेमाल और डिवाइस के हिसाब से अन्य सिग्नल को Linux ऐक्सिस कोड में बदलने के लिए ज़िम्मेदार होते हैं. साथ ही, EV_REL और EV_ABS इवेंट के हिस्से के तौर पर, उनके बारे में जानकारी देते हैं.

Linux स्विच कोड

Linux स्विच कोड, किसी डिवाइस पर स्विच की स्थिति की रिपोर्ट करने के लिए इस्तेमाल किया जाने वाला स्टैंडर्ड आइडेंटिफ़ायर होता है. जैसे, लिड स्विच. Linux स्विच कोड, linux/input.h हेडर फ़ाइल में तय किए जाते हैं. इसके लिए, SW_ प्रीफ़िक्स से शुरू होने वाली कॉन्स्टेंट का इस्तेमाल किया जाता है. Linux के kernel इनपुट ड्राइवर, स्विच की स्थिति में होने वाले बदलावों को EV_SW इवेंट के तौर पर रिपोर्ट करते हैं.

आम तौर पर, Android ऐप्लिकेशन को स्विच से इवेंट नहीं मिलते. हालांकि, सिस्टम डिवाइस के हिसाब से अलग-अलग फ़ंक्शन को कंट्रोल करने के लिए, इनका इस्तेमाल अंदरूनी तौर पर कर सकता है.

Android पासकोड

Android बटन कोड, Android एपीआई में तय किया गया एक स्टैंडर्ड आइडेंटिफ़ायर है. इसका इस्तेमाल, 'होम' जैसी किसी खास बटन की जानकारी देने के लिए किया जाता है. Android की-कोड को android.view.KeyEvent क्लास के तौर पर तय किया जाता है. ये कोड, KEYCODE_ प्रीफ़िक्स से शुरू होते हैं.

की लेआउट से पता चलता है कि Linux की कोड, Android की कोड पर कैसे मैप किए जाते हैं. कीबोर्ड के मॉडल, भाषा, देश, लेआउट या खास फ़ंक्शन के हिसाब से, अलग-अलग बटन लेआउट का इस्तेमाल किया जा सकता है.

Android की-कोड के कॉम्बिनेशन को डिवाइस और स्थानीय भाषा के हिसाब से बने की-कैरेक्टर मैप का इस्तेमाल करके, कैरेक्टर कोड में बदल दिया जाता है. उदाहरण के लिए, जब KEYCODE_SHIFT और KEYCODE_A के तौर पर पहचानी गई बटन को एक साथ दबाया जाता है, तो सिस्टम बटन के कैरेक्टर मैप में कॉम्बिनेशन खोजता है और कैपिटल लेटर 'A' ढूंढता है. इसके बाद, इसे फ़ोकस किए गए टेक्स्ट विजेट में डाला जाता है.

Android Axis कोड

Android ऐक्सिस कोड, Android API में तय किया गया एक स्टैंडर्ड आइडेंटिफ़ायर है. इसका इस्तेमाल, किसी डिवाइस ऐक्सिस के बारे में बताने के लिए किया जाता है. Android ऐक्सिस कोड, android.view.MotionEvent क्लास के तहत तय किए जाते हैं. ये कोड, AXIS_ प्रीफ़िक्स से शुरू होते हैं.

कुंजी लेआउट से पता चलता है कि Linux ऐक्सिस कोड, Android ऐक्सिस कोड से कैसे मैप किए जाते हैं. डिवाइस के मॉडल, भाषा, देश, लेआउट या खास फ़ंक्शन के हिसाब से, अलग-अलग बटन लेआउट का इस्तेमाल किया जा सकता है.

Android मेटा स्टेटस

Android मेटा स्टेटस, Android एपीआई में तय किया गया एक स्टैंडर्ड आइडेंटिफ़ायर है. इससे यह पता चलता है कि कौनसी मॉडिफ़ायर बटन दबाए गए हैं. Android मेटा स्टेटस, android.view.KeyEvent क्लास के तौर पर तय किए जाते हैं. ये ऐसे कॉन्स्टेंट होते हैं जो META_ प्रीफ़िक्स से शुरू होते हैं.

मौजूदा मेटा स्टेटस, Android InputReader घटक से तय होता है. यह घटक, KEYCODE_SHIFT_LEFT जैसी बदलाव करने वाली बटन को दबाने / छोड़ने पर निगरानी करता है. साथ ही, सही मेटा स्टेटस फ़्लैग को सेट / रीसेट करता है.

मॉडिफ़ायर बटन और मेटा स्टेटस के बीच का संबंध, हार्डकोड किया गया है. हालांकि, बटन के लेआउट से, मॉडिफ़ायर बटन के मैप होने के तरीके में बदलाव हो सकता है. इससे मेटा स्टेटस पर असर पड़ता है.

Android बटन की स्थिति

Android बटन की स्थिति, Android API में तय किया गया एक स्टैंडर्ड आइडेंटिफ़ायर है. इससे यह पता चलता है कि माउस या स्टाइलस पर कौनसे बटन दबाए गए हैं. Android बटन की स्थितियों को android.view.MotionEvent क्लास के तौर पर तय किया जाता है. ये स्थितियां, BUTTON_ प्रीफ़िक्स से शुरू होती हैं.

बटन की मौजूदा स्थिति, Android InputReader घटक से तय होती है. यह घटक, माउस या स्टाइलस पर बटन दबाने / छोड़ने पर निगरानी करता है. साथ ही, बटन की सही स्थिति का फ़्लैग सेट / रीसेट करता है.

बटन और बटन की स्थितियों के बीच का संबंध, हार्डकोड किया गया है.

इसके बारे में और पढ़ें

  1. Linux इनपुट इवेंट कोड
  2. Linux का मल्टी-टच प्रोटोकॉल
  3. Linux इनपुट ड्राइवर
  4. Linux पर फ़ोर्स फ़ीडबैक
  5. एचआईडी डिवाइसों की जानकारी, जिसमें एचआईडी डिवाइसों के इस्तेमाल की टेबल भी शामिल हैं