android(linux) 背光流程

1. 上层处理

PowerManagerService.java (frameworks\base\services\java\com\android\server)


  1. private LightsService.Light mLcdLight; 
  2.  
  3.     private void setLightBrightness(int mask, int value) { 
  4.         int brightnessMode = (mAutoBrightessEnabled 
  5.                             ? LightsService.BRIGHTNESS_MODE_SENSOR 
  6.                             : LightsService.BRIGHTNESS_MODE_USER); 
  7.         if ((mask & SCREEN_BRIGHT_BIT) != 0) { 
  8.             if (DEBUG_SCREEN_ON) { 
  9.                 RuntimeException e = new RuntimeException("here"); 
  10.                 e.fillInStackTrace(); 
  11.                 Slog.i(TAG, "Set LCD brightness: " + value, e); 
  12.             } 
  13.             mLcdLight.setBrightness(value, brightnessMode); 
  14.         } 
  15.         if ((mask & BUTTON_BRIGHT_BIT) != 0) { 
  16.             mButtonLight.setBrightness(value); 
  17.         } 
  18.         if ((mask & KEYBOARD_BRIGHT_BIT) != 0) { 
  19.             mKeyboardLight.setBrightness(value); 
  20.         } 
  21.     } 
private LightsService.Light mLcdLight;

    private void setLightBrightness(int mask, int value) {
        int brightnessMode = (mAutoBrightessEnabled
                            ? LightsService.BRIGHTNESS_MODE_SENSOR
                            : LightsService.BRIGHTNESS_MODE_USER);
        if ((mask & SCREEN_BRIGHT_BIT) != 0) {
            if (DEBUG_SCREEN_ON) {
                RuntimeException e = new RuntimeException("here");
                e.fillInStackTrace();
                Slog.i(TAG, "Set LCD brightness: " + value, e);
            }
            mLcdLight.setBrightness(value, brightnessMode);
        }
        if ((mask & BUTTON_BRIGHT_BIT) != 0) {
            mButtonLight.setBrightness(value);
        }
        if ((mask & KEYBOARD_BRIGHT_BIT) != 0) {
            mKeyboardLight.setBrightness(value);
        }
    }

LightsService.java (frameworks\base\services\java\com\android\server)

  1. public void setBrightness(int brightness, int brightnessMode) { 
  2.     synchronized (this) { 
  3.         int color = brightness & 0x000000ff
  4.         color = 0xff000000 | (color << 16) | (color << 8) | color; 
  5.         setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode); 
  6.     } 
  7.  
  8. private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) { 
  9.     if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS) { 
  10.         if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#" 
  11.                 + Integer.toHexString(color)); 
  12.         mColor = color; 
  13.         mMode = mode; 
  14.         mOnMS = onMS; 
  15.         mOffMS = offMS; 
  16.         setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode); 
  17.     } 
        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);
            }
        }

        private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) {
            if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS) {
                if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
                        + Integer.toHexString(color));
                mColor = color;
                mMode = mode;
                mOnMS = onMS;
                mOffMS = offMS;
                setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);
            }
        }

2. JNI 处理

com_android_server_LightsService.cpp(/framework/base/services/jni/)


  1. static JNINativeMethod method_table[] = {   
  2.     { "init_native", "()I", (void*)init_native },   
  3.     { "finalize_native", "(I)V", (void*)finalize_native },   
  4.     { "setLight_native", "(IIIIIII)V", (void*)setLight_native },   
static JNINativeMethod method_table[] = {  
    { "init_native", "()I", (void*)init_native },  
    { "finalize_native", "(I)V", (void*)finalize_native },  
    { "setLight_native", "(IIIIIII)V", (void*)setLight_native },  

  1. static light_device_t* get_device(hw_module_t* module, char const* name)   
  2. {   
  3.     int err;   
  4.     hw_device_t* device;   
  5.     err = module->methods->open(module, name, &device);   
  6.     if (err == 0) {   
  7.         return (light_device_t*)device;   
  8.     } else {   
  9.         return NULL;   
  10.     }   
  11. }   
  12.    
  13. static jint init_native(JNIEnv *env, jobject clazz)   
  14. {   
  15.     int err;   
  16.     hw_module_t* module;   
  17.     Devices* devices;   
  18.        
  19.     devices = (Devices*)malloc(sizeof(Devices));   
  20.    
  21.     err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);   
  22.     if (err == 0) {   
  23.         devices->lights[LIGHT_INDEX_BACKLIGHT]   
  24.                 = get_device(module, LIGHT_ID_BACKLIGHT);   
  25.         devices->lights[LIGHT_INDEX_KEYBOARD]   
  26.                 = get_device(module, LIGHT_ID_KEYBOARD);   
  27.         devices->lights[LIGHT_INDEX_BUTTONS]   
  28.                 = get_device(module, LIGHT_ID_BUTTONS);   
  29.         devices->lights[LIGHT_INDEX_BATTERY]   
  30.                 = get_device(module, LIGHT_ID_BATTERY);   
  31.         devices->lights[LIGHT_INDEX_NOTIFICATIONS]   
  32.                 = get_device(module, LIGHT_ID_NOTIFICATIONS);   
  33.         devices->lights[LIGHT_INDEX_ATTENTION]   
  34.                 = get_device(module, LIGHT_ID_ATTENTION);   
  35.         devices->lights[LIGHT_INDEX_BLUETOOTH]   
  36.                 = get_device(module, LIGHT_ID_BLUETOOTH);   
  37.         devices->lights[LIGHT_INDEX_WIFI]   
  38.                 = get_device(module, LIGHT_ID_WIFI);   
  39.     } else {   
  40.         memset(devices, 0, sizeof(Devices));   
  41.     }   
  42.    
  43.     return (jint)devices;   
  44. }   
  45.    
  46.     
  47.    
  48. static void setLight_native(JNIEnv *env, jobject clazz, int ptr,   
  49.         int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)   
  50. {   
  51.     Devices* devices = (Devices*)ptr;   
  52.     light_state_t state;   
  53.    
  54.     if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {   
  55.         return ;   
  56.     }   
  57.    
  58.     memset(&state, 0, sizeof(light_state_t));   
  59.     state.color = colorARGB;   
  60.     state.flashMode = flashMode;   
  61.     state.flashOnMS = onMS;   
  62.     state.flashOffMS = offMS;   
  63.     state.brightnessMode = brightnessMode;   
  64.    
  65.     devices->lights[light]->set_light(devices->lights[light], &state);   
static light_device_t* get_device(hw_module_t* module, char const* name)  
{  
    int err;  
    hw_device_t* device;  
    err = module->methods->open(module, name, &device);  
    if (err == 0) {  
        return (light_device_t*)device;  
    } else {  
        return NULL;  
    }  
}  
  
static jint init_native(JNIEnv *env, jobject clazz)  
{  
    int err;  
    hw_module_t* module;  
    Devices* devices;  
      
    devices = (Devices*)malloc(sizeof(Devices));  
  
    err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);  
    if (err == 0) {  
        devices->lights[LIGHT_INDEX_BACKLIGHT]  
                = get_device(module, LIGHT_ID_BACKLIGHT);  
        devices->lights[LIGHT_INDEX_KEYBOARD]  
                = get_device(module, LIGHT_ID_KEYBOARD);  
        devices->lights[LIGHT_INDEX_BUTTONS]  
                = get_device(module, LIGHT_ID_BUTTONS);  
        devices->lights[LIGHT_INDEX_BATTERY]  
                = get_device(module, LIGHT_ID_BATTERY);  
        devices->lights[LIGHT_INDEX_NOTIFICATIONS]  
                = get_device(module, LIGHT_ID_NOTIFICATIONS);  
        devices->lights[LIGHT_INDEX_ATTENTION]  
                = get_device(module, LIGHT_ID_ATTENTION);  
        devices->lights[LIGHT_INDEX_BLUETOOTH]  
                = get_device(module, LIGHT_ID_BLUETOOTH);  
        devices->lights[LIGHT_INDEX_WIFI]  
                = get_device(module, LIGHT_ID_WIFI);  
    } else {  
        memset(devices, 0, sizeof(Devices));  
    }  
  
    return (jint)devices;  
}  
  
   
  
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);  
}

3. 底层处理

Lights.c (device\marvell\***\lights)

  1. const char * const LCD_BACKLIGHT = "/sys/class/backlight/pwm-backlight.2/brightness";   
  2. static int lights_device_open(const struct hw_module_t *module,   
  3.                 const char *name, struct hw_device_t **device);   
  4.    
  5. static struct hw_module_methods_t lights_module_methods = {   
  6.     .open      = lights_device_open   
  7. };   
  8.    
  9. struct light_module_t   
  10. {   
  11.     struct hw_module_t common;   
  12. };   
  13.    
  14. const struct light_module_t HAL_MODULE_INFO_SYM = {   
  15.     common: {   
  16.         tag : HARDWARE_MODULE_TAG,   
  17.         version_major : 1,   
  18.         version_minor : 0,   
  19.         id : LIGHTS_HARDWARE_MODULE_ID,   
  20.         name : "lights module",   
  21.         author : "",   
  22.         methods : &lights_module_methods,   
  23.     }   
  24. };   
  25.    
  26. int lights_set(struct light_device_t* dev, struct light_state_t const* state, const char* brightness_node) {   
  27.     struct light_state_t const *light_state = (struct light_state_t const*)state;   
  28.     unsigned char brightness = 0;   
  29.     int fd = -1;   
  30.     struct my_light_device_t *mydev = (struct my_light_device_t*)dev;   
  31.     if( light_state ) {   
  32.         unsigned int color = light_state->color;   
  33.         brightness = (color & 0xff) * mydev->max_brightness / 0xff;   
  34.     } else {   
  35.         LOGE("lights_set_brightness failed: light state is null\n");   
  36.         return -EINVAL;   
  37.     }   
  38.     fd = open(brightness_node, O_RDWR);   
  39.     if( fd >= 0 ) {   
  40.         char buffer[20];   
  41.         int bytes = sprintf(buffer, "%d", brightness);   
  42.         int rlt = write(fd, buffer, bytes);   
  43.         if( rlt < 0 ){   
  44.             LOGE("lights_set_brightness %s, fail to set brightness to:%s, errno:%d\n", brightness_node, buffer, errno);    
  45.             close(fd);   
  46.             return -1;   
  47.         }   
  48.         close(fd);   
  49.     } else {   
  50.         static int already_warned = 0;   
  51.         if (already_warned < 5) {   
  52.             LOGE("lights_set_brightness failed to open %s, errno:%d\n", brightness_node, errno);   
  53.             already_warned++;   
  54.         }   
  55.         return -1;   
  56.     }   
  57.     return 0;   
  58. }   
  59. int lights_set_lcd(struct light_device_t* dev, struct light_state_t const* state)   
  60. {   
  61.     return lights_set( dev, state, LCD_BACKLIGHT);   
  62. }   
  63.    
  64. static int lights_device_open(const struct hw_module_t *module,   
  65.                 const char *name, struct hw_device_t **device)   
  66. {   
  67.     int status = -EINVAL;   
  68.     int ret;   
  69. #ifdef LIGHTS_DEBUG   
  70.     LOGD("lights_device_open: device name: %s\n", name);   
  71. #endif   
  72.    
  73.     struct light_device_t *dev = NULL;   
  74.     struct my_light_device_t *mydev = NULL;   
  75.        
  76.     mydev = (struct my_light_device_t *)calloc(sizeof(struct my_light_device_t), 1);   
  77.     dev = &(mydev->dev);   
  78.     dev->common.tag = HARDWARE_DEVICE_TAG;   
  79.     dev->common.version = 0;   
  80.     dev->common.module = (struct hw_module_t *)(module);   
  81.     dev->common.close = lights_device_close;   
  82.    
  83.     mydev->max_brightness = 0xff;//default max brightness is 255   
  84.            
  85.     *device = &dev->common;   
  86.        
  87.     if (!strcmp(name, LIGHT_ID_BACKLIGHT)) {   
  88.         dev->set_light = lights_set_lcd;   
  89.         readIntFromFile( LCD_MAX_BACKLIGHT, &mydev->max_brightness);   
  90.         ret = access(LCD_BACKLIGHT, F_OK);   
  91.         if (ret != 0)   
  92.             return status;   
  93.     } else if (!strcmp(name, LIGHT_ID_KEYBOARD)) {   
  94.         dev->set_light = lights_set_keyboard;   
  95.         readIntFromFile( KEYBOARD_MAX_BACKLIGHT, &mydev->max_brightness);   
  96.         ret = access(KEYBOARD_BACKLIGHT, F_OK);   
  97.         if (ret != 0)   
  98.             return status;   
  99.     } else if (!strcmp(name, LIGHT_ID_BUTTONS)) {   
  100.         dev->set_light = lights_set_button;   
  101.         ret = access(BUTTON_BACKLIGHT, F_OK);   
  102.         if (ret != 0)   
  103.             return status;   
  104.     } else if (!strcmp(name, LIGHT_ID_BATTERY)) {   
  105.         dev->set_light = lights_set_battery;   
  106.         ret = access(BATTERY_BACKLIGHT, F_OK);   
  107.         if (ret != 0)   
  108.             return status;   
  109.     } else if (!strcmp(name, LIGHT_ID_NOTIFICATIONS)) {   
  110.         dev->set_light = lights_set_notifications;   
  111.         ret = access(NOTIFICATIONS_BACKLIGHT, F_OK);   
  112.         if (ret != 0)   
  113.             return status;   
  114.     } else if (!strcmp(name, LIGHT_ID_ATTENTION)) {   
  115.         dev->set_light = lights_set_attention;   
  116.         ret = access(ATTENTION_BACKLIGHT, F_OK);   
  117.         if (ret != 0)   
  118.             return status;   
  119.     } else   
  120.         return status;   
  121.        
  122.     return 0;   
  123. }   
const char * const LCD_BACKLIGHT = "/sys/class/backlight/pwm-backlight.2/brightness";  
static int lights_device_open(const struct hw_module_t *module,  
                const char *name, struct hw_device_t **device);  
  
static struct hw_module_methods_t lights_module_methods = {  
    .open      = lights_device_open  
};  
  
struct light_module_t  
{  
    struct hw_module_t common;  
};  
  
const struct light_module_t HAL_MODULE_INFO_SYM = {  
    common: {  
        tag : HARDWARE_MODULE_TAG,  
        version_major : 1,  
        version_minor : 0,  
        id : LIGHTS_HARDWARE_MODULE_ID,  
        name : "lights module",  
        author : "",  
        methods : &lights_module_methods,  
    }  
};  
  
int lights_set(struct light_device_t* dev, struct light_state_t const* state, const char* brightness_node) {  
    struct light_state_t const *light_state = (struct light_state_t const*)state;  
    unsigned char brightness = 0;  
    int fd = -1;  
    struct my_light_device_t *mydev = (struct my_light_device_t*)dev;  
    if( light_state ) {  
        unsigned int color = light_state->color;  
        brightness = (color & 0xff) * mydev->max_brightness / 0xff;  
    } else {  
        LOGE("lights_set_brightness failed: light state is null\n");  
        return -EINVAL;  
    }  
    fd = open(brightness_node, O_RDWR);  
    if( fd >= 0 ) {  
        char buffer[20];  
        int bytes = sprintf(buffer, "%d", brightness);  
        int rlt = write(fd, buffer, bytes);  
        if( rlt < 0 ){  
            LOGE("lights_set_brightness %s, fail to set brightness to:%s, errno:%d\n", brightness_node, buffer, errno);   
            close(fd);  
            return -1;  
        }  
        close(fd);  
    } else {  
        static int already_warned = 0;  
        if (already_warned < 5) {  
            LOGE("lights_set_brightness failed to open %s, errno:%d\n", brightness_node, errno);  
            already_warned++;  
        }  
        return -1;  
    }  
    return 0;  
}  
int lights_set_lcd(struct light_device_t* dev, struct light_state_t const* state)  
{  
    return lights_set( dev, state, LCD_BACKLIGHT);  
}  
  
static int lights_device_open(const struct hw_module_t *module,  
                const char *name, struct hw_device_t **device)  
{  
    int status = -EINVAL;  
    int ret;  
#ifdef LIGHTS_DEBUG  
    LOGD("lights_device_open: device name: %s\n", name);  
#endif  
  
    struct light_device_t *dev = NULL;  
    struct my_light_device_t *mydev = NULL;  
      
    mydev = (struct my_light_device_t *)calloc(sizeof(struct my_light_device_t), 1);  
    dev = &(mydev->dev);  
    dev->common.tag = HARDWARE_DEVICE_TAG;  
    dev->common.version = 0;  
    dev->common.module = (struct hw_module_t *)(module);  
    dev->common.close = lights_device_close;  
  
    mydev->max_brightness = 0xff;//default max brightness is 255  
          
    *device = &dev->common;  
      
    if (!strcmp(name, LIGHT_ID_BACKLIGHT)) {  
        dev->set_light = lights_set_lcd;  
        readIntFromFile( LCD_MAX_BACKLIGHT, &mydev->max_brightness);  
        ret = access(LCD_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else if (!strcmp(name, LIGHT_ID_KEYBOARD)) {  
        dev->set_light = lights_set_keyboard;  
        readIntFromFile( KEYBOARD_MAX_BACKLIGHT, &mydev->max_brightness);  
        ret = access(KEYBOARD_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else if (!strcmp(name, LIGHT_ID_BUTTONS)) {  
        dev->set_light = lights_set_button;  
        ret = access(BUTTON_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else if (!strcmp(name, LIGHT_ID_BATTERY)) {  
        dev->set_light = lights_set_battery;  
        ret = access(BATTERY_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else if (!strcmp(name, LIGHT_ID_NOTIFICATIONS)) {  
        dev->set_light = lights_set_notifications;  
        ret = access(NOTIFICATIONS_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else if (!strcmp(name, LIGHT_ID_ATTENTION)) {  
        dev->set_light = lights_set_attention;  
        ret = access(ATTENTION_BACKLIGHT, F_OK);  
        if (ret != 0)  
            return status;  
    } else  
        return status;  
      
    return 0;  
}  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值