คู่มือการใช้งาน Emulator USB Passthrough

บทความนี้อธิบายวิธีการเชื่อมต่ออุปกรณ์ต่อพ่วงสองเครื่อง (บลูทู ธ และ Wi-Fi) กับโปรแกรมจำลอง AAOS ในกระบวนการนี้สามส่วนเฉพาะสำหรับการสนับสนุนผู้ขับขี่เป็นกุญแจสำคัญ:

  • เคอร์เนลแขก
  • แขก Android
  • โฮสต์ Linux

ขั้นแรกคุณรวบรวมและเปิดใช้งานไดรเวอร์ USB ที่เกี่ยวข้องในเคอร์เนลของแขก จากนั้น Guest Android จะต้องเลือก HAL และบริการที่เหมาะสมเพื่อเรียกใช้ไดรเวอร์ สุดท้ายโฮสต์ Linux ต้องเข้าถึงไดร์เวอร์ USB จากนั้นโอนไปยัง QEMU

Dongles ทดสอบ

มีการทดสอบดองเกิลต่อไปนี้:

ดองเกิลอื่น ๆ อาจใช้งานได้ แต่ไม่มีการทดสอบอื่น ๆ

รองรับ 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:

รองรับบลูทู ธ

เพื่อรองรับการส่งผ่านบลูทู ธ Google ได้ทดสอบ ASUS USB-BT400 USB Adapter USBBT400 และ USB Wi-Fi Bluetooth Adapter โดย Auscomer

ขั้นแรกคุณต้องเพิ่มการรองรับเคอร์เนลสำหรับดองเกิล หากต้องการทำความเข้าใจสแต็ก Bluetooth ของ Android โปรดดูที่ Bluetooth สำหรับ HIDL โปรแกรมจำลองจะใช้การจำลองการใช้งาน ดังนั้นให้เปลี่ยนด้วยการใช้งาน Linux แบบเนทีฟ

เคอร์เนลแขก

ในการรองรับดองเกิล USB Bluetooth:

  1. เพิ่ม 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

  1. ในไฟล์ 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
    
  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. เพิ่มไฟล์การกำหนดค่าบลูทู ธ เพื่อรับคุณสมบัติเต็มรูปแบบเช่นบนอุปกรณ์ 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 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

รายการเปลี่ยนแปลงพอร์ต

พอร์ตรายการการเปลี่ยนแปลงต่อไปนี้: