หน้านี้อธิบายวิธีเชื่อมต่ออุปกรณ์ต่อพ่วง 2 ชิ้น (บลูทูธและ Wi-Fi) ในโปรแกรมจำลอง AAOS ในขั้นตอนนี้ จะมี 3 ด้านที่เกี่ยวข้องกับการสนับสนุนของผู้ขับโดยเฉพาะ คือคีย์:
- เคอร์เนลของผู้มาเยือน
- Android สำหรับผู้มาเยือน
- โฮสต์ Linux
ขั้นแรก ให้คอมไพล์และเปิดใช้ไดรเวอร์ USB ที่เกี่ยวข้องในเคอร์เนลของผู้มาเยือน ถัดไป Guest Android ต้องเลือก HAL และบริการที่เหมาะสมเพื่อแสดง คนขับรถ สุดท้าย โฮสต์ Linux ต้องมีสิทธิ์เข้าถึงไดรเวอร์ USB และ จากนั้นให้โอนไปที่ QEMU
ทดสอบดองเกิลแล้ว
ดองเกิลต่อไปนี้ผ่านการทดสอบแล้ว:
- อะแดปเตอร์ USB ของ ASUS USB-BT400 USBBT400
- อะแดปเตอร์ USB Wi-Fi Bluetooth โดย 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
การสนับสนุนบลูทูธ
Google ได้ทดสอบแล้วเพื่อรองรับการส่งผ่านบลูทูธ อะแดปเตอร์ USB ของ ASUS USB-BT400 USBBT400 และ USB Wi-Fi Bluetooth Adapter โดย Auscomer
ก่อนอื่น คุณต้องเพิ่มการรองรับเคอร์เนลสำหรับดองเกิล ทำความเข้าใจเกี่ยวกับ Android สแต็กบลูทูธ โปรดดูบลูทูธ สำหรับ HIDL โปรแกรมจำลองจะใช้การใช้งานที่จำลองขึ้น ดังนั้น ให้เปลี่ยนการตั้งค่า ที่มาพร้อม Linux
เคอร์เนลของผู้มาเยือน
วิธีรองรับดองเกิลบลูทูธ USB
เพิ่ม
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
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
เพิ่มไฟล์การกำหนดค่าบลูทูธเพื่อรับฟีเจอร์ที่สมบูรณ์ เช่น อุปกรณ์ 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
Google ทดสอบกับ Wi-Fi แบบ USB เพื่อตรวจสอบบลูทูธแบบคู่และ Wi-Fi อะแดปเตอร์บลูทูธ
เคอร์เนลของผู้มาเยือน
ดองเกิล USB เฉพาะนี้ใช้ชิป RTL8821CU ซึ่งเคอร์เนลเมนไลน์ จากต้นน้ำยังไม่รองรับ คุณสามารถค้นหาเคอร์เนลที่พัฒนาใหม่ ที่ 8821cu
จากนั้น ใน changelist 1575108 โมดูลเคอร์เนลภายนอกได้ผสานรวมเข้ากับเคอร์เนลของปลาทอง เพื่อคอมไพล์
ขั้นตอนสุดท้าย โมดูลเคอร์เนลคอมไพล์ แต่ CFI ขัดข้อง สิ่งที่คุณต้องทำ แพตช์โค้ดด้วยตนเองเพื่อแก้ไขปัญหานี้ โปรดดูรายละเอียดที่หัวข้อ ควบคุมความสมบูรณ์ของโฟลว์ในเคอร์เนลของ 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-modules/virtual-device/+/1575108
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575109