בדף הזה מוסבר איך לחבר שני ציוד היקפי (Bluetooth ו-Wi-Fi) לאמולטור AAOS. בתהליך הזה, שלושה תחומים ספציפיים לתמיכה לנהגים הן המפתח:
- ליבה (kernel) של אורח
- מכשיר Android אורח
- מארח Linux
קודם כול, צריך להדר ולהפעיל את מנהלי ההתקנים הרלוונטיים של ה-USB בליבה (kernel) של האורח. בשלב הבא, מערכת Android לאורחים צריכה לבחור את ה-HAL והשירותים המתאימים כדי להציג לנהגים. לבסוף, מארח Linux צריך לקבל גישה למנהל התקן ה-USB וגם לאחר מכן מעבירים אותו אל QEMU.
הדונגלים נבדקו
הדונגלים הבאים נבדקו:
- מתאם USB ל-ASUS USB-BT400 USBBT400
- מתאם Bluetooth עם חיבור Wi-Fi של Auscomer
יכול להיות שמתאם אחר יפעל, אבל לא נבדקו אחרים.
תמיכה ב-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:
- https://android-review.googlesource.com/c/platform/external/qemu/+/1573247
- https://android-review.googlesource.com/c/platform/external/qemu/+/1580924
- https://android-review.googlesource.com/c/platform/external/libusb/+/1580923
תמיכה ב-Bluetooth
כדי לתמוך בחיבור Bluetooth, Google בדקה מתאם USB ל-ASUS USB-BT400 USBBT400 ו-USB Wi-Fi Bluetooth Adapter של Auscomer.
תחילה צריך להוסיף תמיכה בליבה (kernel) למתאם. כדי להבין את Android ערימת Bluetooth, ראו Bluetooth. בשביל HIDL, האמולטור משתמש בהדמיה של הטמעה. לכן, מחליפים באמצעות הטמעה מקורית של Linux.
ליבה (kernel) של אורח
כדי לתמוך במתאם Bluetooth עם חיבור USB:
מוסיפים את
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 אורח
בקובץ
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
יוצרים מאפיין של נתיב חד-כיווני כדי להוציא את ה-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
בכל פעם שהמאפיין
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
כדאי להוסיף קובץ תצורה של 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
משנים את הקובץ
BoardConfig.mk
כדי לקבוע איפה קובץ התצורה נשמר:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
מארח Linux
במארח של Linux:
מעדכנים את ההגדרות של
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
כדי להפעיל את האמולטור, מגדירים את הפרמטרים הבאים של שורת הפקודה:
# 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
רשימות שינויים של יציאות
ניוד רשימות השינויים הבאות:
- https://android-review.googlesource.com/c/kernel/common-Modules/virtual-device/+/1575107
- https://android-review.googlesource.com/c/kernel/common-מודוליםs/virtual-device/+/1575108
- https://android-review.googlesource.com/c/kernel/common-מודוליםs/virtual-device/+/1575109