HAL硬件抽象層(理解)

      安卓開發中的抽象層位於linux kernel之上,JNI之下,簡單就是實現的就是對底層linux kernel上設備驅動的封裝,使安卓系統不開源。linux

主要原理:安卓HAL層,簡單的說是對Linux kernel的簡單封裝,向上提供接口,屏蔽底層的實現細節。把對硬件的支持分紅兩層:用戶空間,內核空間。若是把對硬件支持的全部代碼都放在內核層,就是開源,別人就能看到你的硬件的相關參數和實現,因此安卓把硬件的支持分紅HAL和內核驅動層,內核驅動層只提供簡單的訪問硬件邏輯。例如讀寫硬件寄存器的通道,至於從硬件中讀到了什麼值或者寫了什麼值到硬件中的邏輯,都放到HAL層中了。函數

也正是由於這種緣由,HAL層屏蔽了不用硬件平臺的差別,給應用程序開發提供了一個統一接口this

HAL層中有三個重要的結構體,它們分別是:hw_module_t、hw_device_t和hw_ module_methods_t。spa

顧名思義hw就是hardware,hw_module_t呢就是就是硬件模塊結構體。hw_device_t呢就是硬件設備結構體,hw_module_methods_t就是硬件模塊方法結構體。指針

      在源碼的/hardware/libhardware/include/hardware下有hardware.h文件。裏面詳細介紹了這三個結構體的成員。在這裏簡單的說一下,只是簡單理解。接口

      在hw_device_t結構體中有一個成員變量是ci

          /** reference to the module this device belongs to */
               struct hw_module_t* module;   //能夠理解爲這個設備的模塊結構體
開發

     還有一個變量是 源碼

       /** Close this device */
           int (*close)(struct hw_device_t* device); //這是一個函數指針,意思是這裏有個關閉這個設備的函數(關於函數指針詳解請看。。。)。io

hw_device_t結構體中就先看這麼多。由於設備結構體裏有了一個設備的模塊結構體,因此咱們來看一下模塊結構體 hw_module_t。

     在hw_module_t結構體中呢有一個重要的成員是

  /** Modules methods */
    struct hw_module_methods_t* methods;
 //能夠看出這是一個成員方法。

其餘的成員先不分析,接着看hw_module_methods_t結構體

typedef struct hw_module_methods_t {
    /** Open a specific device */
    int (*open)(const struct hw_module_t* module, const char* id,
            struct hw_device_t** device);
} hw_module_methods_t;

hw_module_methods_t結構體中呢只有一個函數指針,意思是打開一個特定的設備。因此這就是一個打開設備的方法。相對的hw_device_t裏面有一個關閉設備的方法,這就對應上了。

      硬件抽象層,顧名思義,就是抽象硬件,主要就是硬件,也就是一個設備。設備呢,有了一個設備結構體(hw_device_t),這個設備結構體有模塊,因此就引出了設備模塊結構體(hw_module_t),設備模塊結構體裏有一個模塊方法結構體(hw_module_methods_t),方法結構體有一個打開函數,設備結構體裏有關閉函數,因此就有的打開和關閉這個設備的函數,其餘的像讀啊寫啊ioctl函數等能夠實如今設備結構體裏,由於原本就是設備的操做方法嘛。

      大體瞭解了這三個結構體和有關思路後,接下來咱們就看看怎麼使用它們。

(接觸安卓底層時間不長,若是有不對的地方請當即指正!感激涕零!)