บทความนี้อธิบายวิธีการเชื่อมต่ออุปกรณ์ต่อพ่วงสองเครื่อง (บลูทู ธ และ Wi-Fi) กับโปรแกรมจำลอง AAOS ในกระบวนการนี้สามส่วนเฉพาะสำหรับการสนับสนุนผู้ขับขี่เป็นกุญแจสำคัญ:
- เคอร์เนลแขก
- แขก Android
- โฮสต์ Linux
ขั้นแรกคุณรวบรวมและเปิดใช้งานไดรเวอร์ USB ที่เกี่ยวข้องในเคอร์เนลของแขก จากนั้น Guest Android จะต้องเลือก HAL และบริการที่เหมาะสมเพื่อเรียกใช้ไดรเวอร์ สุดท้ายโฮสต์ Linux ต้องเข้าถึงไดร์เวอร์ USB จากนั้นโอนไปยัง QEMU
Dongles ทดสอบ
มีการทดสอบดองเกิลต่อไปนี้:
- อะแดปเตอร์ USB ASUS USB-BT400 USBBT400
- USB Wi-Fi Bluetooth Adapter โดย 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 passthrough ให้ยืนยันว่าคุณกำลังใช้ Emulator 30.5.0 :
# Check for the emulator version
$ emulator --version
Emulator 30.5.0 มีการอัพเกรด libusb
และวิธีแก้ไขปัญหาชั่วคราวเพื่อจัดการกับความเร็วที่รองรับของ ASUS dongle support:
- 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 ได้ทดสอบ ASUS USB-BT400 USB Adapter USBBT400 และ USB Wi-Fi Bluetooth Adapter โดย Auscomer
ขั้นแรกคุณต้องเพิ่มการรองรับเคอร์เนลสำหรับดองเกิล หากต้องการทำความเข้าใจสแต็ก Bluetooth ของ Android โปรดดูที่ Bluetooth สำหรับ HIDL โปรแกรมจำลองจะใช้การจำลองการใช้งาน ดังนั้นให้เปลี่ยนด้วยการใช้งาน Linux แบบเนทีฟ
เคอร์เนลแขก
ในการรองรับดองเกิล USB Bluetooth:
เพิ่ม
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
รวม Linux Native HIDL และสิทธิ์ต่างๆ: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
ในการตรวจสอบความถูกต้องของบลูทู ธ คู่และ Wi-Fi Google ได้ทดสอบกับอะแดปเตอร์บลูทู ธ USB Wi-Fi
เคอร์เนลแขก
ดองเกิล USB เฉพาะนี้ใช้ชิป RTL8821CU ซึ่งเคอร์เนลหลักยังไม่รองรับ คุณสามารถค้นหาโมดูลเคอร์เนลที่พัฒนาขึ้นใหม่ได้ที่ 8821cu
จากนั้นในรายการการ เปลี่ยนแปลง 1575108 โมดูลเคอร์เนลภายนอกจะถูกรวมเข้ากับแหล่งเคอร์เนลปลาทองเพื่อรวบรวม
ในที่สุดโมดูลเคอร์เนลก็คอมไพล์ แต่เกิดปัญหา CFI บางส่วน คุณต้องแก้ไขรหัสด้วยตนเองเพื่อแก้ไขปัญหานี้ โปรดดูรายละเอียดใน Control Flow Integrity ในเคอร์เนล 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