מאמר זה מתאר כיצד לחבר שני ציוד היקפי (Bluetooth ו- Wi-Fi) לאמולטור AAOS. בתהליך זה, שלושה תחומים ספציפיים לתמיכה בנהגים הם המפתח:
- גרעין אורח
- אנדרואיד אורח
- מארח לינוקס
ראשית, אתה מרכיב ומאפשר את מנהלי ההתקנים הרלוונטיים של USB בליבת האורח. בשלב הבא, אורח אנדרואיד חייב לבחור את ה- HAL והשירותים הנכונים להעלאת הנהגים. לבסוף, על מארח לינוקס לקבל גישה למנהל התקן ה- USB ואז להעביר אותו ל- QEMU .
דונגלס נבדק
הדונגלים הבאים נבדקו:
- ASUS USB-BT400 מתאם USB USBBT400
- מתאם USB Wi-Fi Bluetooth על ידי Auscomer
דונגלים אחרים עשויים לעבוד, אולם אף אחד אחר לא נבדק.
תמיכה מקומית ב- USB
QEMU מגיע עם אפשרויות להעביר USB לאמולטור. תמונת מערכת ה- AAOS כבר מטפלת בטלפון מחובר. לפרטים, ראו אביזר Android Open (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
Emulator 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, גוגל בדקה את מתאם USB ASUS USB-BT400 USBBT400 ו- USB Wi-Fi Bluetooth מתאם על ידי Auscomer.
ראשית, עליך להוסיף תמיכה בגרעין לדונגל. להבנת מחסנית ה- Bluetooth של Android, ראה Bluetooth . עבור HIDL, האמולטור משתמש ביישום מדומה. לכן, החלף זאת באמצעות יישום לינוקס מקורי.
גרעין אורח
לתמיכה בפלאג Bluetooth מסוג USB:
הוסף את ה-
btusb.ko
החסר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
אנדרואיד אורח
בקובץ
vendor.mk
,vendor.mk
אתvendor.mk
המקורי של לינוקס ומספר הרשאות: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 מקורי של לינוקס:
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
מוגדר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
מארח לינוקס
במארח לינוקס:
עדכן את הגדרות
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
כדי לאמת Bluetooth כפול ו- Wi-Fi, Google נבדקה באמצעות מתאם ה- USB Wi-Fi Bluetooth.
גרעין אורח
דונגל USB מסוים זה משתמש בשבב RTL8821CU, שעדיין לא תומך בו הגרעין הראשי במעלה הזרם. תוכל למצוא מודול ליבה חדש שפותח בכתובת 8821cu .
ואז, ברשימת השינויים 1575108 , שולבו מודולי הליבה החיצוניים במקור ליבת דג הזהב כדי להרכיב אותו.
לבסוף, מודול הליבה מתגודד אך עם כמה קריסות CFI. עליך לתקן את הקוד באופן ידני כדי לתקן זאת. לפרטים, ראה בקרת זרימת שליטה בגרעין אנדרואיד .
זה עשוי להיות מועיל לאפשר CONFIG_CFI_PERMISSIVE
ולהמשיך קדימה עם ניפוי שגיאות בשאר 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
רשימות שינויים בנמל
נמל את רשימות השינויים הבאות:
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575107
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575108
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575109