LightsService.java
public void setBrightness(int brightness, int brightnessMode) {
synchronized (this) {
int color = brightness & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
}
}
com_android_server_LightsService.cpp
static void setLight_native(JNIEnv *env, jobject clazz, int ptr,
int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)
{
Devices* devices = (Devices*)ptr;
light_state_t state;
if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {
return ;
}
memset(&state, 0, sizeof(light_state_t));
state.color = colorARGB;
state.flashMode = flashMode;
state.flashOnMS = onMS;
state.flashOffMS = offMS;
state.brightnessMode = brightnessMode;
devices->lights[light]->set_light(devices->lights[light], &state);
}
Lights.c
static int open_lights(const struct hw_module_t* module, char const* name,
struct hw_device_t** device)
{
int (*set_light)(struct light_device_t* dev,
struct light_state_t const* state);
LOGD("open_lights!name = %s\n",name);
if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
set_light = set_light_backlight;
}
else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
set_light = set_light_keyboard;
}
else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
set_light = set_light_buttons;
}
else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
set_light = set_light_battery;
}
else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
set_light = set_light_notifications;
}
else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
set_light = set_light_attention;
}
else {
return -EINVAL;
}
pthread_once(&g_init, init_globals);
struct light_context_t *dev = (struct light_context_t *)malloc(sizeof(struct light_context_t));
memset(dev, 0, sizeof(struct light_context_t));
LOGD("light set back linghts!name = %s\n",name);
if(0 == strcmp(LIGHT_ID_BACKLIGHT, name))
{
dev->fd = open("/dev/disp", O_RDONLY);
if (dev->fd < 0)
{
LOGE("Failed to open display device dev->fd = %x\n",dev->fd);
}
}
dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.version = 0;
dev->device.common.module = (struct hw_module_t*)module;
dev->device.common.close = (int (*)(struct hw_device_t*))close_lights;
dev->device.set_light = set_light;
*device = (struct hw_device_t*)dev;
return 0;
error:
free(dev);
return -EINVAL;
}
static int
rgb_to_brightness(struct light_state_t const* state)
{
int color = state->color & 0x00ffffff;
int bright;
#define min_progress_bar 0x14
#define max_progress_bar 0xFF
#ifndef MIN_BACKLIGHT
#define min_real_bright 0x28
#else
#define min_real_bright (MIN_BACKLIGHT)
#endif
#ifndef MAX_BACKLIGHT
#define max_real_bright 0xB5
#else
#define max_real_bright (MAX_BACKLIGHT)
#endif
bright = ((77*((color>>16)&0x00ff)) + (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8;
//support backlight 0-255
//bright = bright >> 4;
if(bright<min_progress_bar)
bright=min_progress_bar;
else if(bright>max_progress_bar)
bright=max_progress_bar;
//鍧囧寑璋冭妭浜害
bright=((bright-min_progress_bar )*(max_real_bright-min_real_bright))/(max_progress_bar-min_progress_bar);
bright += min_real_bright;
//LOGD("real bright = 0x%x\n",bright);
return bright;
}
static int
set_light_backlight(struct light_device_t* dev,
struct light_state_t const* state)
{
struct light_context_t *ctx;
int err = 0;
int brightness = rgb_to_brightness(state);
pthread_mutex_lock(&g_lock);
g_backlight = brightness;
ctx = (struct light_context_t *)dev;
unsigned long args[3];
args[0] = 0;
args[1] = brightness;
args[2] = 0;
err = ioctl(ctx->fd,DISP_CMD_LCD_SET_BRIGHTNESS,args);
if(err == 0)
{
g_backlight = brightness;
}
pthread_mutex_unlock(&g_lock);
return err;
}