راهنمای یکپارچه سازی عبور USB شبیه ساز

در این مقاله نحوه اتصال دو دستگاه جانبی (بلوتوث و وای فای) به شبیه ساز AAOS توضیح داده شده است. در این فرآیند، سه حوزه خاص برای پشتیبانی راننده کلیدی است:

  • هسته مهمان
  • مهمان اندروید
  • هاست لینوکس

ابتدا، درایورهای USB مربوطه را در هسته مهمان کامپایل و فعال می کنید. در مرحله بعد، اندروید مهمان باید HAL و خدمات مناسب را برای نمایش درایورها انتخاب کند. در نهایت، میزبان لینوکس باید به درایور USB دسترسی داشته باشد و سپس آن را به QEMU منتقل کند.

دانگل تست شده

دانگل های زیر مورد آزمایش قرار گرفتند:

دانگل های دیگر ممکن است کار کنند، با این حال، هیچ دانگل دیگری آزمایش نشده است.

پشتیبانی از USB بومی

QEMU دارای گزینه هایی برای انتقال USB به شبیه ساز است. تصویر سیستم AAOS قبلاً یک تلفن متصل را کنترل می کند. برای جزئیات، به لوازم جانبی باز Android (AOA) مراجعه کنید.

از آنجایی که تلفن با برقراری اتصال AOA مقادیر vendorID و productID را تغییر می‌دهد، رابط 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 و راه حل موقت برای رسیدگی به سازگاری سرعت پشتیبانی دانگل ایسوس است:

پشتیبانی از بلوتوث

برای پشتیبانی از عبور بلوتوث، Google آداپتور USB-BT400 ASUS USBBT400 و USB Wi-Fi Bluetooth Adapter توسط Auscomer را آزمایش کرد.

ابتدا باید پشتیبانی کرنل را برای دانگل اضافه کنید. برای درک پشته بلوتوث Android، بلوتوث را ببینید. برای HIDL، شبیه ساز از پیاده سازی شبیه سازی شده استفاده می کند. بنابراین، آن را با اجرای لینوکس بومی تغییر دهید.

هسته مهمان

برای پشتیبانی از دانگل بلوتوث USB:

  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 اصلی لینوکس و چندین مجوز را وارد کنید:

    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 بومی لینوکس استفاده کند:

    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. یک فایل پیکربندی بلوتوث اضافه کنید تا ویژگی های کامل را دریافت کنید، مانند یک دستگاه 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
    

هاست لینوکس

در هاست لینوکس:

  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 با آداپتور بلوتوث Wi-Fi USB آزمایش کرد.

هسته مهمان

این دانگل USB خاص از تراشه RTL8821CU استفاده می کند که هسته اصلی بالادست هنوز از آن پشتیبانی نمی کند. شما می توانید یک ماژول هسته جدید توسعه یافته را در 8821cu پیدا کنید.

سپس، در لیست تغییرات 1575108 ، ماژول‌های هسته خارجی در منبع هسته ماهی قرمز ادغام شدند تا کامپایل شوند.

در نهایت، ماژول هسته کامپایل می شود اما با برخی از خرابی های CFI. برای رفع این مشکل باید کد را به صورت دستی وصله کنید. برای جزئیات، به Control Flow Integrity در هسته Android مراجعه کنید.

ممکن است مفید باشد که 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 ارائه می شود.

هاست لینوکس

در هاست لینوکس، باید تنظیمات 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

لیست های تغییرات پورت

لیست های تغییرات زیر را پورت کنید: