背光亮度调节

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值