پیاده سازی 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 برای انجام عملیات 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 مخصوص دستگاه مورد نیاز باشد.