স্থাপত্য

AAOS-এ VirtIO সমর্থন করার জন্য প্রয়োজনীয় বেশিরভাগ পরিবর্তনগুলির মধ্যে HAL বাস্তবায়ন স্তরে এবং Android কমন কার্নেলের নীচের পরিবর্তনগুলি জড়িত৷ অ্যান্ড্রয়েড ফ্রেমওয়ার্ক AAOS গেস্ট ভিএম কার্নেলে VirtIO ড্রাইভার ব্যবহার করে একটি জেনেরিক হার্ডওয়্যার-অ্যাগনস্টিক HAL এর সাথে যোগাযোগ করে, যা VirtIO প্রোটোকল ব্যবহার করে হোস্ট সাইডে VirtIO ডিভাইসগুলির সাথে যোগাযোগ করে। হোস্ট সাইডে VirtIO ডিভাইসগুলি SoC-নির্দিষ্ট ডিভাইস ড্রাইভার ব্যবহার করে শারীরিক HW অ্যাক্সেস করতে পারে।

VirtIO ড্রাইভার এবং VirtIO ডিভাইসের মধ্যে যোগাযোগ virtqueue মাধ্যমে হয়, যা স্ক্যাটার গ্যাদার লিস্টের DMA-এর মতো রিং বাফার। VM-এর মধ্যে VirtIO বার্তা আদান-প্রদান করতে MMIO বা PCI- এর মতো বেশ কিছু পরিবহন ব্যবহার করা যেতে পারে।

কিছু ক্ষেত্রে, আন্ত-ভিএম যোগাযোগের জন্য vsock ব্যবহার করা হয়েছে। যানবাহন HAL, অডিও কন্ট্রোল, এবং ডাম্পস্টেট যোগাযোগগুলি একটি পিয়ার এজেন্টের সাথে একটি vsock ইন্টারফেসের উপর একটি পৃথক VM-এ একটি সংযোগ ব্যবহার করে সমর্থিত। GRPC-vsock এই অ-প্রমিত সাবসিস্টেমগুলি অ্যাক্সেস করতে ব্যবহৃত হয়। অ্যান্ড্রয়েড সোর্স ট্রিতে GRPC পরিবর্তন করা হয়েছে vsock এর ঠিকানা বিন্যাসের সাথে vsock:CID:PORT_NUMBER

ভার্চুয়ালাইজেশন আর্কিটেকচার
চিত্র 1. ভার্চুয়ালাইজেশন আর্কিটেকচার

শ্রুতি

ভার্চুয়ালাইজড AAOS-এ, Android গেস্ট VM অডিও অ্যাক্সেস করতে virtio-snd ব্যবহার করতে পারে। virtio-snd ভার্চুয়ালাইজড পিসিএম ডিভাইসগুলিকে Android VM-তে প্রদান করে যাতে অডিও HAL বাস্তবায়ন TinyALSA লাইব্রেরির সাথে ভার্চুয়ালাইজড সাউন্ড ডিভাইসগুলির সাথে যোগাযোগ করতে পারে।

ডিফল্ট অডিও HAL বাস্তবায়ন AOSP-এ /device/google/trout/hal/audio/6.0 এ অবস্থিত। OEMগুলি তাদের প্ল্যাটফর্মের জন্য ro.vendor.trout.audiohal.{in,out}_period_{ms,count} সংশোধন করতে পারে৷ OEMগুলি /device/google/trout/aosp_trout_common.mk.

অডিও কন্ট্রোল HAL AAOS-এ অডিও ফোকাস পরিচালনা করে। উদাহরণস্বরূপ, যখন সিস্টেম জরুরী শব্দ বাজায়, তখন পটভূমিতে বাজানো মিউজিক নিঃশব্দ করার প্রয়োজন হতে পারে। অডিও কন্ট্রোল HAL এই পরিস্থিতিতে মিউট করার জন্য মিউজিক বাজানো অ্যাপগুলিকে জানিয়ে দেবে। ভার্চুয়ালাইজড সিস্টেমে, শব্দগুলি অন্যান্য VM থেকে আসতে পারে। রেফারেন্স বাস্তবায়নে, AAOS গেস্ট ভিএম-এ একটি অডিও কন্ট্রোল সার্ভার ডেমন চলছে, যা অন্যান্য ভিএম থেকে অডিও ফোকাস অনুরোধগুলি পেতে GRPC-vsock ব্যবহার করে। হোস্ট VM device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller ব্যবহার করে AAOS কে অডিও নিয়ন্ত্রণের অনুরোধ পাঠাতে পারে। libandroid_audio_controller অডিও ফোকাস ধারণ করলে, ফোকাস প্রকাশ না হওয়া পর্যন্ত এটি AAOS-এ হার্টবিট পাঠাতে থাকবে।

অডিও আর্কিটেকচার
চিত্র 5. অডিও আর্কিটেকচার

ব্লুটুথ

ব্লুটুথ বাস্তবায়ন নীচের চিত্রিত নকশার উপর ভিত্তি করে।

ব্লুটুথ আর্কিটেকচার
চিত্র 5. ব্লুটুথ আর্কিটেকচার

ব্লুটুথ হ্যান্ডস-ফ্রি প্রোফাইল

trout ব্লুটুথ হ্যান্ডস-ফ্রি প্রোফাইল (HFP) সক্ষম করতে, অডিও নিয়ন্ত্রণ সমর্থন করার জন্য VirtIO সাউন্ড ডিভাইসের স্পেসিফিকেশন বাড়ানো হয়েছে। এই পদ্ধতি ব্যবহার করে, হোস্ট/হাইপারভাইজার সাইডে একটি VirtIO সাউন্ড ডিভাইস HFP সম্পর্কিত এই তিনটি অডিও নিয়ন্ত্রণ প্রদান করে:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

যখন AAOS একটি গেস্ট VM হিসাবে চলে, তখন AAOS এই অডিও নিয়ন্ত্রণগুলি সেট করতে TinyAlsa ব্যবহার করে৷ HFP ব্যবহারের ক্ষেত্রে সক্ষম করতে, হোস্ট/হাইপারভাইজার সেই অনুযায়ী বিক্রেতা-নির্দিষ্ট রাউটিং এবং ক্রমাঙ্কন সম্পাদন করে।

ব্লুটুথ বাস্তবায়ন নীচের নকশা চিত্রের উপর ভিত্তি করে।

ব্লুটুথ আর্কিটেকচার
চিত্র 5. ব্লুটুথ আর্কিটেকচার

ডাম্পস্টেট

ভার্চুয়ালাইজড AAOS-এর জন্য বাগ রিপোর্ট তৈরি করার সময়, হোস্ট VM তথ্য অন্তর্ভুক্ত করা মূল্যবান যাতে ডেভেলপারদের সিস্টেমের আরও ব্যাপক দৃষ্টিভঙ্গি থাকে। এটি সম্পন্ন করার জন্য, trout রেফারেন্স বাস্তবায়ন IDumpstateDevice HAL প্রয়োগ করে, যা GRPC-vsock এর মাধ্যমে হোস্ট VM তথ্য সংগ্রহ করে। ডাম্পিং লগগুলি dumpstate_board.txt এ থাকাকালীন `tar`-প্যাকেজ করা হোস্ট VM তথ্যের নাম দেওয়া হয় dumpstate_board.bin

এক্সিকিউট করার জন্য কমান্ড কনফিগার করতে:

  1. নীচের ফাইল থেকে একটি XML ফাইলে কনফিগারেশনের বিবরণ অনুলিপি করুন, উদাহরণস্বরূপ, config.xml
    <dumpstateHalConfiguration version="1.0">
        <services>
            <service name="coqos-virtio-blk"        command="/bin/journalctl --no-pager -t coqos-virtio-blk"/>
            <service name="coqos-virtio-net"        command="/bin/journalctl --no-pager -t coqos-virtio-net"/>
            <service name="coqos-virtio-video"      command="/bin/journalctl --no-pager -t coqos-virtio-video"/>
            <service name="coqos-virtio-console"    command="/bin/journalctl --no-pager -t coqos-virtio-console"/>
            <service name="coqos-virtio-rng"        command="/bin/journalctl --no-pager -t coqos-virtio-rng"/>
            <service name="coqos-virtio-vsock"      command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/>
            <service name="coqos-virtio-gpu-virgl"  command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/>
            <service name="coqos-virtio-scmi"       command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/>
            <service name="coqos-virtio-input"      command="/bin/journalctl --no-pager -t coqos-virtio-input"/>
            <service name="coqos-virtio-snd"        command="/bin/journalctl --no-pager -t coqos-virtio-snd"/>
            <service name="dumpstate_grpc_server"   command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/>
            <service name="systemd"                 command="/bin/journalctl --no-pager -t systemd"/>
            <service name="systemctl"               command="/bin/systemctl status"/>
            <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/>
        </services>
        <systemLogs>
            <service name="dmesg" command="/bin/dmesg -kuPT"/>
        </systemLogs>
    </dumpstateHalConfiguration>
    
  2. চালু করার সময় ডাম্পস্টেট সার্ভারে নতুন XML ফাইলের পাথ পাস করুন। যেমন:
    --config_file my_config.xml
    

এক্সটেন্ডেড ভিউ সিস্টেম (EVS)

এক্সটেন্ডেড ভিউ সিস্টেম (EVS) রিয়ার-ভিউ এবং সার্উন্ড-ভিউ ক্যামেরা দ্বারা ক্যাপচার করা ভিডিও প্রদর্শন করতে ব্যবহৃত হয়। ভার্চুয়ালাইজড AAOS-এ, EVS স্ট্যাক ভার্চুয়ালাইজড V4L2 স্ট্রিমিং ডিভাইস থেকে ভিডিও স্ট্রিম অ্যাক্সেস করতে পারে যা VirtIO-ভিডিও ড্রাইভার ব্যবহার করে।

গ্যারেজ মোড

আরও তথ্যের জন্য, গ্যারেজ মোড দেখুন।

গ্যারেজ মোডে প্রবেশ এবং প্রস্থান করা যানবাহন HAL দ্বারা প্রেরিত AP_POWER_STATE_REQ বৈশিষ্ট্য দ্বারা ট্রিগার হয়৷ ভার্চুয়ালাইজেশন মোডে, গ্যারেজ মোড হোস্টের দিক থেকে ট্রিগার হয়। Android বন্ধ না হওয়া পর্যন্ত, Android VM-এর জন্য ভার্চুয়াল ডিভাইস প্রদান করতে হোস্ট VM চালু থাকা উচিত। হোস্ট VM-এর VHAL সার্ভার AAOS গেস্ট VM-এ শাটডাউন সংকেত পাঠায়। VHAL ক্লায়েন্ট সিগন্যাল পাওয়ার পর, AAOS VM গ্যারেজ মোডে প্রবেশ করে এবং হোস্ট VM সক্রিয় রাখতে হার্টবিট সিগন্যাল পাঠাতে শুরু করে।

গ্লোবাল নেভিগেশন স্যাটেলাইট সিস্টেম (GNSS)

trout 1.0-এ, virtio-console এর উপর GNSS ভার্চুয়ালাইজেশনের জন্য সমর্থন যোগ করা হয়েছে। বাস্তবায়নটি হোস্ট থেকে অতিথির কাছে কাঁচা পরিমাপ এবং অবস্থান সংশোধনের বিনিময় সমর্থন করে।

ডেটা এক্সচেঞ্জ ফর্ম্যাট হল GnssLogger অ্যাপ দ্বারা ব্যবহৃত CSV। রেফারেন্স বাস্তবায়নে, কারণ নেটিভ GNSS ড্রাইভার উপলব্ধ নয়, মক ডেটা উপলব্ধ করা হয় তবে একটি নেটিভ ড্রাইভার কোনও গেস্ট-সাইড পরিবর্তন ছাড়াই প্রয়োগ করা যেতে পারে। trout সোর্স কোডের অংশ হিসেবে একটি নমুনা মক হোস্ট এজেন্ট প্রদান করা হয়।

বর্তমান বাস্তবায়ন GNSS প্রারম্ভিকতা এবং সহায়ক GNSS (AGNSS) হোস্ট OS পরিবেশ দ্বারা পরিচালিত হবে বলে আশা করে।

জিএনএসএস আর্কিটেকচার
চিত্র 2. GNSS আর্কিটেকচার

গ্রাফিক্স

যখন AAOS অন্যান্য স্বয়ংচালিত অপারেটিং সিস্টেমের পাশাপাশি অতিথি VM হিসাবে চলছে, তখন Android-এর GPU বা ডিসপ্লে কন্ট্রোলারে সরাসরি অ্যাক্সেস নাও থাকতে পারে। এই ক্ষেত্রে, Mesa বা goldfish-opengl এবং Android গেস্ট VM এবং virtio-gpu ডিভাইসে একটি virtio-gpu ড্রাইভার GPU অ্যাক্সেস করতে ব্যবহার করা যেতে পারে।

অ্যান্ড্রয়েড গেস্ট ভিএম-এ, মেসা বা goldfish-opengl OpenGLES কমান্ডগুলিকে যথাক্রমে একটি গ্যালিয়াম স্ট্রীমে বা একটি স্বয়ংক্রিয়-উত্পন্ন GLES স্ট্রীমে এনকোড করে। virtio-gpu কার্নেল ড্রাইভার পরিবহন হিসাবে ব্যবহৃত হয়। হোস্ট সাইডে, virglrenderer (Mesa-এর জন্য) এবং vulkan-cereal ( goldfish-opengl এর জন্য) বিদ্যমান GPU ড্রাইভারের উপরে ডিকোড করা কমান্ড স্ট্রিম রিপ্লে করে। AAOS রেফারেন্স প্ল্যাটফর্ম trout শুধুমাত্র ভলকান সমর্থন সহ OpenGL ES সমর্থন করে, ভবিষ্যতে প্রকাশে প্রত্যাশিত।

গ্রাফিক্স আর্কিটেকচার
চিত্র 3. গ্রাফিক্স আর্কিটেকচার

সেন্সর

যখন AAOS অন্যান্য স্বয়ংচালিত অপারেটিং সিস্টেমের পাশাপাশি একটি অতিথি VM হিসাবে চলছে, তখন Android এর সেন্সরগুলিতে সরাসরি অ্যাক্সেস নাও থাকতে পারে। এই ক্ষেত্রে, Android গেস্ট VM-এ Virtio-SCMI ড্রাইভার এবং Host VM-এ VirtIO-SCMI ডিভাইস সেন্সর অ্যাক্সেস করতে ব্যবহার করা হয়। AAOS ভার্চুয়ালাইজেশন রেফারেন্স প্ল্যাটফর্ম একটি জেনেরিক এবং HW-অ্যাগনস্টিক সেন্সর HAL প্রদান করে যা সেন্সরগুলি অ্যাক্সেস করার জন্য ARM-ভিত্তিক SoC-এর জন্য ব্যবহার করা যেতে পারে।

সেন্সর HAL লিনাক্স কার্নেল IIO সাবসিস্টেমে IIO SCMI ড্রাইভারের সাথে যোগাযোগ করে, যা সেন্সর আবিষ্কার এবং কনফিগার করতে, সেন্সর ডেটা পড়তে এবং সেন্সর সম্পর্কে অবহিত হতে ARM সিস্টেম কন্ট্রোল অ্যান্ড ম্যানেজমেন্ট ইন্টারফেস (SCMI) স্পেসিফিকেশন দ্বারা প্রদত্ত SCMI সেন্সর ম্যানেজমেন্ট প্রোটোকল ব্যবহার করে। মান পরিবর্তন।

IIO SCMI ড্রাইভার VirtIO SCMI ড্রাইভার ব্যবহার করে, যা virtio-scmi স্পেসিফিকেশনে উল্লেখিত VirtIO ট্রান্সপোর্ট প্রোটোকল ব্যবহার করে হোস্ট VM-এ VirtIO SCMI ডিভাইসের সাথে SCMI বার্তা বিনিময় করতে। VirtIO SCMI ডিভাইসের SoC-নির্দিষ্ট সেন্সর ড্রাইভারের মাধ্যমে সেন্সরগুলিতে সরাসরি অ্যাক্সেস রয়েছে।

সেন্সর আর্কিটেকচার
চিত্র 4. সেন্সর আর্কিটেকচার

সেন্সর HAL অবস্থান

সেন্সর HAL এর রেফারেন্স বাস্তবায়ন, যা VirtIO SCMI ব্যবহার করে, device/google/trout/hal/sensors এ অবস্থিত।

সেন্সর HAL কনফিগারেশন

সেন্সর HAL কে Android গাড়ির সেন্সর সমন্বয় ব্যবস্থা মেনে চলতে হোস্ট VM থেকে প্রাপ্ত সেন্সর ডেটা পরিবর্তন করতে হতে পারে। সেন্সর কনফিগারেশনের স্কিমা device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd এ পাওয়া যাবে।

OEMs sensor_hal_configuration.xml এ সেন্সর কনফিগারেশন, যেমন ওরিয়েন্টেশন এবং অবস্থান প্রদান করতে পারে এবং ফাইলটিকে /odm/etc/sensors/ অথবা /vendor/etc/sensors/ এ কপি করতে পারে। একটি নমুনা সেন্সর কনফিগারেশন নীচে প্রদান করা হয়েছে:

<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0">
            <sensors>
                <sensor name="scmi.iio.accel" type="1">
                    <configuration>
<!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with //
        the Android car sensor coordinate system -->
                        <orientation rotate="true">
               <!-- Attribute map denotes the indexes of data in sensor data received -->
               <!-- Attribute negate denotes if data needs to be negated -->
                            <x map="0" negate="false"/>
                            <y map="1" negate="true"/>
                            <z map="2" negate="true"/>
                        </orientation>
                        <location>
               <!-- Attribute x, y, z denotes location of the sensor placement -->
                            <x>10</x>
                            <y>15</y>
                            <z>20</z>
                        </location>
                    </configuration>
                </sensor>
         </sensors>
        </module>
    </modules>
</sensorHalConfiguration>

যানবাহন HAL

যানবাহন HAL বাস্তবায়ন দুটি উপাদান নিয়ে গঠিত:

  • ক্লায়েন্ট ভার্চুয়ালাইজড AAOS-এ Android দ্বারা ব্যবহৃত API প্রদান করে
  • সার্ভার। হার্ডওয়্যারের সাথে সরাসরি যোগাযোগ করে, যেমন যানবাহন বাস (বা একটি এমুলেটর)।

ভার্চুয়ালাইজেশনে, VHAL সার্ভার হোস্ট VM-এ চলে। VHAL ক্লায়েন্ট এবং সার্ভার GRPC-vsock এর মাধ্যমে যোগাযোগ করে (আরো তথ্যের জন্য, device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto দেখুন)। OEMs যোগাযোগ APIs ওভাররাইড করে GRPC ছাড়া অন্য একটি ভিন্ন পরিবহন প্রোটোকল ব্যবহার করতে পারে। উদাহরণের জন্য, device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp দেখুন।

অন্যান্য সাবসিস্টেম

VirtIO ইতিমধ্যেই ব্লক স্টোরেজ, নেটওয়ার্ক, কনসোল, ইনপুট, সকেট এবং এনট্রপির মতো উপাদানগুলির জন্য একটি সু-সংজ্ঞায়িত ইন্টারফেস প্রদান করে। এই সাব-সিস্টেমের জন্য, AAOS ড্রাইভারকে যেমন-ই ব্যবহার করে, যেমন virtio-blk , virtio-input , virtio-console , এবং virtio-net

ভার্চুয়ালাইজড AAOS রেফারেন্স প্ল্যাটফর্মে, Wi-Fi একটি VirtWifi ওয়্যারলেস নেটওয়ার্ক সক্ষম করতে mac80211_hwsim এর সাথে সমর্থিত, যা তারপরে হোস্ট VM-এ নেটওয়ার্ক ট্রাফিক পাঠাতে virtio-net টানেল ব্যবহার করে, যার প্রকৃত Wi-Fi নেটওয়ার্কে সরাসরি অ্যাক্সেস রয়েছে।