1. 程式人生 > >Android中的模組(module)與裝置(device)

Android中的模組(module)與裝置(device)

轉自  https://blog.csdn.net/a345017062/article/details/6423866

 

以backlight這種裝置為例來說明一下Android系統中模組與裝置的關係。Android中的backlight、keyboard等多個裝置都使用同一個名字為lights的模組(即/system/lib/hw/light.xxx.so)來進行操作。

 

涉及到的檔案有:

/hardware/libhardware/hardware.c

/hardware/include/libhardware/hardware.h

/hardware/include/libhardware/lights.h

/hardware/msm7k/liblights/lights.c

這其中,hardware.c是提供給上層訪問所有硬體裝置的通用介面,負責載入某一種裝置的操作模組(比在這裡就是負責載入用於操作backlight等裝置的lights模組的)。

而lights.c是系統中的lights模組原始碼。

 

先看一下總介面hardware.c吧。

這裡面兩個函式做了三件事:檢索模組、載入模組、提取模組資訊。我著重看一下提取模組資訊:

hmi = (struct hw_module_t *)dlsym(handle, sym);

其中的sym永遠都是字串HMI,即hardware module information。最後得到的hw_module_t結構體包含了一個模組的所有資訊,這裡都有什麼呢?可以在hardware.h中看一下hw_module_t的定義。

hardware.h中的每一項在一個模組中都要進行定義,lights模組當然也是。看一下lights.c中,唯一作用範圍是全域性的也就是這個東西了:

const struct hw_module_t HAL_MODULE_INFO_SYM = {

    .tag = HARDWARE_MODULE_TAG,

    .version_major = 1,

    .version_minor = 0,

    .id = LIGHTS_HARDWARE_MODULE_ID,

    .name = "QCT MSM7K lights Module",

    .author = "Google, Inc.",

    .methods = &lights_module_methods,

};

這就是前面通過dlsym提取出來的模組資訊。其中的.methods欄位就是對當前模組進行操作的函式集合。

 

好了。現在我們要對backlight這個裝置進行操作,應該怎麼辦呢?

第一步,載入模組。先確定這個裝置使用的模組,這裡是lights。使用hardware.c中的hw_get_module把這個模組開啟,並獲取裡面的模組資訊(hw_module_t)。

第二步,開啟裝置。使用lights的.methods中提供的.open函式open_lights開啟名字為backlight的裝置,獲取裝置資訊hw_device_t。hw_device_t裡面包含了裝置的屬性和操作函式集合。

第三步,關閉裝置。

 

關於這幾步的程式碼,可以看一下這裡

Android螢幕背光調整機制

http://blog.csdn.net/a345017062/archive/2011/05/14/6420239.aspx