HAL, হার্ডওয়্যার ভেন্ডরদের প্রয়োগ করার জন্য একটি স্ট্যান্ডার্ড ইন্টারফেসকে সংজ্ঞায়িত করে, যা Android-কে লোয়ার-লেভেল ড্রাইভার প্রয়োগের ব্যাপারে উদাসীন থাকতে সাহায্য করে। HAL ব্যবহার করলে, উচ্চ-স্তরের সিস্টেমে কোনও প্রভাব বা পরিবর্তন না করেই আপনি কার্যকারিতা প্রয়োগ করতে পারবেন। এই পৃষ্ঠায় পুরনো আর্কিটেকচার সম্পর্কে বর্ণনা করা হয়েছে, যা Android 8.0 থেকে আর কাজ করে না। Android 8.0 ও এর পরের যেকোনও ভার্সনের জন্য, HAL ওভারভিউ দেখুন।
ছবি ১. HAL কম্পোনেন্ট
আপনার প্রোডাক্ট যে নির্দিষ্ট
হার্ডওয়্যার প্রদান করে তার জন্য আপনাকে অবশ্যই সংশ্লিষ্ট HAL (ও ড্রাইভার) প্রয়োগ করতে হবে। HAL ইমপ্লিমেন্টেশন সাধারণত শেয়ার করা লাইব্রেরি মডিউলে (.so ফাইল)
তৈরি করা হয়, তবে Android যেহেতু HAL ইমপ্লিমেন্টেশন ও ডিভাইস ড্রাইভারের মধ্যে
স্ট্যান্ডার্ড ইন্টার্যাকশন বাধ্যতামূলক করে না, তাই আপনার পরিস্থিতির জন্য
যা সবচেয়ে ভাল তা আপনি করতে পারেন। তবে, আপনার হার্ডওয়্যারের সাথে Android সিস্টেমকে
সঠিকভাবে ইন্টার্যাক্ট করতে দেওয়ার জন্য, আপনাকে অবশ্যই প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL ইন্টারফেসে
সংজ্ঞায়িত কন্ট্র্যাক্ট মেনে চলতে হবে।
HAL-এর স্ট্রাকচার যাতে অনুমান করা যায় তা নিশ্চিত করতে, প্রতিটি হার্ডওয়্যার-নির্দিষ্ট
HAL ইন্টারফেসের প্রপার্টি
hardware/libhardware/include/hardware/hardware.h-এ সংজ্ঞায়িত করা আছে। এই ইন্টারফেস
Android সিস্টেমকে আপনার HAL মডিউলের সঠিক ভার্সন একটি
ধারাবাহিক পদ্ধতিতে লোড করার অনুমতি দেয়। HAL ইন্টারফেসে দুটি কম্পোনেন্ট থাকে: মডিউল ও ডিভাইস।
HAL মডিউল
একটি মডিউল আপনার প্যাকেজ করা HAL ইমপ্লিমেন্টেশনকে দেখায়, যা একটি
শেয়ার করা লাইব্রেরি (.so file) হিসেবে স্টোর করা হয়।
hardware/libhardware/include/hardware/hardware.h হেডার ফাইল
একটি স্ট্রাক্ট (hw_module_t) সংজ্ঞায়িত করে যা একটি মডিউলকে দেখায় এবং
এতে মডিউলের ভার্সন, নাম এবং লেখকের মতো মেটাডেটা থাকে। Android
HAL মডিউল খুঁজে পেতে এবং সঠিকভাবে লোড করতে এই মেটাডেটা ব্যবহার করে।
এছাড়াও, hw_module_t struct-এ
অন্য struct, hw_module_methods_t-এর একটি পয়েন্টার থাকে, যার মধ্যে মডিউলের
একটি খোলা ফাংশনের পয়েন্টার থাকে। এই ওপেন ফাংশনটি হার্ডওয়্যারের সাথে যোগাযোগ শুরু করতে ব্যবহৃত হয় যার জন্য HAL একটি অ্যাবস্ট্রাকশন হিসাবে কাজ করছে।
প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL সাধারণত সেই নির্দিষ্ট হার্ডওয়্যারের জন্য অতিরিক্ত তথ্য সহ জেনেরিক hw_module_t
struct-কে এক্সটেন্ড করে। যেমন, ক্যামেরা HAL-এ, camera_module_t struct-এ একটি
hw_module_t struct সহ অন্যান্য ক্যামেরা-নির্দিষ্ট ফাংশন
পয়েন্টার থাকে:
typedef struct camera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;
আপনি HAL প্রয়োগ করে মডিউল স্ট্রাক্ট তৈরি করলে, আপনাকে অবশ্যই এটির নাম
HAL_MODULE_INFO_SYM রাখতে হবে। Nexus 9 অডিও HAL থেকে উদাহরণ:
struct audio_module HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = AUDIO_MODULE_API_VERSION_0_1,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = AUDIO_HARDWARE_MODULE_ID,
.name = "NVIDIA Tegra Audio HAL",
.author = "The Android Open Source Project",
.methods = &hal_module_methods,
},
};
HAL ডিভাইস
ডিভাইস আপনার প্রোডাক্টের হার্ডওয়্যারকে অ্যাবস্ট্র্যাক্ট করে। যেমন, একটি অডিও মডিউলে প্রাইমারি অডিও ডিভাইস, USB অডিও ডিভাইস বা ব্লুটুথ A2DP অডিও ডিভাইস থাকতে পারে।
hw_device_t স্ট্রাকচার দিয়ে ডিভাইসকে বোঝানো হয়। মডিউলের মতো, প্রতিটি ধরনের ডিভাইস জেনেরিক
hw_device_t-এর বিস্তারিত ভার্সন নির্ধারণ করে, যার মধ্যে হার্ডওয়্যারের নির্দিষ্ট ফিচারের
ফাংশন পয়েন্টার থাকে। যেমন, audio_hw_device_t স্ট্রাক্ট টাইপে
অডিও ডিভাইস অপারেশনের জন্য ফাংশন পয়েন্টার থাকে:
struct audio_hw_device {
struct hw_device_t common;
/**
* used by audio flinger to enumerate what devices are supported by
* each audio_hw_device implementation.
*
* Return value is a bitmask of 1 or more values of audio_devices_t
*/
uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
...
};
typedef struct audio_hw_device audio_hw_device_t;
এইসব স্ট্যান্ডার্ড প্রপার্টি ছাড়াও, প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL ইন্টারফেস আরও নিজস্ব ফিচার ও প্রয়োজনীয়তা নির্ধারণ করতে পারে। বিস্তারিত জানতে, HAL রেফারেন্স ডকুমেন্টেশন এবং প্রতিটি HAL-এর জন্য আলাদা নির্দেশাবলী দেখুন।
HAL মডিউল তৈরি করা
HAL ইমপ্লিমেন্টেশন মডিউল (.so) ফাইলে তৈরি করা হয় এবং
প্রয়োজন অনুযায়ী Android-এর মাধ্যমে ডায়নামিকালি লিঙ্ক করা হয়। আপনি
আপনার প্রতিটি HAL ইমপ্লিমেন্টেশনের জন্য Android.mk ফাইল তৈরি করে
এবং আপনার সোর্স ফাইলকে পয়েন্ট করে আপনার মডিউল তৈরি করতে পারবেন। সাধারণত, আপনার শেয়ার করা লাইব্রেরিগুলিকে
একটি নির্দিষ্ট ফর্ম্যাটে নাম দিতে হবে যাতে সেগুলি সঠিকভাবে খুঁজে পাওয়া ও লোড করা যায়। নামকরণের
পদ্ধতি মডিউল অনুযায়ী সামান্য আলাদা হয়, তবে সাধারণত এই প্যাটার্ন
অনুসরণ করা হয়: <module_type>.<device_name>।