پیاده سازی USB HAL

نسخه اندروید 8.0 برای پیکربندی بهتر و قابلیت اطمینان کد، مدیریت دستورات USB را از اسکریپت‌های init و به یک شبح USB بومی منتقل می‌کند. برای پیکربندی عملکرد Gadget، از اسکریپت های init (محرک های ویژگی) برای انجام عملیات ابزار خاص دستگاه استفاده می شود.

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

  1. عملیاتی مانند نوشتن در نودهای sysfs هسته ممکن است شکست بخورد اما به کد فریمورک‌هایی که تریگر ویژگی را تنظیم می‌کند منتشر نشوند. در نتیجه، فریم‌ورک‌ها به اشتباه فرض می‌کنند که عملیات‌ها موفق بوده‌اند، حتی اگر در سکوت شکست خورده باشند.
  2. اسکریپت های init دارای تعداد محدودی عملیات هستند که می توانند اجرا شوند.

نسخه Android 12 پشتیبانی از گجت USB HAL را برای مدل‌های کنترل شبکه (NCM) و تماس‌های API اضافه می‌کند که هم شماره نسخه HAL و هم سرعت USB را برمی‌گرداند. برای اطلاعات بیشتر در مورد تماس‌های API موجود از طریق USB HAL، به خلاصه بسته android.hardware.usb مراجعه کنید.

HAL و Treble

اسکریپت های init دستگاه خاص به عنوان جایگزینی برای لایه های HAL برای انجام عملیات USB خاص دستگاه استفاده شد. USB (از طریق ADB) یک رابط اصلی برای اشکال زدایی مشکلات سیستم است. داشتن یک شبح بومی برای انجام پیکربندی USB، وابستگی به کد فریمورک را از بین می برد، بنابراین حتی اگر فریم ورک خراب شود، USB باید در حال اجرا باشد.

تحت مدل Treble که در اندروید 8.0 نیز معرفی شده است، همه HAL ها از سرویس های سیستم جدا هستند و باید در دیمون های بومی خود اجرا شوند. این امر نیاز به داشتن یک شبح USB انحصاری را از بین می برد زیرا لایه HAL به خوبی به عنوان یک شبح USB دو برابر می شود.

اجرای پیش‌فرض HAL از تمام دستگاه‌های پیش از اندروید 8.0 مراقبت می‌کند. بنابراین، برای دستگاه‌های پیش از اندروید 8.0 هیچ کار خاص دستگاه وجود نخواهد داشت. Android 8.0 از رابط HAL برای پرس و جو از وضعیت پورت‌های USB و انجام مبادله نقش داده و قدرت استفاده می‌کند.

پیاده سازی

رابط USB HAL جدید باید بر روی هر دستگاهی که در Android 8.0 راه اندازی می شود پیاده سازی شود. پیاده سازی پیش فرض باید از دستگاه های پیش از اندروید 8.0 مراقبت کند. اگر دستگاه از کلاس dual_role_usb برای گزارش وضعیت پورت type-c استفاده کند، اجرای پیش‌فرض کافی است. ممکن است برای انتقال مالکیت گره‌های typc-c به سیستم، تغییرات جزئی در اسکریپت‌های USB خاص دستگاه مورد نیاز باشد.