1. 程式人生 > >Android燈光系統框架分析【轉】

Android燈光系統框架分析【轉】

本文轉載自:

首先別人的APP要能直接訪問到你寫的硬體或者不經過任何修改的APP能直接使用你的驅動,就需要使用系統自帶的JNI,所以我們需要寫出符合系統自帶JNI檔案的HAL檔案和驅動程式,下面具體分析一個這個HAL和驅動程式需要實現什麼。

燈光系統由以下四個檔案組成

APP:電池燈APP,通知燈APP,背光燈APP
JNI :com_android_server_lights_LightsService.cpp
HAL:我們自己實現,實現一個lights.c
驅動:leds_nanopi3.c(JNI需要什麼這裡就給它提供什麼,這裡我們實現亮滅閃爍和亮度)

燈光系統的主要功能:

硬體上是屬於同一個的有(包括顏色和閃爍):
電池燈:電池電量發生變化時顏色會發生變化
通知燈:有通知會閃爍,比如未接電話或簡訊

調節LCD亮度:
背光燈

驅動部分:

JNI:
com_android_server_lights_LightsService.cpp(不需要我們實現,但我們需要給它提供介面)

裡面需要獲得hw_module_t結構體,所以我們的HAL需要實現這個結構體

JNI裡面的get_device會根據不同的名字呼叫module->methods->open返回不同的light_device_t結構體,這個結構體裡面帶有set_light,即不同燈的控制函式

*********************lights.h*********************

#define LIGHT_ID_BACKLIGHT          "backlight"
#define LIGHT_ID_KEYBOARD           "keyboard"
#define LIGHT_ID_BUTTONS            "buttons"
#define LIGHT_ID_BATTERY            "battery"
#define LIGHT_ID_NOTIFICATIONS      "notifications"
#define LIGHT_ID_ATTENTION          "attention"
1
2
3
4
5
6
7
8
這裡我們只實現LIGHT_ID_BACKLIGHT(背光)、LIGHT_ID_BATTERY(電池)、LIGHT_ID_NOTIFICATIONS(通知)

HAL:
把硬體LED再次劃分為不同的邏輯燈
1. 實現hw_module_t結構體
2. 實現open函式,它會根據name返回不同的light_device_t結構體
3. 針對不同的燈(背光/電池/通知),實現對應的set_light函式

struct light_device_t {
    struct hw_device_t common;
    int (*set_light)(struct light_device_t* dev,
            struct light_state_t const* state);
};
1
2
3
4
5
這裡需實現三個set_light函式

set_light_battery (struct light_device_t *dev, struct light_state_t const* state)
set_light_notifications (struct light_device_t *dev, struct light_state_t const* state)
set_light_backlight (struct light_device_t *dev, struct light_state_t const *state)
1
2
3
通過這些函式裡面操作驅動程式

驅動程式:
1. 對於RGB三個LED,實現亮滅閃爍三個功能
2. 對於背光燈,設定PWM

總結:
我們只需要實現一個HAL和一個驅動程式,HAL裡面我們只需要實現hw_module_t結構體和一個open函式,open函式根據傳進來的不同的name構造不同的light_device_t結構體,最後指向不同的set_light函式操作驅動程式,下一章具體實現這些程式碼。