مستشعرات متعددة طبقة تجريد الأجهزة (HAL)

إن أجهزة الاستشعار المتعددة HAL هي إطار عمل يتيح للمستشعرات تشغيل مستويات HALs جنبًا إلى جنب مع وغيرها من طبقات HALs للمستشعر. تحمّل أجهزة الاستشعار المتعددة HAL بشكل ديناميكي مستويات أدنى من البث المباشر للاستشعار (HALs). المخزنة كمكتبات ديناميكية في قسم المورد وتطلب معاودة الاتصال يمكنه التعامل مع نشر الأحداث والحصول على قفل التنشيط وتحريره. إن سطح HAL للمستشعر هو عبارة عن طبقة تجريد الأجهزة (HAL) للمستشعرات مدمجة في كائن مشترك على قسم البائع ويتم استخدامه بواسطة إطار عمل HAL متعدد. لا تتم تصفية HALs الفرعية هذه تعتمد على بعضها البعض أو على رمز HAL المتعدد الذي يحتوي على الوظيفة الرئيسية لهذه العملية.

تتوفّر أجهزة الاستشعار Multi-HAL 2.1 على الأجهزة التي تعمل بنظام التشغيل Android 11 أو أعلى، تكرار أجهزة الاستشعار Multi-HAL 2.0 التي تتيح تحميل HALs فرعية يمكنها كشف زاوية المفصّلة نوع جهاز الاستشعار. لإتاحة هذا النوع من أجهزة الاستشعار، يجب أن تستخدم "HALs" الفرعية واجهات برمجة التطبيقات التابعة لـ HAL. المحدد في 2.1 عنوان SubHal:

بالنسبة إلى الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو الإصدارات الأحدث والتي تستخدم لأجهزة استشعار AIDL HAL، يمكنك استخدام طبقة رقيقة متعددة القنوات (HAL) للسماح بإمكانية بروتوكول HAL متعددة. للاطّلاع على تفاصيل التنفيذ الرؤية استخدام أجهزة استشعار متعدّدة (HAL) مع واجهة AIDL HAL الخاصة بأجهزة الاستشعار

الفرق بين أجهزة الاستشعار Multi-HAL 2 وأجهزة الاستشعار HAL 2

تتوفّر أجهزة الاستشعار Multi-HAL 2 على الأجهزة التي تعمل بنظام التشغيل Android 10 أو أعلى، ويقدم عدة تجريدات أعلى الحساسات HAL 2 لتسهيل للتفاعل مع واجهات برمجة تطبيقات HAL. تقدّم أجهزة الاستشعار Multi-HAL 2 HalProxy معالجة تنفيذ واجهة أجهزة الاستشعار HAL 2 V2_1/SubHal (أو V2_0/SubHal) للسماح لـ HalProxy بالتفاعل مع HALs الفرعية.

تختلف الواجهة ISensorsSubHal عن واجهة 2.1/ISensors.hal (أو 2.0/ISensors.hal) بالطرق التالية:

  • تجتاز طريقة الإعداد IHalProxyCallback بدلاً من اثنين من FMQs وISensorsCallback.
  • يجب أن تنفذ "HALs" الفرعية دالة تصحيح أخطاء لتوفير تصحيح الأخطاء المعلومات في تقارير الأخطاء.
  • يجب أن تنفذ قناة HALs الفرعية دالة اسم بحيث يمكن تحميل دالة HAL الفرعية تمييزها عن الكائنات الفرعية الأخرى الموجودة في النطاق.

يكمن الاختلاف الرئيسي بين أجهزة الاستشعار Multi-HAL 2 وHAL 2 في لتهيئة الدوال. بدلاً من توفير أجهزة FMQ، يمكن لـ IHalProxyCallback توفير طريقتين، إحداهما لنشر أحداث المستشعر إلى أدوات الاستشعار وطريقة واحدة لإنشاء عمليات قفل التنشيط. الخيارات المتقدمة، تعمل أجهزة الاستشعار تدير إدارة متعددة القنوات (HAL) جميع التفاعلات مع FMQs لضمان تسليم أحداث الاستشعار لجميع الكائنات الفرعية HAL. وننصح بشدة بأن تستخدم الحسابات الفرعية (HALs) createScopedWakelock لتفويض عبء إنهاء قفل التنشيط إلى أجهزة الاستشعار Multi-HAL ووضع قفل التنشيط في مكان واحد لقفل تنشيط واحد لجميع أجهزة الاستشعار المتعددة HAL، ما يقلل من قفل المكالمات وفتح قفلها.

وتضم أجهزة الاستشعار Multi-HAL 2 أيضًا بعض ميزات الأمان المدمجة. يعالج الحالات التي تكون فيها أداة الاستشعار ممتلئًا أو يكون فيها إطار عمل أداة استشعار Android وإعادة التشغيل ويجب إعادة ضبط حالة جهاز الاستشعار. بالإضافة إلى ذلك، عندما تكون الأحداث التي يتم نشرها في الفئة HalProxy ولكن يتعذّر على إطار عمل أداة الاستشعار قبولها الأحداث فورًا، يمكن لأجهزة الاستشعار المتعددة HAL نقل الأحداث إلى خلفية للسماح بمتابعة العمل عبر جميع HALs الفرعية أثناء انتظار الأحداث التي سيتم نشرها.

تنفيذ رمز المصدر والمرجع

يتوفّر رمز جميع أجهزة الاستشعار المتعددة القنوات (HAL) في hardware/interfaces/sensors/common/default/2.X/multihal/ في ما يلي إرشادات لبعض الموارد.

  • HalProxy.h: يتم إنشاء مثيل للكائن HalProxy من خلال أجهزة استشعار متعددة القنوات (HAL) ويتعامل مع تمرير البيانات من الكائنات الفرعية المعالجة (HALs) إلى إطار عمل المستشعر.
  • HalProxy.cpp: يتضمن تنفيذ الدالة HalProxy جميع الأسباب المنطقية اللازمة الاتصال المتعدد بين الكائنات الفرعية HAL وإطار عمل أداة الاستشعار.
  • SubHal.h: تحدد الواجهة ISensorsSubHal الواجهة التي يجب أن تتوفر لها فئات HALs فرعية يجب متابعتها لتتوافق مع 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/: يستخدم هذا المثال لعمليات التنفيذ الفرعية للمواد الكيميائية أدوات استشعار وهمية لإنشاء البيانات. وهو مفيد لاختبار كيفية تفاعل عدة طبقات HALs على الجهاز.

التنفيذ

يوضّح هذا القسم كيفية تنفيذ أجهزة الاستشعار المتعددة HAL في ما يلي: الحالات:

استخدام أجهزة الاستشعار المتعددة HAL مع أداة الاستشعار AIDL HAL

للسماح بإمكانية بروتوكول HAL المتعددة باستخدام أجهزة الاستشعار AIDL HAL، يجب استيراد واجهة AIDL. وحدة طبقة الرقائق متعددة HAL، والموجودة في hardware/interfaces/sensors/aidl/default/multihal/: تتعامل الوحدة مع عملية التحويل بين تعريف HAL لمستشعرَي AIDL وHIDL. ويحدد برنامج تضمين لواجهة HAL المتعددة الموضحة في تطبيق أجهزة الاستشعار Multi-HAL 2.1: معيار AIDL متعدد المستويات تتوافق طبقة شيم مع الأجهزة التي تطبق أدوات الاستشعار Multi-HAL 2.1.

تسمح لك طبقة الرقائق متعددة الفلاتر (HAL) من AIDL لكشف جهاز تتبع الرأس أنواع مستشعرات 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 وإعادة تجميع طبقة HAL الفرعية.

في ما يلي الاختلافات بين واجهتي الإصدار 2.0 و2.1 SubHal:

  • يستخدم IHalProxyCallback الأنواع التي تم إنشاؤها في الإصدار 2.1 من مواصفات ISensors.hal
  • تستخدم الدالة initialize() علامة IHalProxyCallback بدلاً من الإصدار من واجهة SubHal التي تعمل بالإصدار 2.0
  • يجب أن يتم تنفيذ "HALs" فرعية: getSensorsList_2_1 وinjectSensorData_2_1 بدلاً من getSensorsList وinjectSensorData حيث إن هاتين الطريقتين تستخدمان الأنواع الجديدة المضافة في الإصدار 2.1 من مواصفات ISensors.hal.
  • يجب أن تعرض الحسابات الفرعية (HALs) sensorsHalGetSubHal_2_1 بدلاً من sensorsHalGetSubHal لـ Multi-HAL لمعاملتها باعتبارها الإصدار 2.1 HALs فرعية.

منفذ من أجهزة الاستشعار HAL 2.0

عند الترقية إلى أجهزة الاستشعار Multi-HAL 2.0 من Sensors Multi-HAL 2.0 2.0، تأكد من HAL التنفيذ يلبي المتطلبات التالية.

تهيئة HAL

تتضمن أجهزة الاستشعار HAL 2.0 وظيفة تهيئة تتيح لخدمة الاستشعار لتمرير FMQs واستدعاء جهاز الاستشعار الديناميكي. في المستشعرات Multi-HAL 2.0، تمرر الدالة initialize() استدعاءً واحدًا يجب استخدامه للنشر أحداث أداة الاستشعار، والحصول على عمليات قفل التنشيط، والإشعار باتصال أداة الاستشعار الديناميكية انقطاع الاتصال.

نشر أحداث أداة الاستشعار في التنفيذ المتعدد المستويات (HAL)

بدلاً من نشر أحداث أداة الاستشعار من خلال FMQ، يجب أن تكتب HAL الفرعية أداة استشعار الأحداث إلى IHalProxyCallback عند توفّر أحداث خاصة بأداة الاستشعار.

أحداث WAKE_UP

في أجهزة الاستشعار HAL 2.0، يمكن لـ HAL إدارة قفل التنشيط لتنفيذه. ضِمن أجهزة الاستشعار Multi-HAL 2.0، تتيح تطبيق HAL-HAL الفرعي ما يلي: إدارة عمليات قفل التنشيط ويمكن أن تطلب الحصول على قفل التنشيط من خلال الاستدعاء createScopedWakelock يجب الحصول على قفل تنشيط مُقفَل النطاق وتمريره إلى postEvents عند ذلك. نشر أحداث الاستيقاظ في تنفيذ بروتوكول HAL المتعدد.

أدوات الاستشعار الديناميكية

تتطلب أجهزة الاستشعار Multi-HAL 2.0 أن يكون onDynamicSensorsConnected onDynamicSensorsDisconnected بوصة IHalProxyCallback تسمى متى تغيرت توصيلات أداة الاستشعار الديناميكية. عمليات معاودة الاتصال هذه متاحة كجزء من مؤشر IHalProxyCallback الذي يتم تقديمه من خلال الدالة initialize().

منفذ من أجهزة الاستشعار HAL 1.0

عند الترقية إلى أجهزة الاستشعار Multi-HAL 2.0 من Sensors Multi-HAL 2.0 1.0، تأكد من وجود HAL التنفيذ يلبي المتطلبات التالية.

تهيئة HAL

يجب أن تكون الدالة initialize() متوافقة لإنشاء عملية معاودة الاتصال بين تنفيذ طبقة تجريد الأجهزة (HAL) الفرعية وHAL المتعددة.

عرض أجهزة الاستشعار المتاحة

في أجهزة الاستشعار Multi-HAL 2.0، يجب أن تعرض الدالة getSensorsList() القيمة نفسها خلال عملية تشغيل جهاز واحد، حتى في عمليات إعادة تشغيل طبقة تجريد الأجهزة (HAL) في المستشعرات. هذا يسمح إطار العمل لمحاولة إعادة إنشاء اتصالات جهاز الاستشعار إذا كان خادم النظام تتم إعادة تشغيله. يمكن أن تتغيّر القيمة التي يعرضها getSensorsList() بعد تشغيل الجهاز. إعادة تشغيل الجهاز.

نشر أحداث أداة الاستشعار في التنفيذ المتعدد المستويات (HAL)

أمّا في أجهزة الاستشعار HAL 2.0، فبدلاً من الانتظار حتى يتم طلب poll()، كتابة أحداث أداة الاستشعار بشكل استباقي IHalProxyCallback متى توفرت أحداث المستشعر.

أحداث WAKE_UP

في أجهزة الاستشعار HAL 1.0، يمكن لـ HAL إدارة قفل التنشيط لتنفيذه. ضِمن أجهزة استشعار Multi-HAL 2.0، وهي الأجهزة الفرعية HALs التي تسمح بتنفيذ مستويات HAL متعددة إدارة عمليات قفل التنشيط ويمكن أن تطلب الحصول على قفل التنشيط من خلال الاستدعاء createScopedWakelock يجب الحصول على قفل تنشيط مُقفَل النطاق وتمريره إلى postEvents عند ذلك. نشر أحداث الاستيقاظ في تنفيذ بروتوكول 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. منفذ HALs فرعيًا على النحو الموضَّح في نقل البيانات من أجهزة الاستشعار هال الإصدار 1.0
  4. اضبط أجهزة الاستشعار Multi-HAL 2.0 على أنها HAL (HAL) محددة باتّباع الخطوتَين 3 و 4 في القسم تنفيذ أجهزة الاستشعار Mutli-HAL 2.0.

التحقُّق

تشغيل أداة VTS

وعند دمج واحدة أو أكثر من أجهزة HALs الفرعية مع أجهزة الاستشعار Multi-Hal 2.1، استخدام حزمة اختبار المورّد (VTS) للتأكّد من أنّ الحزمة الفرعية تلبي عمليات التنفيذ جميع المتطلبات التي تحدّدها واجهة 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، شغِّل VtsAidlHalSensorsTargetTest.

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

إجراء اختبارات الوحدة

تختبر الوحدة في اختبار HalProxy_test.cpp HalProxy باستخدام درجات حرارة فرعية زائفة مزيفة يتم إنشاء مثيل لها في اختبار الوحدة ولا يتم تحميلها ديناميكيًا. عند إنشاء جديدة تحتية HAL، يجب أن تكون هذه الاختبارات بمثابة دليل حول كيفية إضافة اختبارات الوحدات التي التحقق من تنفيذ عملية HAL الفرعية الجديدة بشكل صحيح.

لإجراء الاختبارات، نفِّذ الأوامر التالية:

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

إجراء الاختبارات باستخدام طبقات HAL الفرعية الزائفة

إن HALs الفرعية المزيفة هي عمليات تنفيذ وهمية لواجهة ISensorsSubHal. تكشف درجات الحرارة الفرعية (HALs) عن قوائم مختلفة من المستشعرات. عندما يتم تشغيل أجهزة الاستشعار، يتم بشكل دوري نشر أحداث أجهزة الاستشعار التي يتم إنشاؤها تلقائيًا على HalProxy بناءً على الفواصل الزمنية المحددة في طلب جهاز استشعار معين.

يمكن استخدام طبقات HALs الفرعية الزائفة لاختبار كيفية عمل رمز Multi-HAL الكامل مع هي نطاقات HALs الأخرى المحملة في النظام وللتركيز على الجوانب المختلفة رمز أجهزة استشعار Multi-HAL

يتوفّر خياران زائفان من HALs في hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/

لإنشاء قنوات HALs فرعية مزيفة ودفعها إلى جهاز، اتخذ الخطوات التالية:

  1. شغِّل الأوامر التالية لإنشاء الطلبات الزائفة الثلاثة المختلفة وإرسالها. HALs فرعية إلى الجهاز:

    $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 الفرعية المزيفة.

    /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.