Emulator USB Passthrough מדריך שילוב

מאמר זה מתאר כיצד לחבר שני ציוד היקפי (Bluetooth ו-Wi-Fi) לאמולטור AAOS. בתהליך זה, שלושה תחומים ספציפיים לתמיכה בנהג הם המפתח:

  • גרעין אורח
  • אנדרואיד אורח
  • מארח לינוקס

ראשית, אתה מקמפל ומאפשר את מנהלי ההתקנים הרלוונטיים של USB בקרנל האורח. לאחר מכן, אנדרואיד אורח חייב לבחור את ה-HAL והשירותים הנכונים כדי להעלות את מנהלי ההתקן. לבסוף, מארח הלינוקס חייב לקבל גישה למנהל התקן ה-USB ולאחר מכן להעביר אותו ל- QEMU .

דונגלים נבדקו

הדונגלים הבאים נבדקו:

דונגלים אחרים עשויים לעבוד, עם זאת, אחרים לא נבדקו.

תמיכה מקורית ב-USB

QEMU מגיע עם אפשרויות להעביר USB לאמולטור. תמונת מערכת AAOS כבר מטפלת בטלפון מחובר. לפרטים, ראה אביזר פתוח לאנדרואיד (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, אשר שאתה משתמש באמולטור 30.5.0 :

# Check for the emulator version
$ emulator --version

אמולטור 30.5.0 כולל שדרוג libusb ופתרון זמני כדי לטפל בתאימות המהירות של תמיכת דונגל ASUS:

תמיכה בבלוטות'

כדי לתמוך במעבר בלוטות', גוגל בדקה את ASUS USB-BT400 מתאם USB USBBT400 ומתאם USB Wi-Fi Bluetooth של Auscomer.

ראשית, עליך להוסיף תמיכת ליבה עבור הדונגל. כדי להבין את ערימת ה-Bluetooth של Android, ראה Bluetooth . עבור HIDL, האמולטור משתמש ביישום מדומה. לכן, החלף את זה עם יישום לינוקס מקורי.

גרעין אורח

כדי לתמוך בדונגל 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 מקורי של לינוקס:

    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
    

מארח לינוקס

על מארח לינוקס:

  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

כדי לאמת Bluetooth ו-Wi-Fi כפולים, Google בדקה עם מתאם ה-USB Wi-Fi Bluetooth.

גרעין אורח

דונגל USB מסוים זה משתמש בשבב RTL8821CU, שהליבת המרכזית במעלה הזרם עדיין לא תומכת בו. אתה יכול למצוא מודול ליבה שפותח לאחרונה ב -8821cu .

לאחר מכן, ברשימת השינויים 1575108 , מודולי הליבה החיצוניים שולבו במקור ליבת דג הזהב כדי לבצע קומפילציה.

לבסוף, מודול הליבה מבצע קומפילציה אך עם כמה קריסות CFI. אתה צריך לתקן את הקוד באופן ידני כדי לתקן את זה. לפרטים, ראה שלמות זרימת שליטה בליבת אנדרואיד .

זה עשוי להיות מועיל להפעיל 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

רשימות שינוי נמלים

העבר את רשימות השינוי הבאות: