קלט

סמל Android Input HAL

מערכת המשנה של הקלט ב-Android מורכבת באופן רשמי צינור עיבוד נתונים של אירועים, שעובר דרך כמה שכבות של המערכת.

צינור עיבוד נתונים לקלט

בשכבה הנמוכה ביותר, מכשיר הקלט הפיזי יוצר אותות שמתארים שינויים במצב, כמו הקשות על מקשים ונקודות מגע. קושחת המכשיר מקודדת את האותות האלה ומעבירה אותם בדרך כלשהי, למשל על ידי שליחת דוחות USB HID למערכת או על ידי יצירת הפסקות (interrupts) באוטובוס I2C.

לאחר מכן, מנהל ההתקן של המכשיר ב-Linux מבצע פענוח של האותות. ליבת Linux מספקת מנהלי התקנים למכשירי קצה סטנדרטיים רבים, במיוחד למכשירים שתואמים לפרוטוקול HID. עם זאת, לעיתים קרובות יצרן ציוד מקורי צריך לספק מנהלי התקנים מותאמים אישית למכשירים מוטמעים שמשולבים היטב במערכת ברמה נמוכה, כמו מסכי מגע.

מנהלי ההתקנים של קלט אחראים לתרגם אותות ספציפיים למכשיר לפורמט אירוע קלט רגיל, באמצעות פרוטוקול הקלט של Linux. פרוטוקול הקלט של Linux מגדיר קבוצה רגילה של סוגי אירועים וקודים בקובץ הכותרת linux/input.h של הליבה. כך, רכיבים מחוץ לליבה לא צריכים לדאוג לפרטים כמו קודי סריקה פיזיים, שימושים ב-HID, הודעות I2C, פינים של GPIO וכו'.

לאחר מכן, הרכיב EventHub של Android קורא אירועי קלט מהליבה על ידי פתיחת מנהל ההתקן 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 Usages או קודי מפתחות של Linux.

קודי סריקה מעניינים בעיקר מקלדות. בדרך כלל, מכשירים אחרים מתקשרים ברמה נמוכה באמצעות פינים של GPIO, הודעות I2C או אמצעים אחרים. כתוצאה מכך, השכבות העליונות של סטאק התוכנה מסתמכות על מנהלי ההתקנים כדי להבין מה קורה.

שימוש ב-HID

שימוש ב-HID הוא מזהה רגיל שמשמש לדיווח על המצב של אמצעי בקרה, כמו מקש במקלדת, ציר של ג'ויסטיק, לחצן בעכבר או נקודת מגע במסך מגע. רוב מכשירי הקלט מסוג USB ו-Bluetooth תואמים למפרט HID, שמאפשר למערכת לתקשר איתם באופן אחיד.

Android Framework מסתמך על מנהלי ה-HID של ליבה של Linux כדי לתרגם קודי שימוש ב-HID למפתחות של Linux ולמזהים אחרים. לכן, שימושים ב-HID מעניינים בעיקר יצרני ציוד היקפי.

קוד מפתח ל-Linux

קוד מקש ב-Linux הוא מזהה סטנדרטי למקש או לכפתור. קודי המפתחות של Linux מוגדרים בקובץ הכותרת linux/input.h באמצעות קבועים שמתחילים בקידומת KEY_ או BTN_. מנהלי הקלט של ליבה של Linux אחראים לתרגם קודי סריקה פיזיים, שימושים ב-HID וסימנים אחרים ספציפיים למכשיר לקודי מפתחות של Linux, ולספק מידע עליהם כחלק מאירועי EV_KEY.

לפעמים, ב-Android API קוד המפתח ב-Linux שמשויך למפתח נקרא 'קוד הסריקה'. מבחינה טכנית, זה לא נכון, אבל זה עוזר להבדיל בין קודי מפתחות של Linux לבין קודי מפתחות של Android ב-API.

קוד ציר יחסי או מוחלט ב-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 כדי לציין מפתח מסוים, כמו 'דף הבית'. קודי המפתחות של Android מוגדרים על ידי הכיתה android.view.KeyEvent כקבועים שמתחילים בקידומת KEYCODE_.

פריסת המפתחות קובעת איך מקשי Linux ממופים למפתחות Android. יכול להיות שייעשה שימוש בפריסות מקשים שונות בהתאם לדגם המקלדת, לשפה, למדינה, לפריסה או לפונקציות המיוחדות.

שילובים של קודי מפתחות של Android הופכים לקודי תווים באמצעות מפה של תווים של מפתחות ספציפיים למכשיר ולשפה. לדוגמה, כשמקישים בו-זמנית על המקשים KEYCODE_SHIFT ו-KEYCODE_A, המערכת מחפשת את השילוב במפת התווים של המקש ומוצאת את האות הגדולה 'A', שמוחדרת לאחר מכן לווידג'ט הטקסט שבו מופיע המיקוד.

Android Axis Code

קוד ציר של 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