Bu sayfada iki çevre biriminin (Bluetooth ve Wi-Fi) AAOS öykünücüsüne nasıl bağlanacağı açıklanmaktadır. Bu süreçte sürücü desteğine özel üç alan çok önemlidir:
- Konuk çekirdeği
- Misafir Android
- Linux ana bilgisayarı
Öncelikle Konuk çekirdeğinde ilgili USB sürücülerini derleyip etkinleştirirsiniz. Daha sonra, Konuk Android'in sürücüleri getirmek için doğru HAL'yi ve hizmetleri seçmesi gerekir. Son olarak, Linux ana bilgisayarının USB sürücüsüne erişmesi ve ardından onu QEMU'ya aktarması gerekir.
Dongle'lar test edildi
Aşağıdaki dongle'lar test edildi:
- ASUS USB-BT400 USB Adaptörü USBBT400
- Auscomer'dan USB Wi-Fi Bluetooth Adaptörü
Diğer dongle'lar çalışabilir ancak diğerleri test edilmemiştir.
Yerel USB desteği
QEMU, USB'yi öykünücüye aktarma seçenekleriyle birlikte gelir. AAOS sistem görüntüsü zaten bağlı bir telefonu yönetiyor. Ayrıntılar için bkz. Android Açık Aksesuarı (AOA) .
Telefon, bir AOA bağlantısı kurulduğunda vendorID
ve productID
değerlerini değiştirdiğinden, yeni USB arabirimi (aynı zamanda orijinal USB arabirimi), telefon AOA modundayken cihazı görür.
AOA modundan önce ve sonra vendorID
ve productID
değerlerini belirlemek için lsusb
kullanın:
# 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 iletin:
# 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ğuna yönelik bir libusb
yükseltmesi ve geçici çözüm içerir:
- 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 desteği
Bluetooth geçişini desteklemek için Google, Auscomer'ın 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 çekirdeği
USB Bluetooth donanım kilidini desteklemek için:
Eksik
btusb.ko
dosyasını ç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
vendor.mk
dosyasına Linux yerel HIDL'sini ve çeşitli izinleri ekleyin: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'yi, Linux yerel HIDL uygulamasını 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
Bir
qemu.preferred.bt.service
özelliğipassthrough
olarak ayarlandığında, HIDL uygulamasını devre dışı bırakacaksınız: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
Gerçek bir USB cihazında olduğu 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
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:
Kullanıcı işleminin (örneğin, 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
Emülatörü ç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
Google, çift Bluetooth ve Wi-Fi'yi doğrulamak için USB Wi-Fi Bluetooth Adaptörünü test etti.
Konuk çekirdeği
Bu özel USB donanım kilidi, ana hat çekirdeğinin henüz desteklemediği RTL8821CU yongasını kullanıyor. Yeni geliştirilen çekirdek modülünü 8821cu adresinde bulabilirsiniz.
Daha sonra, 1575108 numaralı değişiklik listesinde, harici çekirdek modülleri, derlenmesi için akvaryum balığı çekirdek kaynağına entegre edildi.
Son olarak, çekirdek modülü derleniyor ancak bazı CFI çökmeleri yaşanıyor. Bunu düzeltmek için kodu manuel olarak yamalamanız gerekir. Ayrıntılar için bkz. Android çekirdeğinde Kontrol Akışı Bütünlüğü .
CONFIG_CFI_PERMISSIVE
etkinleştirmek ve önce yığının geri kalanında hata ayıklama yaparak ilerlemek yararlı olabilir:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
Her durumda, CFI çökmelerine yönelik doğru düzeltmeyi görmek için 1575109 numaralı değişiklik listesine gidin.
Misafir Android
Wi-Fi yığını hakkında daha fazla bilgi edinmek için Wi-Fi'ye Genel Bakış bölümüne bakın. Emülatör, Wi-Fi'nin çalışmasını sağlayacak 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üncellemeniz gerekir.
# /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 aktarmak 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
Bağlantı noktası değişiklik listeleri
Aşağıdaki değişiklik listelerini taşıyın:
- 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