AAOS-এ VirtIO সমর্থন করার জন্য প্রয়োজনীয় বেশিরভাগ পরিবর্তনই অ্যান্ড্রয়েড কমন কার্নেলের HAL ইমপ্লিমেন্টেশন লেভেল এবং তার নিচের স্তরে করতে হয়। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক AAOS গেস্ট VM কার্নেলে থাকা VirtIO ড্রাইভার ব্যবহার করে একটি জেনেরিক হার্ডওয়্যার-অ্যাগনস্টিক HAL-এর সাথে যোগাযোগ করে, যা আবার VirtIO প্রোটোকল ব্যবহার করে হোস্ট সাইডের VirtIO ডিভাইসগুলোর সাথে যোগাযোগ করে। হোস্ট সাইডের VirtIO ডিভাইসগুলো SoC-নির্দিষ্ট ডিভাইস ড্রাইভার ব্যবহার করে ফিজিক্যাল হার্ডওয়্যার অ্যাক্সেস করতে পারে।
VirtIO ড্রাইভার এবং VirtIO ডিভাইসের মধ্যে যোগাযোগ virtqueue এর মাধ্যমে সম্পন্ন হয়, যা হলো স্ক্যাটার গ্যাদার লিস্টের DMA-সদৃশ রিং বাফার। VM-গুলোর মধ্যে VirtIO মেসেজ আদান-প্রদানের জন্য MMIO বা PCI-এর মতো বিভিন্ন ট্রান্সপোর্ট ব্যবহার করা যেতে পারে।
কিছু ক্ষেত্রে, বিভিন্ন ভিএম-এর মধ্যে যোগাযোগের জন্য vsock ব্যবহৃত হয়। একটি vsock ইন্টারফেসের মাধ্যমে আলাদা ভিএম-এ থাকা পিয়ার এজেন্টের সাথে সংযোগ স্থাপন করে ভেহিকল এইচএএল (VHAL), অডিও কন্ট্রোল এবং ডাম্পস্টেট কমিউনিকেশন সমর্থন করা হয়। এই অ-মানসম্মত সাবসিস্টেমগুলো অ্যাক্সেস করার জন্য vsock এর উপর gRPC ব্যবহৃত হয়। অ্যান্ড্রয়েড সোর্স ট্রিতে থাকা gRPC-কে vsock:CID:PORT_NUMBER অ্যাড্রেস ফরম্যাট ব্যবহার করে vsock এর সাথে কাজ করার জন্য পরিবর্তন করা হয়েছে।

চিত্র ১. ভার্চুয়ালাইজেশন স্থাপত্য।
অডিও
ভার্চুয়ালাইজড AAOS-এ, অ্যান্ড্রয়েড গেস্ট ভিএম অডিও অ্যাক্সেস করার জন্য virtio-snd ব্যবহার করতে পারে। virtio-snd অ্যান্ড্রয়েড ভিএম-কে ভার্চুয়ালাইজড PCM ডিভাইসগুলো সরবরাহ করে, যাতে অডিও 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 গেস্ট VM-এ একটি অডিও কন্ট্রোল সার্ভার ডেমন চালু থাকে, যা অন্যান্য VM থেকে অডিও ফোকাসের অনুরোধ গ্রহণ করার জন্য vsock উপর gRPC ব্যবহার করে। হোস্ট VM, AAOS-এ অডিও কন্ট্রোল অনুরোধ পাঠানোর জন্য device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller ব্যবহার করতে পারে। যতক্ষণ libandroid_audio_controller অডিও ফোকাস ধরে রাখে, ফোকাস ছেড়ে না দেওয়া পর্যন্ত এটি AAOS-এ হার্টবিট পাঠাতে থাকে।

চিত্র ২. অডিও স্থাপত্য।
ব্লুটুথ
ব্লুটুথ বাস্তবায়নটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

চিত্র ৩. ব্লুটুথ স্থাপত্য।
ব্লুটুথ হ্যান্ডস-ফ্রি প্রোফাইল
trout এ ব্লুটুথ হ্যান্ডস-ফ্রি প্রোফাইল (HFP) সক্রিয় করার জন্য, VirtIO সাউন্ড ডিভাইস স্পেসিফিকেশনকে অডিও কন্ট্রোল সমর্থন করার জন্য প্রসারিত করা হয়েছে। এই পদ্ধতি ব্যবহার করে, হোস্ট/হাইপারভাইজর প্রান্তের একটি VirtIO সাউন্ড ডিভাইস HFP সম্পর্কিত এই তিনটি অডিও কন্ট্রোল প্রদান করে:
-
hfp_enable -
hfp_set_sampling_rate -
hfp_volume
যখন AAOS একটি গেস্ট ভিএম হিসেবে চলে, তখন এটি এই অডিও কন্ট্রোলগুলো সেট করার জন্য TinyALSA ব্যবহার করে। HFP ব্যবহারের ক্ষেত্রটি সক্রিয় করতে, হোস্ট/হাইপারভাইজর সেই অনুযায়ী ভেন্ডর-নির্দিষ্ট রাউটিং এবং ক্যালিব্রেশন সম্পাদন করে।
ব্লুটুথ বাস্তবায়নটি নিম্নলিখিত ডিজাইন চিত্রের উপর ভিত্তি করে তৈরি করা হয়েছে:

চিত্র ৪. ব্লুটুথ স্থাপত্য।
ডাম্পস্টেট
ভার্চুয়ালাইজড AAOS-এর জন্য বাগ রিপোর্ট তৈরি করার সময় হোস্ট ভিএম-এর তথ্য অন্তর্ভুক্ত করা মূল্যবান, যাতে ডেভেলপাররা সিস্টেমটি সম্পর্কে আরও বিস্তারিত ধারণা পান। এটি করার জন্য, trout রেফারেন্স ইমপ্লিমেন্টেশন IDumpstateDevice HAL প্রয়োগ করে, যা vsock মাধ্যমে gRPC ব্যবহার করে হোস্ট ভিএম-এর তথ্য সংগ্রহ করে। বাগ রিপোর্টে tar প্যাকেজ করা হোস্ট ভিএম-এর তথ্যের নাম dumpstate_board.bin রাখা হয়, আর ডাম্পিং লগগুলো dumpstate_board.txt ফাইলে থাকে।
কার্যকর করার জন্য কমান্ডগুলো কনফিগার করতে:
- নিচের ফাইল থেকে কনফিগারেশনের বিবরণগুলো একটি 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> - চালু করার সময় ডাম্পস্টেট সার্ভারে নতুন XML ফাইলের পাথটি দিন, উদাহরণস্বরূপ:
--config_file my_config.xml
বর্ধিত দৃশ্য ব্যবস্থা
এক্সটেন্ডেড ভিউ সিস্টেম (EVS) রিয়ার-ভিউ এবং সারাউন্ড-ভিউ ক্যামেরা দ্বারা ধারণ করা ভিডিও প্রদর্শন করে। ভার্চুয়ালাইজড AAOS-এ, EVS স্ট্যাকটি VirtIO-ভিডিও ড্রাইভার ব্যবহারকারী ভার্চুয়ালাইজড V4L2 স্ট্রিমিং ডিভাইস থেকে ভিডিও স্ট্রিম অ্যাক্সেস করতে পারে।
গ্যারেজ মোড
VHAL দ্বারা প্রেরিত AP_POWER_STATE_REQ প্রোপার্টিগুলোর মাধ্যমে গ্যারেজ মোডে প্রবেশ এবং প্রস্থান নিয়ন্ত্রিত হয়। ভার্চুয়ালাইজেশন মোডে, হোস্ট সাইড থেকে গ্যারেজ মোড চালু করা হয়। অ্যান্ড্রয়েড বন্ধ না হওয়া পর্যন্ত, অ্যান্ড্রয়েড ভিএম-এর জন্য ভার্চুয়াল ডিভাইস সরবরাহ করতে হোস্ট ভিএম-টিকে চালু রাখা উচিত। হোস্ট ভিএম-এর VHAL সার্ভার AAOS গেস্ট ভিএম-কে শাটডাউন সিগন্যাল পাঠায়। VHAL ক্লায়েন্টের কাছ থেকে সিগন্যালটি পাওয়ার পর, AAOS ভিএম গ্যারেজ মোডে প্রবেশ করে এবং হোস্ট ভিএম-কে সক্রিয় রাখতে হার্টবিট সিগন্যাল পাঠানো শুরু করে। আরও তথ্যের জন্য, গ্যারেজ মোড দেখুন।
গ্লোবাল নেভিগেশন স্যাটেলাইট সিস্টেম (GNSS)
trout ১.০-তে virtio-console মাধ্যমে জিএনএসএস ভার্চুয়ালাইজেশনের জন্য সমর্থন অন্তর্ভুক্ত করা হয়েছে। এই বাস্তবায়নটি হোস্ট থেকে গেস্টের কাছে র মেজারমেন্ট এবং লোকেশন ফিক্স বিনিময় সমর্থন করে।
ডেটা আদান-প্রদানের ফরম্যাটটি হলো GNSSLogger অ্যাপে ব্যবহৃত CSV। রেফারেন্স ইমপ্লিমেন্টেশনে নেটিভ GNSS ড্রাইভারটি উপলব্ধ নয়, তাই মক ডেটা পাওয়া যায়। আপনি গেস্ট-সাইডে কোনো পরিবর্তন ছাড়াই একটি নেটিভ ড্রাইভার ইমপ্লিমেন্ট করতে পারেন। trout সোর্স কোডের অংশ হিসেবে একটি নমুনা মক হোস্ট এজেন্ট সরবরাহ করা হয়েছে।
এই বাস্তবায়নে আশা করা হয় যে, জিএনএসএস ইনিশিয়ালাইজেশন এবং অ্যাসিস্টেড জিএনএসএস (এজিএনএসএস) হোস্ট ওএস এনভায়রনমেন্ট দ্বারা পরিচালিত হবে।

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

চিত্র ৬. গ্রাফিক্স স্থাপত্য।
সেন্সর
যখন AAOS অন্যান্য অটোমোটিভ অপারেটিং সিস্টেমের সাথে গেস্ট ভিএম হিসেবে চলে, তখন অ্যান্ড্রয়েডের সেন্সরগুলিতে সরাসরি অ্যাক্সেস নাও থাকতে পারে। এই ক্ষেত্রে, আপনি অ্যান্ড্রয়েড গেস্ট ভিএম-এ Virtio-SCMI ড্রাইভার এবং হোস্ট ভিএম-এ VirtIO-SCMI ডিভাইস ব্যবহার করে সেন্সরগুলি অ্যাক্সেস করতে পারেন। AAOS ভার্চুয়ালাইজেশন রেফারেন্স প্ল্যাটফর্ম একটি জেনেরিক এবং হার্ডওয়্যার-নিরপেক্ষ সেন্সর HAL প্রদান করে, যা আপনি ARM-ভিত্তিক SoC-গুলির জন্য সেন্সর অ্যাক্সেস করতে ব্যবহার করতে পারেন।
সেন্সর HAL, লিনাক্স কার্নেলের IIO সাবসিস্টেমে থাকা IIO SCMI ড্রাইভারের সাথে যোগাযোগ করে, যা ARM সিস্টেম কন্ট্রোল অ্যান্ড ম্যানেজমেন্ট ইন্টারফেস (SCMI) স্পেসিফিকেশন দ্বারা প্রদত্ত SCMI সেন্সর ম্যানেজমেন্ট প্রোটোকল ব্যবহার করে সেন্সর আবিষ্কার ও কনফিগার করতে, সেন্সর ডেটা পড়তে এবং সেন্সরের মানের পরিবর্তন সম্পর্কে অবহিত হতে পারে।
IIO SCMI ড্রাইভারটি VirtIO SCMI ড্রাইভার ব্যবহার করে, যা হোস্ট VM-এ থাকা VirtIO SCMI ডিভাইসের সাথে SCMI মেসেজ আদান-প্রদানের জন্য virtio-scmi স্পেসিফিকেশনের VirtIO ট্রান্সপোর্ট প্রোটোকল ব্যবহার করে। VirtIO SCMI ডিভাইসটি SoC-নির্দিষ্ট সেন্সর ড্রাইভারের মাধ্যমে সেন্সরগুলোতে সরাসরি অ্যাক্সেস পায়।

চিত্র ৭. সেন্সরের গঠন।
সেন্সর HAL অবস্থান
সেন্সর HAL-এর রেফারেন্স ইমপ্লিমেন্টেশন, যা VirtIO SCMI ব্যবহার করে, device/google/trout/hal/sensors এ অবস্থিত।
সেন্সর HAL কনফিগারেশন
অ্যান্ড্রয়েড কার সেন্সর কোঅর্ডিনেট সিস্টেমের সাথে সামঞ্জস্য রাখার জন্য সেন্সর HAL-কে হোস্ট VM থেকে প্রাপ্ত সেন্সর ডেটা পরিবর্তন করতে হতে পারে। সেন্সর কনফিগারেশনের স্কিমাটি device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd ফাইলে পাওয়া যাবে।
OEM-রা 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>
যানবাহন এইচএএল
ভেহিকেল এইচএএল (ভিএইচএএল) বাস্তবায়ন দুটি উপাদান নিয়ে গঠিত:
- ক্লায়েন্ট। ভার্চুয়ালাইজড AAOS-এ অ্যান্ড্রয়েড দ্বারা ব্যবহৃত API সরবরাহ করে।
- সার্ভার। সরাসরি হার্ডওয়্যারের সাথে যোগাযোগ করে, যেমন যানবাহনের বাস (বা একটি এমুলেটর)।
ভার্চুয়ালাইজেশনে, VHAL সার্ভারটি হোস্ট VM-এ চলে। VHAL ক্লায়েন্ট এবং সার্ভার vsock মাধ্যমে gRPC ব্যবহার করে যোগাযোগ করে। আরও তথ্যের জন্য, device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto দেখুন। OEM-রা কমিউনিকেশন API ওভাররাইড করে gRPC ছাড়া অন্য কোনো ট্রান্সপোর্ট প্রোটোকল ব্যবহার করতে পারে। উদাহরণের জন্য, device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp দেখুন।
অন্যান্য উপ-সিস্টেম
VirtIO ইতিমধ্যেই ব্লক স্টোরেজ, নেটওয়ার্ক, কনসোল, ইনপুট, সকেট এবং এনট্রপির মতো কম্পোনেন্টগুলোর জন্য একটি সুনির্দিষ্ট ইন্টারফেস প্রদান করে। এই সাবসিস্টেমগুলোর জন্য, AAOS ড্রাইভারগুলোকে সরাসরি ব্যবহার করে, যেমন virtio-blk , virtio-input , virtio-console এবং virtio-net ।
ভার্চুয়ালাইজড AAOS রেফারেন্স প্ল্যাটফর্মে, mac80211_hwsim এর মাধ্যমে Wi-Fi সাপোর্ট করা হয়, যা একটি VirtWifi ওয়্যারলেস নেটওয়ার্ক চালু করে। এই নেটওয়ার্কটি পরবর্তীতে virtio-net টানেল ব্যবহার করে নেটওয়ার্ক ট্র্যাফিক হোস্ট VM-এ পাঠায়, যেটির প্রকৃত Wi-Fi নেটওয়ার্কে সরাসরি অ্যাক্সেস থাকে।