در این مقاله نحوه اتصال دو دستگاه جانبی (بلوتوث و Wi-Fi) به شبیه ساز AAOS شرح داده شده است. در این فرآیند ، سه زمینه ویژه پشتیبانی راننده مهم است:
- هسته مهمان
- اندروید مهمان
- میزبان لینوکس
ابتدا ، درایورهای USB مربوطه را در هسته میهمان کامپایل و فعال می کنید. در مرحله بعدی ، Guest Android باید HAL و خدمات صحیحی را برای نمایش درایورها انتخاب کند. سرانجام ، میزبان Linux باید به درایور USB دسترسی پیدا کند و سپس آن را به QEMU منتقل کند.
دانگل آزمایش شده است
دانگل های زیر مورد آزمایش قرار گرفتند:
- آداپتور USB ASUS USB-BT400 USBBT400
- آداپتور بلوتوث USB Wi-Fi توسط Auscomer
سایر دانگل ها ممکن است کار کنند ، اما هیچ مورد دیگری آزمایش نشده است.
پشتیبانی USB بومی
QEMU گزینه هایی برای انتقال USB به شبیه ساز دارد. تصویر سیستم AAOS از قبل یک تلفن متصل را اداره می کند. برای جزئیات ، به لوازم جانبی باز Android (AOA) مراجعه کنید .
از آنجا که تلفن با ایجاد اتصال AOA مقادیر vendorID
و productID
را تغییر می دهد ، رابط جدید 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 ، تأیید کنید که از Emulator 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 Adapter Bluetooth را توسط 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
اندروید مهمان
در فایل
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 بومی لینوکس استفاده کند:
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
میزبان لینوکس
در میزبان لینوکس:
تنظیمات
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. برای رفع این مشکل باید کد را به صورت دستی وصله کنید. برای جزئیات ، به کنترل جریان یکپارچگی در هسته Android مراجعه کنید .
ممکن است مفید باشد که بتوانید CONFIG_CFI_PERMISSIVE
را فعال کنید و CONFIG_CFI_PERMISSIVE
با اشکال زدایی بقیه پشته به جلو بروید:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
در هر صورت ، برای دیدن اصلاح مناسب برای خرابی های CFI به Changelist 1575109 بروید.
اندروید مهمان
برای کسب اطلاعات بیشتر در مورد پشته Wi-Fi ، به نمای کلی Wi-Fi مراجعه کنید . شبیه ساز با تنظیماتی همراه است تا Wi-Fi کار کند.
میزبان لینوکس
در میزبان 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