এমুলেটর ইউএসবি পাসথ্রু ইন্টিগ্রেশন গাইড

এই নিবন্ধটি AAOS এমুলেটরের সাথে দুটি পেরিফেরাল (ব্লুটুথ এবং ওয়াই-ফাই) কীভাবে সংযুক্ত করবেন তা বর্ণনা করে। এই প্রক্রিয়ায়, ড্রাইভার সমর্থনের জন্য নির্দিষ্ট তিনটি ক্ষেত্র গুরুত্বপূর্ণ:

  • অতিথি কার্নেল
  • গেস্ট অ্যান্ড্রয়েড
  • লিনাক্স হোস্ট

প্রথমে, আপনি গেস্ট কার্নেলে প্রাসঙ্গিক ইউএসবি ড্রাইভারগুলি কম্পাইল এবং সক্রিয় করুন। এরপরে, গেস্ট অ্যান্ড্রয়েডকে অবশ্যই সঠিক এইচএএল এবং পরিষেবাগুলি নির্বাচন করতে হবে ড্রাইভার আনতে৷ অবশেষে, লিনাক্স হোস্টকে অবশ্যই USB ড্রাইভারে অ্যাক্সেস পেতে হবে এবং তারপর এটি QEMU- তে স্থানান্তর করতে হবে।

Dongles পরীক্ষিত

নিম্নলিখিত ডঙ্গলগুলি পরীক্ষা করা হয়েছিল:

অন্যান্য ডঙ্গল কাজ করতে পারে, তবে অন্য কোন পরীক্ষা করা হয়নি।

নেটিভ ইউএসবি সমর্থন

QEMU এমুলেটরে USB পাস করার বিকল্পগুলির সাথে আসে। AAOS সিস্টেম ইমেজ ইতিমধ্যেই একটি সংযুক্ত ফোন পরিচালনা করে। বিস্তারিত জানার জন্য, Android Open Accessory (AOA) দেখুন।

যেহেতু ফোনটি AOA সংযোগ স্থাপনের পরে vendorID এবং productID এর মান পরিবর্তন করে, নতুন USB ইন্টারফেস (পাশাপাশি আসল USB ইন্টারফেস) ফোনটি AOA মোডে থাকা অবস্থায় ডিভাইসটিকে দেখতে পায়।

AOA মোডের আগে এবং পরে vendorID এবং productID এর মান নির্ধারণ করতে, 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 মোড চালু থাকে তখন এটিকে আবার চিনতে পারে।

ইউএসবি পাসথ্রু সমর্থন করতে, আপনি এমুলেটর 30.5.0 ব্যবহার করছেন তা নিশ্চিত করুন:

# Check for the emulator version
$ emulator --version

এমুলেটর 30.5.0 একটি libusb আপগ্রেড এবং ASUS ডঙ্গল সমর্থনের গতির সামঞ্জস্যের সমাধান করার জন্য অস্থায়ী সমাধান অন্তর্ভুক্ত করে:

ব্লুটুথ সমর্থন

ব্লুটুথ পাসথ্রু সমর্থন করার জন্য, Google Auscomer দ্বারা ASUS USB-BT400 USB অ্যাডাপ্টার USBBT400 এবং USB Wi-Fi ব্লুটুথ অ্যাডাপ্টার পরীক্ষা করেছে৷

প্রথমে, আপনাকে ডঙ্গলের জন্য কার্নেল সমর্থন যোগ করতে হবে। অ্যান্ড্রয়েড ব্লুটুথ স্ট্যাক বুঝতে, ব্লুটুথ দেখুন। HIDL-এর জন্য, এমুলেটর সিমুলেটেড বাস্তবায়ন ব্যবহার করে। অতএব, একটি নেটিভ লিনাক্স বাস্তবায়নের সাথে এটি স্যুইচ করুন।

অতিথি কার্নেল

একটি USB ব্লুটুথ ডঙ্গল সমর্থন করতে:

  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
    

গেস্ট অ্যান্ড্রয়েড

  1. vendor.mk ফাইলে, Linux নেটিভ 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 স্যুইচ আউট করার জন্য একটি একমুখী পাথ সম্পত্তি তৈরি করুন যাতে এটি একটি Linux নেটিভ 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
    
  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
    

লিনাক্স হোস্ট

লিনাক্স হোস্টে:

  1. ব্যবহারকারীর প্রক্রিয়াকে (যেমন QEMU) পড়ার/লিখনের অনুমতি দেওয়ার জন্য udev সেটিংস আপডেট করুন:

    $ 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 সমর্থন

ডুয়াল ব্লুটুথ এবং ওয়াই-ফাই যাচাই করতে, গুগল ইউএসবি ওয়াই-ফাই ব্লুটুথ অ্যাডাপ্টার দিয়ে পরীক্ষা করেছে।

অতিথি কার্নেল

এই নির্দিষ্ট ইউএসবি ডঙ্গলটি RTL8821CU চিপ ব্যবহার করে, যা মেইনলাইন কার্নেল আপস্ট্রিম এখনও সমর্থন করে না। আপনি 8821cu এ একটি নতুন উন্নত কার্নেল মডিউল খুঁজে পেতে পারেন।

তারপর, চেঞ্জলিস্ট 1575108 এ, বহিরাগত কার্নেল মডিউলগুলিকে গোল্ডফিশ কার্নেল উত্সের সাথে সংহত করা হয়েছিল যাতে এটি সংকলিত হয়।

অবশেষে, কার্নেল মডিউল কম্পাইল করে কিন্তু কিছু CFI ক্র্যাশের সাথে। এটি ঠিক করতে আপনাকে ম্যানুয়ালি কোডটি প্যাচ করতে হবে। বিস্তারিত জানার জন্য, অ্যান্ড্রয়েড কার্নেলে কন্ট্রোল ফ্লো ইন্টিগ্রিটি দেখুন।

এটি CONFIG_CFI_PERMISSIVE সক্ষম করা সহায়ক হতে পারে এবং প্রথমে বাকি স্ট্যাক ডিবাগ করার সাথে এগিয়ে যেতে পারে:

--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
 CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m

যাই হোক না কেন, CFI ক্র্যাশের সঠিক সমাধান দেখতে চেঞ্জলিস্ট 1575109- এ যান।

গেস্ট অ্যান্ড্রয়েড

Wi-Fi স্ট্যাক সম্পর্কে আরও জানতে, Wi-Fi ওভারভিউ দেখুন। ওয়াই-ফাই কাজ করার জন্য এমুলেটর সেটিংসের সাথে আসে।

লিনাক্স হোস্ট

লিনাক্স হোস্টে, ব্যবহারকারীর প্রক্রিয়া (উদাহরণস্বরূপ, QEMU) পঠন/লেখার অনুমতি পাওয়ার জন্য আপনাকে udev সেটিংস আপডেট করতে হবে।

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

পোর্ট পরিবর্তন তালিকা

নিম্নলিখিত পরিবর্তন তালিকা পোর্ট করুন: