دليل التكامل لعبور USB لمحاكي

توضح هذه الصفحة كيفية توصيل جهازين طرفيين (Bluetooth وWi-Fi) بمحاكي AAOS. في هذه العملية، هناك ثلاثة مجالات خاصة بدعم السائق هي الأساسية:

  • نواة الضيف
  • ضيف أندرويد
  • مضيف لينكس

أولاً، عليك تجميع وتمكين برامج تشغيل USB ذات الصلة في Guest kernel. بعد ذلك، يجب على Guest Android تحديد HAL والخدمات المناسبة لإظهار برامج التشغيل. أخيرًا، يجب أن يتمكن مضيف Linux من الوصول إلى برنامج تشغيل USB ثم نقله إلى QEMU .

تم اختبار الدونجل

تم اختبار الدونجل التالي:

قد تعمل أجهزة دونجل أخرى، ولكن لم يتم اختبار أي أجهزة أخرى.

دعم USB الأصلي

يأتي QEMU مزودًا بخيارات لتمرير USB إلى المحاكي. تتعامل صورة نظام AAOS بالفعل مع هاتف متصل. للحصول على التفاصيل، راجع ملحق Android المفتوح (AOA) .

نظرًا لأن الهاتف يغير قيم vendorID ومعرف productID عند إنشاء اتصال AOA، فإن واجهة USB الجديدة (بالإضافة إلى واجهة USB الأصلية) ترى الجهاز عندما يكون الهاتف في وضع AOA.

لتحديد قيم vendorID ومعرف productID قبل وضع AOA وبعده، استخدم lsusb :

# Note Vendor ID and Product ID of your phone
$ lsusb
Bus 001 Device 079: ID 18d1:4ee1 Google Inc. Nexus/Pixel Device (MTP)
# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x4ee1 -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x2d00

وبدلاً من ذلك، قم بتمرير المنفذ الفعلي إلى QEMU:

# First plug something into the interested USB port and note the Bus and Device number.
$ lsusb
Bus 001 Device 012: ID 0bda:c820 Realtek Semiconductor Corp. 802.11ac NIC
# Now figure out where the Port number is.
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 4: Dev 12, If 1, Class=Wireless, Driver=btusb, 480M
    |__ Port 4: Dev 12, If 2, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 4: Dev 12, If 0, Class=Wireless, Driver=btusb, 480M
# Launch the emulator
 ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=1,hostport=4
# Now, whatever you plug into the emulator, USB passthrough will happen on the fly.

تتعرف صورة نظام AAOS على الهاتف، وتضعه في وضع AOA، وتتعرف عليه مرة أخرى عند تشغيل وضع AOA.

لدعم مرور USB، تأكد من أنك تستخدم Emulator 30.5.0 :

# Check for the emulator version
$ emulator --version

يتضمن Emulator 30.5.0 ترقية libusb وحل مؤقت لمعالجة توافق السرعة لدعم ASUS dongle:

دعم البلوتوث

لدعم مرور البلوتوث، قامت Google باختبار محول USB ASUS USB-BT400 USBBT400 ومحول USB Wi-Fi Bluetooth بواسطة Auscomer.

أولاً، تحتاج إلى إضافة دعم النواة للدونجل. لفهم حزمة Android Bluetooth، راجع Bluetooth . بالنسبة لـ HIDL، يستخدم المحاكي التنفيذ المحاكى. لذلك، قم بتبديل ذلك باستخدام تطبيق Linux الأصلي.

نواة الضيف

لدعم دونجل USB Bluetooth:

  1. أضف btusb.ko المفقود إلى النواة الخاصة بك:

    --- a/goldfish_defconfig.fragment
    +++ b/goldfish_defconfig.fragment
    @@ -1,6 +1,7 @@
     # CONFIG_CRYPTO_DEV_VIRTIO is not set
     CONFIG_BLK_DEV_MD=m
    +CONFIG_BT_HCIBTUSB=m
     CONFIG_CPUFREQ_DUMMY=m
    

ضيف أندرويد

  1. في ملف vendor.mk ، قم بتضمين HIDL الأصلي لنظام التشغيل Linux والعديد من الأذونات:

    PRODUCT_PACKAGES += \
        android.hardware.bluetooth@1.1-service.btlinux
    PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml
    
  2. قم بإنشاء خاصية مسار أحادي الاتجاه لإيقاف تشغيل HIDL بحيث يستخدم تطبيق HIDL الأصلي لنظام التشغيل Linux:

    selinux/common/domain.te
    
    get_prop(domain, qemu_prop)
    +get_prop(domain, vendor_build_prop)
    
    selinux/common/property_contexts
    
    qemu.cmdline            u:object_r:qemu_cmdline:s0
    +qemu.preferred.bt.service u:object_r:qemu_prop:s0
    
  3. عندما يتم تعيين الخاصية qemu.preferred.bt.service على passthrough ، فسوف تقوم بإيقاف تشغيل تطبيق HIDL:

    service btlinux-1.1 /vendor/bin/hw/android.hardware.bluetooth@1.1-service.btlinux
      class hal
      user bluetooth
      group bluetooth net_admin net_bt_admin
      capabilities NET_ADMIN NET_RAW SYS_NICE
      disabled
    
    on property:qemu.preferred.bt.service=passthrough
      stop vendor.bluetooth-1-1
      start btlinux-1.1
    
  4. أضف ملف تكوين Bluetooth للحصول على الميزات الكاملة، كما هو الحال على جهاز USB حقيقي:

    hal/bluetooth/bdroid_buildcfg.h
    
    #ifndef _BDROID_BUILDCFG_H
    #define _BDROID_BUILDCFG_H
    #define BTM_DEF_LOCAL_NAME "gCar Emulator"
    #define BTA_AV_SINK_INCLUDED TRUE
    /* Handsfree device */
    #define BTA_DM_COD {0x26, 0x04, 0x08}
    #endif
    
  5. قم بتعديل ملف BoardConfig.mk لتحديد مكان حفظ ملف التكوين:

    BoardConfig.mk
    
    # Bluetooth
    BOARD_HAVE_BLUETOOTH := true
    BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
    

مضيف لينكس

على مضيف Linux:

  1. قم بتحديث إعدادات udev للسماح لعملية المستخدم (على سبيل المثال، QEMU) بالحصول على أذونات القراءة/الكتابة:

    $ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="17cb", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew.rules >/dev/null
    $ sudo udevadm control --reload
    $ sudo udevadm trigger
    
  2. لتشغيل المحاكي، قم بتعيين معلمات سطر الأوامر التالية:

    # Start up an emulator!
    $ ./emulator @AVD_NAME -no-snapshot -prop qemu.preferred.bt.service=passthrough -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0b05,productid=0x17cb
    # Start Bluetooth Passthrough
    

دعم واي فاي

للتحقق من صحة البلوتوث المزدوج وشبكة Wi-Fi، قامت Google باختبارها باستخدام محول USB Wi-Fi Bluetooth.

نواة الضيف

يستخدم دونجل USB هذا شريحة RTL8821CU، والتي لا يدعمها المنبع الرئيسي للنواة بعد. يمكنك العثور على وحدة النواة المطورة حديثًا على 8821cu .

بعد ذلك، في قائمة التغيير 1575108 ، تم دمج وحدات النواة الخارجية في مصدر نواة السمكة الذهبية لتجميعها.

أخيرًا، يتم تجميع وحدة kernel ولكن مع بعض أعطال CFI. تحتاج إلى تصحيح الكود يدويًا لإصلاح ذلك. لمزيد من التفاصيل، راجع التحكم في تكامل التدفق في Android kernel .

قد يكون من المفيد تمكين CONFIG_CFI_PERMISSIVE والمضي قدمًا في تصحيح أخطاء بقية المكدس أولاً:

--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
 CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m

على أية حال، انتقل إلى قائمة التغيير 1575109 لرؤية الإصلاح المناسب لأعطال CFI.

ضيف أندرويد

لمعرفة المزيد حول حزمة Wi-Fi، راجع نظرة عامة على Wi-Fi . يأتي المحاكي مزودًا بالإعدادات اللازمة لتشغيل Wi-Fi.

مضيف لينكس

على مضيف Linux، يجب عليك تحديث إعدادات udev لتمكين عملية المستخدم (على سبيل المثال، QEMU) من الحصول على أذونات القراءة/الكتابة.

# /lib/udev/rules.d/40-usb_modeswitch.rules
$ ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="usb_modeswitch '/%k'"
$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="c820", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew2.rules >/dev/null
$ sudo udevadm control --reload
$ sudo udevadm trigger

لتمرير الدونجل إلى QEMU:

# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0bda,productid=0xc820

قوائم تغيير المنافذ

قم بنقل قوائم التغيير التالية: