ورودی

نماد Android Input HAL

زیرسیستم ورودی Android به‌طور اسمی از یک خط لوله رویداد تشکیل شده است که از چندین لایه سیستم عبور می‌کند.

خط لوله ورودی

در پایین‌ترین لایه، دستگاه ورودی فیزیکی سیگنال‌هایی تولید می‌کند که تغییرات وضعیت را توصیف می‌کنند، مثل فشار دادن کلید و نقاط تماس لمسی. سفت‌افزار دستگاه این سیگنال‌ها را به‌نحوی کدبندی و ارسال می‌کند، مثلاً با ارسال گزارش‌های USB HID به سیستم یا با ایجاد وقفه در گذرگاه I2C.

سپس این سیگنال‌ها توسط یک درایور دستگاه در هسته Linux رمزگشایی می‌شوند. هسته Linux درایورهایی برای بسیاری از لوازم جانبی استاندارد ارائه می‌دهد، به‌ویژه آن‌هایی که از پروتکل HID پیروی می‌کنند. بااین‌حال، سازنده تجهیزات اصلی اغلب باید درایورهای سفارشی برای دستگاه‌های جاسازی‌شده‌ای که در سطح پایین با سیستم یکپارچه شده‌اند، مثل صفحه‌های لمسی، ارائه دهد.

گردانندگان دستگاه ورودی مسئول ترجمه سیگنال‌های مختص دستگاه به قالب رویداد ورودی استاندارد ازطریق پروتکل ورودی Linux هستند. پروتکل ورودی Linux مجموعه استانداردی از انواع و کدهای رویداد را در فایل سرایند هسته linux/input.h تعریف می‌کند. به این ترتیب، مؤلفه‌های خارج از هسته نیازی به توجه به جزئیاتی مانند کدهای اسکن فیزیکی، کاربردهای HID، پیام‌های I2C، پین‌های GPIO، و موارد مشابه ندارند.

سپس، عنصر Android EventHub با باز کردن درایور evdev مرتبط با هر دستگاه ورودی، رویدادهای ورودی را از هسته می‌خواند. سپس عنصر Android InputReader رویدادهای ورودی را براساس کلاس دستگاه رمزگشایی می‌کند و جاری‌سازی رویدادهای ورودی Android را تولید می‌کند. به‌عنوان بخشی از این فرایند، کدهای رویداد پروتکل ورودی Linux براساس پیکربندی دستگاه ورودی، فایل‌های جانمایی صفحه‌کلید، و جدول‌های نگاشت مختلف به کدهای رویداد Android ترجمه می‌شوند.

درنهایت، InputReader رویدادهای ورودی را به InputDispatcher ارسال می‌کند که آن‌ها را به پنجره مناسب ارسال می‌کند.

نقاط کنترل

چندین مرحله در خط لوله ورودی وجود دارد که بر کنترل رفتار دستگاه ورودی تأثیر می‌گذارد.

پیکربندی سفت‌افزار و درایور

درایورهای دستگاه ورودی اغلب رفتار دستگاه ورودی را با تنظیم پارامترها در ثبات‌ها یا حتی بارگذاری خود میان‌افزار پیکربندی می‌کنند. این موضوع به‌ویژه در مورد دستگاه‌های جاسازی‌شده مانند صفحه‌های لمسی صدق می‌کند که بخش بزرگی از فرایند کالیبراسیون شامل تنظیم این پارامترها یا اصلاح میان‌افزار برای ارائه دقت و پاسخ‌گویی مطلوب و سرکوب نویز است.

گزینه‌های پیکربندی درایور اغلب به‌عنوان پارامترهای واحد در بسته پشتیبانی برد کرنل (BSP) مشخص می‌شوند تا درایور یکسان بتواند از چندین پیاده‌سازی سخت‌افزاری مختلف پشتیبانی کند.

این مستندات سعی در توصیف پیکربندی درایور یا میان‌افزار ندارد، اما راهنمایی‌هایی درباره واسنجی دستگاه به‌طور کلی ارائه می‌دهد.

ویژگی‌های پیکربندی تابلو

بسته پشتیبانی برد هسته (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 برای پیکربندی ویژگی‌های خاص دستگاه مثل نحوه گزارش اطلاعات اندازه لمس استفاده می‌شود.

برای جزئیات مربوط به نحوه استفاده دستگاه‌های مختلف از نقشه‌های پیکربندی دستگاه ورودی، به بخش‌های کلاس دستگاه مراجعه کنید.

درک کاربردهای HID و کدهای رویداد

اغلب چندین شناسه مختلف برای اشاره به هر کلید معینی در صفحه‌کلید، دکمه در کنترل‌کننده بازی، محور دسته کنترل، یا کنترل دیگر استفاده می‌شود. روابط بین این شناسه‌ها همیشه یکسان نیست: این روابط به مجموعه‌ای از جدول‌های نگاشت وابسته است، برخی‌از این جدول‌ها ثابت هستند و برخی‌از آن‌ها براساس ویژگی‌های دستگاه، درایور دستگاه، منطقه کنونی، پیکربندی سیستم، ترجیحات کاربر، و عوامل دیگر تغییر می‌کنند.

کد اسکن فیزیکی

کد اسکن فیزیکی شناسه‌ای مختص دستگاه است که با هر کلید، دکمه، یا کنترل دیگری مرتبط است. ازآنجایی‌که کدهای اسکن فیزیکی اغلب از دستگاهی به دستگاه دیگر متفاوت است، میان‌افزار یا درایور دستگاه مسئول نگاشت آن‌ها به شناسه‌های استاندارد مانند کاربردهای HID یا کدهای کلید Linux است.

کدهای اسکن عمدتاً برای صفحه‌کلیدها جالب هستند. دستگاه‌های دیگر معمولاً در سطح پایین بااستفاده از پایه‌های GPIO، پیام‌های I2C، یا روش‌های دیگر ارتباط برقرار می‌کنند. درنتیجه، لایه‌های بالایی پشته نرم‌افزار برای درک آنچه درحال وقوع است به درایورهای دستگاه متکی هستند.

استفاده از دستگاه میانای انسانی

استفاده از HID شناسه‌ای استاندارد است که برای گزارش کردن وضعیت کنترل استفاده می‌شود، مثل کلید صفحه‌کلید، محور دسته بازی، دکمه موشواره، یا نقطه تماس لمسی. اکثر دستگاه‌های ورودی USB و بلوتوث از مشخصات HID پیروی می‌کنند که به سیستم امکان می‌دهد به‌صورت یکپارچه با آن‌ها ارتباط برقرار کند.

«چارچوب Android» برای ترجمه کدهای استفاده از HID به کدهای کلید Linux و شناسه‌های دیگر به درایورهای هسته Linux HID متکی است. بنابراین، کاربردهای HID عمدتاً برای تولیدکنندگان جانبی جالب است.

کد کلید Linux

کد کلید Linux شناسه استانداردی برای کلید یا دکمه است. کدهای کلید Linux در فایل سرایند linux/input.h بااستفاده از ثابت‌هایی که با پیشوند KEY_ یا BTN_ شروع می‌شوند تعریف شده‌اند. درایورهای ورودی هسته Linux مسئول ترجمه کدهای اسکن فیزیکی، کاربردهای HID، و دیگر نشان‌های ویژه دستگاه به کدهای کلید Linux و ارائه اطلاعات درباره آن‌ها به‌عنوان بخشی از رویدادهای EV_KEY هستند.

«میانای برنامه‌سازی کاربردی Android» گاهی اوقات به کد کلید Linux مرتبط با یک کلید به‌عنوان «کد اسکن» آن اشاره می‌کند. این مورد ازنظر فنی در نادرست است اما به تشخیص کدهای کلید Linux از کدهای کلید Android در میانای برنامه‌سازی کاربردی کمک می‌کند.

کد محور مطلق یا نسبی Linux

کد محور مطلق یا نسبی Linux شناسه‌ای استاندارد برای گزارش کردن حرکت‌های نسبی یا موقعیت‌های مطلق درطول یک محور است، مثل حرکت‌های نسبی موشواره درطول محور X آن یا موقعیت مطلق دسته بازی درطول محور X آن. کد محور Linux در فایل سرایند linux/input.h بااستفاده از ثابت‌هایی که با پیشوند REL_ یا ABS_ شروع می‌شوند تعریف شده است. درایورهای ورودی هسته Linux مسئول ترجمه کاربردهای HID و دیگر سیگنال‌های مختص دستگاه به کدهای محور Linux و ارائه اطلاعات درباره آن‌ها به‌عنوان بخشی از رویدادهای EV_REL و EV_ABS هستند.

کد تعویض Linux

کد سوئیچ Linux یک شناسه استاندارد برای گزارش وضعیت سوئیچ در دستگاه است، مثل سوئیچ درپوش. کدهای سوئیچ Linux در فایل سرایند linux/input.h بااستفاده از ثابت‌هایی که با پیشوند SW_ شروع می‌شوند تعریف شده‌اند. درایورهای ورودی هسته Linux تغییرات وضعیت کلید را به‌عنوان رویدادهای EV_SW گزارش می‌کنند.

برنامه‌های Android معمولاً رویدادها را از کلیدها دریافت نمی‌کنند، اما سیستم ممکن است از آن‌ها به‌طور داخلی برای کنترل عملکردهای مختلف مختص دستگاه استفاده کند.

کد کلید Android

کد کلید Android یک شناسه استاندارد است که در Android API برای نشان دادن کلید خاصی مثل «HOME» تعریف شده است. کدهای کلید Android توسط کلاس android.view.KeyEvent به‌عنوان ثابت‌هایی که با پیشوند KEYCODE_ شروع می‌شوند تعریف می‌شوند.

جانمایی کلید مشخص می‌کند که کدهای کلید Linux چگونه به کدهای کلید Android نگاشت می‌شوند. بسته به مدل صفحه‌کلید، زبان، کشور، چیدمان، یا عملکردهای ویژه، ممکن است از چیدمان‌های کلید متفاوتی استفاده شود.

ترکیب‌های کد کلید Android بااستفاده از نقشه نویسه کلید مختص دستگاه و منطقه زبانی به کدهای نویسه تبدیل می‌شوند. برای مثال، وقتی کلیدهای شناسایی‌شده به‌عنوان KEYCODE_SHIFT و KEYCODE_A باهم فشار داده می‌شوند، سیستم ترکیب را در نقشه نویسه کلید جستجو می‌کند و حرف بزرگ «A» را پیدا می‌کند، که سپس در ابزارک نوشتاری که درحال‌حاضر در آن تمرکز شده است درج می‌شود.

کد محور Android

کد محور Android شناسه استانداردی است که در Android API برای نشان دادن محور دستگاه خاصی تعریف شده است. کدهای محور Android توسط کلاس android.view.MotionEvent به‌عنوان ثابت‌هایی که با پیشوند AXIS_ شروع می‌شوند تعریف می‌شوند.

چیدمان کلید مشخص می‌کند که «کدهای محور Linux» چگونه به کدهای محور Android نگاشت می‌شوند. بسته به مدل دستگاه، زبان، کشور، چیدمان، یا عملکردهای ویژه، ممکن است از چیدمان‌های کلید متفاوتی استفاده شود.

Android Meta State

وضعیت فراداده Android یک شناسه استاندارد است که در Android API برای نشان دادن اینکه کدام کلیدهای اصلاح‌گر فشرده شده‌اند تعریف شده است. وضعیت‌های فراداده 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. اطلاعات HID، ازجمله جدول‌های استفاده از HID