חיישנים עם מולטי HAL

פרוטוקול 'חיישנים מרובי-HAL' הוא מסגרת שמאפשרת לחיישן HAL לרוץ לצד ערכי HAL של חיישנים אחרים. באמצעות חיישן Multi-HAL נטען באופן דינמי חיישנים משניים של חיישנים מאוחסנים כספריות דינמיות במחיצת הספק ונותנים להן קריאה חוזרת אובייקט שיכול לטפל בפרסום אירועים, לקבל ולבטל את חסימת מצב השינה. רכיב משנה של חיישנים הוא HAL של חיישן שמובנה באובייקט משותף של ספק מסוים, והוא נמצא בשימוש של מסגרת multi-HAL. תהליכי המשנה האלה לא תלויים זה בזה או בקוד מרובה HAL שמכיל את הפונקציה הראשית לתהליך.

חיישנים Multi-HAL 2.1, זמינים במכשירים עם מערכת Android 11 ומעלה, הוא איטרציה של חיישנים Multi-HAL 2.0 שתומך בטעינת תתי-HALs לחשוף את זווית הציר סוג החיישן. כדי לתמוך בסוג החיישן הזה, רכיבי משנה של HAL צריכים להשתמש בממשקי Sub-HAL API מוגדר בתוך 2.1 כותרת SubHal.

למכשירים עם Android מגרסה 13 ומעלה שנעשה בהם שימוש אפשר להשתמש ב-Sensors AIDL HAL שכבת shim במספר HAL כדי לאפשר יכולת ריבוי HAL. לפרטים על ההטמעה: לראות שימוש בחיישנים מסוג Multi-HAL עם החיישנים AIDL HAL.

ההבדל בין חיישנים Multi-HAL 2 לחיישנים HAL 2

חיישנים Multi-HAL 2, זמינים במכשירים עם מערכת Android 10 ומעלה, מציג כמה פשטות בנוסף לחיישן HAL של חיישנים 2 שיהיה לכם קל יותר לאינטראקציה עם ממשקי API עם HAL. התכונה 'חיישנים Multi-HAL 2' מציגה שרת ה-HalProxy לטיפול בהטמעה של ממשק החיישנים HAL 2 V2_1/SubHal (או V2_0/SubHal) שמאפשר ל-HalProxy לקיים אינטראקציה עם רכיבי משנה של HAL.

הממשק של ISensorsSubHal שונה 2.1/ISensors.hal (או 2.0/ISensors.hal) משתמש בדרכים הבאות:

  • שיטת האתחול מעבירה IHalProxyCallback במקום שני FMQ ו-ISensorsCallback.
  • רכיבי Sub-HAL חייבים להטמיע פונקציית ניפוי באגים לניפוי באגים מידע בדוחות איתור באגים.
  • רכיבי Sub-HAL חייבים להטמיע פונקציית שם, כדי שאפשר יהיה לטעון את תת-ה-HAL להבדיל מ-HALs אחרים.

ההבדל העיקרי בין חיישנים Multi-HAL 2 לחיישנים HAL 2 הוא לאתחל פונקציות. במקום לספק קטעי FMQ, IHalProxyCallback הממשק מספק שתי שיטות – אחת לפרסום אירועי חיישנים בחיישנים ושיטה אחת ליצירת חסימות מצב שינה. מתחת למכסה החיישנים, פרוטוקול Multi-HAL מנהל את כל האינטראקציות עם ערוצי ה-FMQ כדי להבטיח אספקה מהירה של אירועי חיישנים בכל תתי-HAL. מומלץ מאוד שכלי משנה ל-HAL ישתמשו שיטה createScopedWakelock להאציל את הנטל של תזמון חסימות מצב שינה אל באמצעות החיישנים עם מולטי HAL, וניתן לרכז את השימוש בחסימות מצב שינה באמצעות התכונה 'נעילת מצב שינה' משותפת לחיישן Multi-HAL כולו, שמצמצם שיחות נעילה וביטול נעילה.

לחיישן Multi-HAL 2 יש גם כמה תכונות בטיחות מובנות. הוא מטפל מצבים שבהם החיישן FMQ מלא או מסגרת של חיישן Android מופעלת מחדש וצריך לאפס את מצב החיישן. בנוסף, כשהאירועים פורסמה בכיתה HalProxy, אבל מסגרת החיישן לא יכולה לקבל את האירועים באופן מיידי, באמצעות החיישנים Multi-HAL יש אפשרות להעביר את האירועים לרקע כדי לאפשר לעבודה להמשיך בכל משימות המשנה במהלך המתנה אירועים שיתפרסמו.

הטמעת קוד מקור והפניות

קוד מרובה HAL של כל החיישנים זמין hardware/interfaces/sensors/common/default/2.X/multihal/ בהמשך מופיעות כמה קישורים למקורות מידע.

  • HalProxy.h: האובייקט HalProxy נוצר באמצעות חיישנים מרובי-HAL ומטפל העברת נתונים מתת-ה-HAL למסגרת החיישן.
  • HalProxy.cpp: ההטמעה של HalProxy כוללת את כל הלוגיקה שנדרשת כדי תקשורת Multiplex בין תת-HAL למסגרת החיישן.
  • SubHal.h: הממשק ISensorsSubHal מגדיר את הממשק שדפי משנה חייבים עוקבים כדי להתאים ל-HalProxy. פרוטוקול המשנה HAL מיישם את מתחילה את ה-method כדי שיהיה אפשר להשתמש באובייקט HalProxyCallback בשביל postEvents וגם createScopedWakelock

    להטמעות של Multi-HAL 2.0, צריך להשתמש בגרסה 2.0 של SubHal.h

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/: בדיקות היחידה האלה מאמתות את ההטמעה של HalProxy.

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/: בדוגמה הזו להטמעה של Sub-HAL נעשה שימוש בחיישנים מזויפים כדי ליצור . שימושי לבדיקת האינטראקציה של מספר תתי-פלטפורמות של HAL במכשיר.

הטמעה

בקטע הזה מתואר איך להטמיע חיישנים Multi-HAL בסעיפים הבאים מצבים:

שימוש בחיישנים עם מולטי HAL עם חיישנים AIDL HAL

כדי לאפשר יכולות מרובות HAL עם החיישנים AIDL HAL, צריך לייבא את הפונקציה AIDL מודול שכבת shim מרובה-HAL, שנמצא hardware/interfaces/sensors/aidl/default/multihal/. המודול מטפל בהמרה שבין חיישני AIDL להגדרת HAL של חיישני HAL ומגדיר wrapper במסגרת ממשק ריבוי HAL שמתואר הטמעת חיישנים Multi-HAL 2.1. מודל HAL מרובה AIDL שכבת ה-shim תואמת למכשירים שמוטמעים בהם חיישנים Multi-HAL 2.1.

שכבת AIDL Multi-HAL shim מאפשרת לחשוף את מכשיר המעקב אחר ראש סוגי חיישנים של IMU עם ציר מוגבל בחיישנים AIDL HAL. כדי להשתמש בחיישנים האלה שמוגדרים על ידי ממשק AIDL HAL, מגדירים את השדה type מבני SensorInfo בהטמעה של getSensorsList_2_1(). זה בטוח כי השדות של סוג החיישן עם גיבוי שלם של חיישני AIDL ו-HIDL לא חופפות.

הטמעת חיישנים עם Multi-HAL 2.1

כדי להטמיע את החיישנים Multi-HAL 2.1 במכשיר חדש:

  1. הטמעת הממשק של ISensorsSubHal כפי שמתואר ב SubHal.h.
  2. ליישם את sensorsHalGetSubHal_2_1 ב-SubHal.h.
  3. צריך להוסיף יעד cc_library_shared כדי ליצור את תת-ה-HAL החדש שהוטמע. כשמוסיפים את היעד:

    1. מוודאים שהיעד נדחף למקום כלשהו בספק למחיצה של המכשיר.
    2. בקובץ התצורה שנמצא בכתובת /vendor/etc/sensors/hals.conf, להוסיף את הנתיב לספרייה בשורה חדשה. אם יש צורך, יוצרים את התחילית קובץ hals.conf.

    לרשומת Android.bp לדוגמה עבור בניית ספריית משנה HAL, ראה hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp.

  4. יש להסיר את כל android.hardware.sensors הרשומות מ manifest.xml שמכיל את רשימת ה-HALs הנתמכים במכשיר.

  5. הסרת כל שירות android.hardware.sensors ו-service.rc קבצים מ- את הקובץ device.mk ומוסיפים את android.hardware.sensors@2.1-service.multihal ו-android.hardware.sensors@2.1-service.multihal.rc עד PRODUCT_PACKAGES.

בזמן האתחול, HalProxy מתחיל, מחפש את תת-ה-HAL החדש שהוטמע, מאתחל אותו באמצעות קריאה sensorsHalGetSubHal_2_1.

יציאה מחיישנים Multi-HAL 2.0 ל-Multi-HAL 2.1

כדי לצאת מגרסת Multi-HAL 2.0 ל-Multi-HAL 2.1, יש להטמיע את SubHal ולתכנת מחדש את ה-Sub-HAL.

אלה ההבדלים בין הממשק של SubHal בגרסה 2.0 ובגרסה 2.1:

  • IHalProxyCallback משתמש בסוגים שנוצרו ב גרסה 2.1 של המפרט של ISensors.hal.
  • הפונקציה initialize() מעבירה ערך IHalProxyCallback במקום זה מהממשק של SubHal 2.0
  • רכיבי Sub-HAL חייבים להטמיע את getSensorsList_2_1 ואת injectSensorData_2_1 במקום ב-getSensorsList וב-injectSensorData, כי השיטות האלה עושות שימוש הסוגים החדשים שנוספו בגרסה 2.1 של המפרט ISensors.hal.
  • רכיבי Sub-HAL חייבים לחשוף את sensorsHalGetSubHal_2_1 במקום sensorsHalGetSubHal ל-Multi-HAL כדי להתייחס אליהם כמו לגרסה 2.1 תמיכה ב-HAL.

יציאה מחיישנים HAL 2.0

כשמשדרגים לחיישן Multi-HAL 2.0 מ-Sensors HAL 2.0, יש לוודא שתקן HAL שעומד בדרישות הבאות.

אתחול HAL

לחיישנים HAL 2.0 יש פונקציה אתחול שמאפשרת לשירות החיישן העברת אותות FMQ וקריאה חוזרת (callback) של חיישן דינמי. ב-Sensors Multi-HAL 2.0, הפונקציה initialize() מעבירה קריאה חוזרת אחת (callback) שצריך להשתמש בה כדי לפרסם אירועי חיישנים, קבלת חסימות מצב שינה, והתראה על חיבור חיישן דינמי בזמן ניתוקים.

פרסום אירועים של חיישנים בהטמעת Multi-HAL

במקום לפרסם אירועי חיישנים דרך ה-FMQ, רכיב ה-Sub-HAL חייב לכתוב חיישן אירועים IHalProxyCallback כשאירועי חיישנים זמינים.

אירועי WAKE_UP

בחיישן HAL 2.0, טכנולוגיית HAL יכולה לנהל את התכונה 'נעילת מצב שינה' לצורך הטמעה. לחשבון באמצעות חיישנים Multi-HAL 2.0, תתי-ה-HAL מאפשרים להטמעה של Multi-HAL לנהל חסימות מצב שינה ולבקש נעילת מצב שינה על ידי הפעלה createScopedWakelock יש לרכוש חסימת מצב שינה בהיקף נעול ולהעביר אותה אל postEvents כאשר פרסום אירועי יציאה ממצב שינה בהטמעה של Multi-HAL.

חיישנים דינמיים

לחיישנים Multi-HAL 2.0 נדרשת התאמה של onDynamicSensorsConnected ושל onDynamicSensorsDisconnected אינץ' IHalProxyCallback מופעלות בכל פעם שחיבורי החיישנים הדינמיים משתנים. הקריאות החוזרות האלה זמין כחלק מהסמן IHalProxyCallback שמסופק את הפונקציה initialize().

יציאה מחיישנים HAL 1.0

כשמשדרגים לחיישן Multi-HAL 2.0 מ-Sensors HAL 1.0, יש לוודא שתקן HAL שעומד בדרישות הבאות.

אתחול HAL

צריך לתמוך בפונקציה initialize() כדי ליצור את הקריאה החוזרת (callback) הטמעת Sub-HAL והטמעת Multi-HAL.

חשיפת חיישנים זמינים

בחיישן Multi-HAL 2.0, הפונקציה getSensorsList() חייבת להחזיר את אותה ערך במהלך הפעלה יחידה של מכשיר, גם בין חיישנים של HAL בהפעלה מחדש. כך אפשר המסגרת בניסיון ליצור מחדש חיבורי חיישן, אם שרת המערכת מופעלת מחדש. הערך שמוחזר על ידי getSensorsList() יכול להשתנות אחרי שהמכשיר מבצע הפעלה מחדש.

פרסום אירועים של חיישנים בהטמעת Multi-HAL

בגרסה HAL 2.0 של החיישנים, במקום להמתין לקריאת poll(), אפשר לתת ל-Sub-HAL חייבים לכתוב באופן יזום אירועי חיישנים IHalProxyCallback בכל פעם שאירועי חיישן זמינים.

אירועי WAKE_UP

בגרסה HAL 1.0 של החיישנים, טכנולוגיית HAL יכולה לנהל את התכונה 'נעילת מצב שינה' לצורך הטמעה. לחשבון בעזרת חיישנים Multi-HAL 2.0, תת-הבית מאפשר הטמעת Multi-HAL לנהל חסימות מצב שינה ולבקש נעילת מצב שינה על ידי הפעלה createScopedWakelock יש לרכוש חסימת מצב שינה בהיקף נעול ולהעביר אותה אל postEvents כאשר פרסום אירועי יציאה ממצב שינה בהטמעה של Multi-HAL.

חיישנים דינמיים

בחיישן HAL 1.0, החיישנים הדינמיים מוחזרים דרך הפונקציה poll(). לחיישנים Multi-HAL 2.0 נדרשת התאמה של onDynamicSensorsConnected ושל onDynamicSensorsDisconnected אינץ' IHalProxyCallback מופעלות בכל פעם שחיבורי החיישנים הדינמיים משתנים. הקריאות החוזרות האלה זמין כחלק מהסמן IHalProxyCallback שמסופק את הפונקציה initialize().

יציאה מחיישנים Multi-HAL 1.0

כדי לנייד הטמעה קיימת מ: Sensors Multi-HAL 1.0, יש לבצע את השלבים הבאים.

  1. צריך לוודא שהגדרת ה-HAL של החיישנים ממוקמת ב /vendor/etc/sensors/hals.conf יכול להיות שתצטרכו להעביר את הקובץ שנמצא /system/etc/sensors/hals.conf.
  2. צריך להסיר את כל ההפניות אל hardware/hardware.h וגם hardware/sensors.h מכשירים כאלה לא נתמכים ב-HAL 2.0.
  3. שקעי משנה של יציאות כפי שמתואר במאמר ניוד מחיישנים עם האלר 1.0.
  4. מגדירים את החיישנים Multi-HAL 2.0 כ-HAL הייעודי. לשם כך צריך לבצע את השלבים 3 ו 4 בסעיף הטמעת חיישנים Mutli-HAL 2.0.

אימות

הפעלת VTS

אם אתם משלבים תת-HAL אחד או יותר עם חיישנים Multi-Hal 2.1. להשתמש בחבילת הבדיקה של הספק (VTS) כדי לוודא שגרסת המשנה HAL שלכם וההטמעות עומדות בכל הדרישות שנקבעו בממשק HAL של החיישנים.

כדי להריץ רק את בדיקות VTS של החיישנים כשמגדירים VTS במכונה מארחת: מריצים את הפקודות הבאות:

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_0Target && \
  vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_1Target

אם מפעילים את שכבת AIDL Multi-HAL shim, מריצים את VtsAidlHalSensorsTargetTest.

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsAidlHalSensorsTargetTest

הרצת בדיקות יחידה (unit testing)

היחידה שנבדקת בHalProxy_test.cpp בודקת את HalProxy באמצעות תתי-HAL מזויפים נוצרים בבדיקת היחידה ולא נטענות באופן דינמי. כשיוצרים בדיקות משנה חדשות כדי לוודא שגרסת המשנה החדשה של ה-HAL הוטמעה כראוי.

כדי להריץ את הבדיקות, מריצים את הפקודות הבאות:

cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest

בדיקה באמצעות תהליכי משנה מזויפים

דפי המשנה המזויפים הם יישומי דמה של הממשק של ISensorsSubHal. תתי-ה‐HAL חושפות רשימות שונות של חיישנים. כשהחיישנים מופעלים, הם מפרסמים מדי פעם אירועי חיישנים שנוצרו באופן אוטומטי ב-HalProxy מבוסס על המרווחים שמצוינים בבקשת חיישן נתונה.

אפשר להשתמש ב-Sub-HAL המזויפים כדי לבדוק איך קוד Multi-HAL המלא פועל עם תהליכי משנה אחרים שנטענות במערכת וכדי להדגיש היבטים שונים של קוד Multi-HAL מחיישנים.

שני תהליכי משנה מזויפים זמינים בכתובת hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/

כדי ליצור ולדחוף הודעות משנה מזויפות למכשיר, מבצעים את השלבים הבאים:

  1. מריצים את הפקודות הבאות כדי ליצור ולדחוף את שלושת הצורות המזויפות השונות השלמת פעולות משנה למכשיר:

    $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
    mma
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  2. עדכון הגדרת HAL של החיישנים ב-/vendor/etc/sensors/hals.conf עם את הנתיבים של תוכניות המשנה המזויפות.

    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  3. צריך להפעיל מחדש את HalProxy ולטעון את נושאי המשנה החדשים שמפורטים בהגדרה.

    adb shell stop
    adb shell start
    

ניפוי באגים

מפתחים יכולים לנפות באגים ב-framework באמצעות הפקודה lshal. כדי לבקש את בפלט ניפוי הבאגים של אפליקציית החיישנים HAL, מריצים את הפקודה הבאה:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

לאחר מכן המידע על המצב הנוכחי של HalProxy ו-HALs שלו פלט לטרמינל. למטה תוכלו לראות דוגמה לפלט של הפקודה אובייקט HalProxy ומזהי משנה מזויפים.

Internal values:
  Threads are running: true
  Wakelock timeout start time: 200 ms ago
  Wakelock timeout reset time: 73208 ms ago
  Wakelock ref count: 0
  # of events on pending write queue: 0
  # of non-dynamic sensors across all subhals: 8
  # of dynamic sensors across all subhals: 0
SubHals (2):
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2

אם המספר שצוין בשדה # of events on pending write queue הוא מספר גדול (1000 או יותר), זה מציין שיש אירועים רבים בהמתנה לכתיבה לחיישנים . הדבר מציין ששירות החיישן נמצא בנעילה או שהוא קרס, אינו מעבד אירועי חיישנים, או שקבוצה גדולה של אירועי חיישנים פורסם לאחרונה מגרסת משנה של HAL.

אם מספר הסימוכין לחסימות מצב שינה גדול מ-0, פירוש הדבר הוא של-HalProxy בוצעה נעילה של מצב שינה. הערך צריך להיות גדול מ-0 רק אם ScopedWakelock מתבצע במכוון, או אם אירועי התעוררות נשלחו אל HalProxy לא עבר עיבוד על ידי מסגרת החיישן.

מתאר הקובץ שמועבר לשיטת ניפוי הבאגים של HalProxy מועבר לכל אחד מהם Sub-HAL, כך שמפתחים צריכים להטמיע את שיטת ניפוי הבאגים כחלק ממשק ISensorsSubHal.