חיישנים Multi-HAL

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

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

עבור מכשירים המריצים אנדרואיד 13 ומעלה המשתמשים ב- Sensers AIDL HAL , ניתן להשתמש בשכבת ה-Multi-HAL shim כדי לאפשר יכולת Multi-HAL. לפרטי יישום, ראה שימוש בחיישנים Multi-HAL עם חיישנים AIDL HAL .

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

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

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

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

ההבדל העיקרי בין חיישנים Multi-HAL 2 לחיישנים HAL 2 הוא בפונקציות האתחול. במקום לספק FMQs, ממשק IHalProxyCallback מספק שתי שיטות, שיטה אחת לפרסום אירועי חיישנים למסגרת החיישנים ושיטה אחת ליצירת נעילות השכמה. מתחת למכסה המנוע, ה-Sensors Multi-HAL מנהל את כל האינטראקציות עם ה-FMQs כדי להבטיח אספקה ​​בזמן של אירועי חיישנים עבור כל תת-HALs. מומלץ מאוד שתתי-HAL ישתמשו בשיטת createScopedWakelock כדי להאציל את הנטל של זמן קצוב נעילות ערות ל-Sensors Multi-HAL ולרכז את השימוש ב-Wke Lock ל-Wke Lock משותף אחד עבור כל חיישני Multi-HAL, מה שממזער את הנעילה והפתיחה. שיחות.

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

יישום קוד מקור והפניה

קוד Multi-HAL של כל החיישנים זמין hardware/interfaces/sensors/common/default/2.X/multihal/ . להלן הנחיות לכמה משאבים.

  • HalProxy.h : אובייקט HalProxy מופעל על ידי חיישנים multi-HAL ומטפל בהעברת נתונים מתתי-HAL למסגרת החיישנים.
  • HalProxy.cpp : ההטמעה של HalProxy מכילה את כל ההיגיון הדרוש לריבוי תקשורת בין תת-HALs למסגרת החיישנים.
  • SubHal.h : ממשק ISensorsSubHal מגדיר את הממשק שעליו תתי-HAL לעקוב כדי להיות תואמים ל- HalProxy . תת-HAL מיישם את שיטת האתחול כך שניתן להשתמש באובייקט 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/ : יישום תת-HAL לדוגמה זה משתמש בחיישנים מזויפים כדי ליצור נתונים מזויפים. שימושי לבדיקת האופן שבו מספר תת-HALs מתקשרים במכשיר.

יישום

סעיף זה מתאר כיצד ליישם חיישנים Multi-HAL במצבים הבאים:

השתמש בחיישנים Multi-HAL עם חיישנים AIDL HAL

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

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

יישום חיישנים 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 שלך.

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

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

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

בעת שדרוג ל-Sensers Multi-HAL 2.0 מ- Sensors HAL 2.0 , ודא שהטמעת HAL עומדת בדרישות הבאות.

אתחול ה-HAL

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

פרסם אירועי חיישן למימוש Multi-HAL

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

אירועי WAKE_UP

בסנסורים HAL 2.0, ה-HAL יכול לנהל את נעילת ההתעוררות לצורך יישומו. ב-Sensers Multi-HAL 2.0, תת-HALs מאפשרים למימוש Multi-HAL לנהל נעילות השכמה ויכולים לבקש רכישת נעילת ערה על ידי הפעלת createScopedWakelock . יש לרכוש נעילת wake locked בהיקף נעול ולהעביר אותו ל- postEvents בעת פרסום אירועי השכמה למימוש Multi-HAL.

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

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

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

בעת שדרוג ל-Sensers Multi-HAL 2.0 מ- Sensors HAL 1.0 , ודא שהטמעת HAL עומדת בדרישות הבאות.

אתחול ה-HAL

יש לתמוך בפונקציה initialize() כדי ליצור את ההתקשרות בין תת-HAL ליישום Multi-HAL.

חשוף חיישנים זמינים

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

פרסם אירועי חיישן למימוש Multi-HAL

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

אירועי WAKE_UP

בסנסורים HAL 1.0, ה-HAL יכול לנהל את נעילת ההתעוררות לצורך יישומו. ב-Sensors Multi-HAL 2.0, תת-HALs מאפשרים למימוש Multi-HAL לנהל נעילות ערה ויכולים לבקש רכישת נעילת ערה על ידי הפעלת createScopedWakelock . יש לרכוש נעילת wake locked בהיקף נעול ולהעביר אותו ל- postEvents בעת פרסום אירועי השכמה למימוש Multi-HAL.

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

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

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

כדי להעביר מימוש קיים מ- Sensers 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. תת-HAL של יציאות כמתואר ב- Porting from Sensors Hal 1.0 .
  4. הגדר את חיישנים Multi-HAL 2.0 כ-HAL המיועד על ידי ביצוע שלבים 3 ו-4 בסעיף יישום חיישנים Mutli-HAL 2.0 .

מַתַן תוֹקֵף

הפעל את VTS

כאשר שילבת תת-HAL אחד או יותר עם Sensors 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

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

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

הפעל בדיקות יחידה

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

כדי להפעיל את הבדיקות, בצע את הפקודות הבאות:

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

בדוק עם תתי-HAL מזויפים

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

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

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

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

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

    $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 hals.conf עם הנתיבים של תת-HAL מזויפים.

    /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 וטען את תת-ה-HALs החדשים הרשומים בתצורה.

    adb shell stop
    adb shell start
    

איתור באגים

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

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

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

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 מועבר לכל תת-HAL ולכן על המפתחים ליישם את שיטת ניפוי הבאגים כחלק מממשק ISensorsSubHal .