Öykünücü USB Geçiş Entegrasyon Kılavuzu

Bu makale, iki çevre biriminin (Bluetooth ve Wi-Fi) AAOS öykünücüsüne nasıl bağlanacağını açıklamaktadır. Bu süreçte, sürücü desteğine özgü üç alan çok önemlidir:

  • Konuk çekirdek
  • Misafir Android
  • Linux ana bilgisayarı

İlk olarak, konuk çekirdekte ilgili USB sürücülerini derler ve etkinleştirirsiniz. Ardından, Konuk Android, sürücüleri getirmek için doğru HAL ve hizmetleri seçmelidir. Son olarak, Linux ana bilgisayarı USB sürücüsüne erişmeli ve ardından bunu QEMU'ya aktarmalıdır.

Dongles test edildi

Aşağıdaki dongle'lar test edildi:

Diğer dongle'lar çalışabilir, ancak diğerleri test edilmemiştir.

Yerel USB desteği

QEMU, USB'yi emülatöre geçirme seçenekleriyle birlikte gelir. AAOS sistem görüntüsü zaten bağlı bir telefonu kullanıyor. Ayrıntılar için bkz. Android Açık Aksesuar (AOA) .

Telefon için değerleri değiştiğinden vendorID ve productID bir AOA bağlantı kurmasını üzerine, yeni bir USB arayüzü (yanı sıra orijinal USB arayüzü) telefon AOA modundayken cihazı görür.

Değerlerini belirlemek için vendorID ve productID öncesi ve AOA modunda kullanım sonrasında 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

Alternatif olarak, fiziksel bağlantı noktasını QEMU'ya geçirin:

# 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 sistem görüntüsü telefonu tanır, AOA moduna geçirir ve AOA modu çalışırken tekrar tanır.

USB geçişini desteklemek için Emulator 30.5.0 kullandığınızı onaylayın:

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 , ASUS dongle desteğinin hız uyumluluğunu ele almak için bir libusb yükseltmesi ve geçici bir çözüm içerir:

Bluetooth desteği

Bluetooth geçişini desteklemek için Google, Auscomer tarafından ASUS USB-BT400 USB Adaptörü USBBT400 ve USB Wi-Fi Bluetooth Adaptörünü test etti.

Öncelikle, dongle için çekirdek desteği eklemeniz gerekir. Android Bluetooth yığınını anlamak için bkz. Bluetooth . HIDL için emülatör simüle edilmiş uygulamayı kullanır. Bu nedenle, bunu yerel bir Linux uygulamasıyla değiştirin.

Konuk çekirdek

Bir USB Bluetooth dongle'ı desteklemek için:

  1. Eksik btusb.ko çekirdeğinize ekleyin:

    --- 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
    

Misafir Android

  1. vendor.mk dosyasında, Linux yerel HIDL'yi ve birkaç izni dahil edin:

    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'yi Linux yerel HIDL uygulaması kullanacak şekilde değiştirmek için tek yönlü bir yol özelliği oluşturun:

    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. Bir özellik zaman qemu.preferred.bt.service ayarlandığında passthrough , sen HIDL uygulanmasını dışarı geçiş olacak:

    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. Gerçek bir USB cihazındaki gibi tüm özellikleri elde etmek için bir Bluetooth yapılandırma dosyası ekleyin:

    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. Yapılandırma dosyasının nereye kaydedildiğini belirlemek için BoardConfig.mk dosyasını değiştirin:

    BoardConfig.mk
    
    # Bluetooth
    BOARD_HAVE_BLUETOOTH := true
    BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
    

Linux ana bilgisayarı

Linux ana bilgisayarında:

  1. Kullanıcı işleminin (ör. QEMU) okuma / yazma izinlerine sahip olmasına izin vermek için udev ayarlarını güncelleyin:

    $ 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. Öykünücüyü çalıştırmak için aşağıdaki komut satırı parametrelerini ayarlayın:

    # 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 desteği

Çift Bluetooth ve Wi-Fi'yi doğrulamak için Google, USB Wi-Fi Bluetooth Adaptörüyle test etti.

Konuk çekirdek

Bu özel USB dongle, ana hat yukarı akışının henüz desteklemediği RTL8821CU yongasını kullanır. 8821cu'da yeni geliştirilmiş bir çekirdek modülünü bulabilirsiniz .

Ardından, 1575108 değişiklik listesinde harici çekirdek modülleri, derlenmek için Japon balığı çekirdek kaynağına entegre edildi.

Son olarak, çekirdek modülü derlenir, ancak bazı CFI çöker. Bunu düzeltmek için kodu manuel olarak yamalamanız gerekir. Ayrıntılar için Android çekirdeğinde Kontrol Akışı Bütünlüğü konusuna bakın.

CONFIG_CFI_PERMISSIVE etkinleştirmek ve önce yığının geri kalanında hata CONFIG_CFI_PERMISSIVE ilerlemek faydalı olabilir:

0323b“80

Her durumda, CFI çökmeleri için doğru düzeltmeyi görmek için değişiklik listesine 1575109 gidin.

Misafir Android

Wi-Fi yığını hakkında daha fazla bilgi edinmek için Wi-Fi'ye Genel Bakış konusuna bakın. Emülatör, Wi-Fi'nin çalışması için ayarlarla birlikte gelir.

Linux ana bilgisayarı

Linux ana bilgisayarında, kullanıcı işleminin (örneğin QEMU) okuma / yazma izinlerine sahip olmasını sağlamak için udev ayarlarını güncellemelisiniz.

# /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

Dongle'ı QEMU'ya geçirmek için:

# 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

Liman değişiklik listeleri

Aşağıdaki değişiklik listelerini taşıyın: