מדריך לשילוב העברת USB של אמולטור

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

  • ליבה (kernel) של אורח
  • מכשיר Android אורח
  • מארח Linux

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

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

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

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

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

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

תמיכה ב-Bluetooth

כדי לתמוך בחיבור Bluetooth, Google בדקה מתאם USB ל-ASUS USB-BT400 USBBT400 ו-USB Wi-Fi Bluetooth Adapter של Auscomer.

תחילה צריך להוסיף תמיכה בליבה (kernel) למתאם. כדי להבין את Android ערימת Bluetooth, ראו Bluetooth. בשביל HIDL, האמולטור משתמש בהדמיה של הטמעה. לכן, מחליפים באמצעות הטמעה מקורית של Linux.

ליבה (kernel) של אורח

כדי לתמוך במתאם Bluetooth עם חיבור USB:

  1. מוסיפים את btusb.ko החסר לליבה (kernel):

    --- 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
    

מכשיר Android אורח

  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

במארח של 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

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

ליבה (kernel) של אורח

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

לאחר מכן, בעוד changelist 1575108, מודולי הליבה החיצונית שולבו בליבה (kernel) של דג הזהב. כדי להרכיב אותו.

לבסוף, מודול הליבה עובר הידור (kernel) אבל עם קריסות CFI מסוימות. צריך: כדי לפתור את הבעיה, עליכם לתקן את הקוד באופן ידני. פרטים נוספים זמינים במאמר שליטה בשלמות התהליך בליבה (kernel) של 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.

מכשיר Android אורח

למידע נוסף על מקבץ ה-Wi-Fi, אפשר להיכנס לאתר סקירה כללית של Wi-Fi. האמולטור מגיע עם ההגדרות להפעלת Wi-Fi.

מארח Linux

במארח של 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

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

ניוד רשימות השינויים הבאות: