




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android的LCD和键盘 背光亮度设置 亮度设置 应用设计1.1 设置进度条范围背光设置是在:设置-声音和显示-亮度,通过进度条来设置的。文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.javaprivate static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);设置进度条的范围,BRIGHTNESS_DIM = 20 BRIGHTNESS_ON=255,它们的定义在:frameworks/base/core/java/android/os/Power.java1.2 设置亮度文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.javapublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); if (!isChecked) setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT); private void setBrightness(int brightness) try IPowerManager power = IPowerManager.Stub.asInterface( ServiceManager.getService(power); if (power != null) power.setBacklightBrightness(brightness); catch (RemoteException doe) 由以上代码可知,brightness的范围是:20255;代码通过服务管理器(ServiceManager)获得power服务,然后通过power服务设置亮度。power.setBacklightBrightness的定义在:rameworks/base/core/java/android/os/IPowerManager.aidl.javaframeworks/base/core/java/android/os/PowerManager.java2, Power服务文件:frameworks/base/core/java/android/os/Power.java/* * Brightness value for dim backlight */ public static final int BRIGHTNESS_DIM = 20; /* * Brightness value for fully on */public static final int BRIGHTNESS_ON = 255;文件:frameworks/base/core/java/android/os/PowerManager.java/* * sets the brightness of the backlights (screen, keyboard, button). * * param brightness value from 0 to 255 * * hide */ public void setBacklightBrightness(int brightness) try mService.setBacklightBrightness(brightness); catch (RemoteException e) 电源管理器(powermager)将brightness转给电源服务,该服务位置如下:文件:frameworks/base/services/java/com/android/server/PowerManagerService.javapublic void setBacklightBrightness(int brightness) mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); / Dont let applications turn the screen all the way off brightness = Math.max(brightness, Power.BRIGHTNESS_DIM); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness, HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, (mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER); mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness, HardwareService.BRIGHTNESS_MODE_USER); long identity = Binder.clearCallingIdentity(); try mBatteryStats.noteScreenBrightness(brightness); catch (RemoteException e) Log.w(TAG, RemoteException calling noteScreenBrightness on BatteryStatsService, e); finally Binder.restoreCallingIdentity(identity); / update our animation state if (ANIMATE_SCREEN_LIGHTS) mScreenBrightness.curValue = brightness; mScreenBrightness.animating = false; mScreenBrightness.targetValue = -1; if (ANIMATE_KEYBOARD_LIGHTS) mKeyboardBrightness.curValue = brightness; mKeyboardBrightness.animating = false; mKeyboardBrightness.targetValue = -1; if (ANIMATE_BUTTON_LIGHTS) mButtonBrightness.curValue = brightness; mButtonBrightness.animating = false; mButtonBrightness.targetValue = -1; 由以上代码可知,同时设置了背光、键盘、按钮的亮度。mHardware 是硬件服务,通过该服务调用底层与设备打交道的CC+代码,setLightBrightness_UNCHECKED原型如下:文件:frameworks/base/servicesjavacomandroidserverHardwareService.javavoid setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) int b = brightness & 0x000000ff; b = 0xff000000 | (b 16) | (b 8) | b; setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode); 参数说明:int light 表示类型,选项如下:static final int LIGHT_ID_BACKLIGHT = 0; static final int LIGHT_ID_KEYBOARD = 1; static final int LIGHT_ID_BUTTONS = 2; static final int LIGHT_ID_BATTERY = 3; static final int LIGHT_ID_NOTIFICATIONS = 4;static final int LIGHT_ID_ATTENTION = 5;int brightness 表示亮度值int brightnessMode 表示亮度的控制模式,选项如下:/* * Light brightness is managed by a user setting. */ static final int BRIGHTNESS_MODE_USER = 0; /* * Light brightness is managed by a light sensor. */static final int BRIGHTNESS_MODE_SENSOR = 1;由代码:int b = brightness & 0x000000ff; b = 0xff000000 | (b 16) | (b lightsLIGHT_INDEX_BACKLIGHT = get_device(module, LIGHT_ID_BACKLIGHT); devices-lightsLIGHT_INDEX_KEYBOARD = get_device(module, LIGHT_ID_KEYBOARD); devices-lightsLIGHT_INDEX_BUTTONS = get_device(module, LIGHT_ID_BUTTONS); devices-lightsLIGHT_INDEX_BATTERY = get_device(module, LIGHT_ID_BATTERY); devices-lightsLIGHT_INDEX_NOTIFICATIONS = get_device(module, LIGHT_ID_NOTIFICATIONS); devices-lightsLIGHT_INDEX_ATTENTION = get_device(module, LIGHT_ID_ATTENTION); else memset(devices, 0, sizeof(Devices); return (jint)devices;用hw_get_module获取ID为LIGHTS_HARDWARE_MODULE_ID的硬件模块,该模块含有6个不同类型的亮度控制。hw_get_module 的实现原理,如下:文件:hardware/libhardware/Hardware.c#define HAL_LIBRARY_PATH /system/lib/hwstatic const char *variant_keys = ro.hardware, /* This goes first so that it can pick up a different file on the emulator. */ duct.board, ro.board.platform, ro.arch;static const int HAL_VARIANT_KEYS_COUNT = (sizeof(variant_keys)/sizeof(variant_keys0);int hw_get_module(const char *id, const struct hw_module_t *module) int status; int i; const struct hw_module_t *hmi = NULL; char propPATH_MAX; char pathPATH_MAX; /* * Here we rely on the fact that calling dlopen multiple times on * the same .so will simply increment a refcount (and not load * a new copy of the library). * We also assume that dlopen() is thread-safe. */ /* Loop through the configuration variants looking for a module */ for (i=0 ; iHAL_VARIANT_KEYS_COUNT+1 ; i+) if (i HAL_VARIANT_KEYS_COUNT) if (property_get(variant_keysi, prop, NULL) = 0) continue; snprintf(path, sizeof(path), %s/%s.%s.so, HAL_LIBRARY_PATH, id, prop); else snprintf(path, sizeof(path), %s/%s.default.so, HAL_LIBRARY_PATH, id); if (access(path, R_OK) continue; /* we found a library matching this id/variant */ break; status = -ENOENT; if (i HAL_VARIANT_KEYS_COUNT+1) /* load the module, if this fails, were doomed, and we should not try * to load a different variant. */ status = load(id, path, module); return status;property_get(variant_keysi, prop, NULL) 会按如下顺序去获取如下变量所对应的值,然后返回给prop:ro.hardware, /* This goes first so that it can pick up a different file on the emulator. */ duct.board, ro.board.platform,ro.arch它们对应的变量为:duct.board=$TARGET_BOOTLOADER_BOARD_NAMEro.board.platform=$TARGET_BOARD_PLATFORM如vendor/htc/dream-open/BoardConfig.mk里定义的TARGET_BOARD_PLATFORM := msm7k,则prop返回” msm7k ”,所以path = /system/lib/hw/lights. msm7k.so,也就是说要获取的硬件模块为lights. msm7k.so。3.2调用硬件setLight_native对应的jni C/C+代码是:文件:frameworks/base/services/jni/com_android_server_HardwareService.cppstatic 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 = LIGHT_COUNT | devices-lightslight = 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-lightslight-set_light(devices-lightslight, &state);通过light标识找到对应的light设备,然后再设置亮度。3.3 硬件原型msm7k的lights对应的硬件原型是在:hardware/msm7k/liblights文件:hardware/msm7k/liblights/Android.mkLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hwLOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)也就是生成模块:/system/lib/hw/lights. msm7k.so文件:hardware/msm7k/liblights/lights.c/* Open a new instance of a lights device using name */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); 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_device_t *dev = malloc(sizeof(struct light_device_t); memset(dev, 0, sizeof(*dev); dev-common.tag = HARDWARE_DEVICE_TAG; dev-common.version = 0; dev-common.module = (struct hw_module_t*)module; dev-common.close = (int (*)(struct hw_device_t*)close_lights; dev-set_light = set_light; *device = (struct hw_device_t*)dev; return 0;static struct hw_module_methods_t lights_module_methods = .open = open_lights,;以上代码对应的是:devices-lightsLIGHT_INDEX_BACKLIGHT = get_device(module, LIGHT_ID_BACKLIGHT); devices-lightsLIGHT_INDEX_KEYBOARD = get_device(module, LIGHT_ID_KEYBOARD); devices-lightsLIGHT_INDEX_BUTTONS = get_device(module, LIGHT_ID_BUTTONS); devices-lightsLIGHT_INDEX_BATTERY = get_device(module, LIGHT_ID_BATTERY); devices-lightsLIGHT_INDEX_NOTIFICATIONS = get_device(module, LIGHT_ID_NOTIFICATIONS); devices-lightsLIGHT_INDEX_ATTENTION = get_device(module, LIGHT_ID_ATTENTION);也就是说,对不同的亮度设置给予了不同的设置函数。举例,背光设置,背光对应的代码如下:char const*const LCD_FILE = /sys/class/leds/lcd-backlight/brightness;static intrgb_to_brightness(struct light_state_t const* state) int color = state-color & 0x00ffffff; return (77*(color16)&0x00ff) + (150*(color8)&0x00ff) + (29*(color&0x00ff) 8;static intset_light_backlight(struct light_device_t* dev, struct light_state_t const* state) int err = 0; int brightness = rgb_to_brightness(state); pthread_mutex_lock(&g_lock); g_backlight = brightness; err = write_int(LCD_FILE, brightness); if (g_haveTrackballLight) handle_trackball_light_locked(dev); pthread_mutex_unlock(&g_lock); return err;也就是往文件/sys/class/leds/lcd-backlight/brightness写入亮度值,然后驱动会根据该文件更改背光的亮度。LCD_FILE的路径根据实际情况更改,同时需要在init.rc 修改其权限,使其可写rgb_to_brightness也根据实际更改,比如要直接亮度值控制,那只要获取r,g,b其中的一个值就行了,如:static intrgb_to_brightness(struct light_state_t const* state) int color = state-color & 0x000000ff; return color;4,led类驱动4.1,驱动创建leds类,系统启动时执行leds_init在目录/sys/class/创建子目录leds kerneldriversledsLed-class.cstatic int _init leds_init(void) leds_class = class_create(THIS_MODULE, leds); if (IS_ERR(leds_class) return PTR_ERR(leds_class); leds_class-suspend = led_suspend; leds_class-resume = led_resume; return 0;4.2,led_classdev_register,调用这个函数就在目录/sys/class/leds创建子目录led_cdev-name和属性文件brightness对brightness文件写就执行led_brightness_store,对brightness文件读就执行led_brightness_show,为下面的lcd,led注册做好准备 kerneldriversledsLed-class.cstatic ssize_t led_brightness_show(struct device *dev, struct device_attribute *attr, char *buf) struct led_classdev *led_cdev = dev_get_drvdata(dev); /* no lock needed for this */ led_update_brightness(led_cdev); return sprintf(buf, %un, led_cdev-brightness);static ssize_t led_brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) struct led_classdev *led_cdev = dev_get_drvdata(dev); ssize_t ret = -EINVAL; char *after; unsigned long state = simple_strtoul(buf, &after, 10); size_t count = after - buf; if (*after & isspace(*after) count+; if (count = size) ret = count; if (state = LED_OFF) led_trigger_remove(led_cdev); led_set_brightness(led_cdev, state); return ret;static DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store);/* * led_classdev_register - register a new object of led_classdev class. * parent: The device to register. * led_cdev: the led_classdev structure for this device. */int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) int rc; led_cdev-dev = device_create(leds_class, parent, 0, led_cdev, %s, led_cdev-name); if (IS_ERR(led_cdev-dev) return PTR_ERR(led_cdev-dev); /* register the attributes */ rc = device_create_file(led_cdev-dev, &dev_attr_brightness); if (rc) goto err_out;#ifdef CONFIG_LEDS_TRIGGERS init_rwsem(&led_cdev-trigger_lock);#endif /* add to the list of leds */ down_write(&leds_list_lock); list_add_tail(&led_cdev-node, &leds_list); up_write(&leds_list_lock); led_update_brightness(led_cdev);#ifdef CONFIG_LEDS_TRIGGERS rc = device_create_file(led_cdev-dev, &dev_attr_trigger); if (rc) goto err_out_led_list; led_trigger_set_default(led_cdev);#endif printk(KERN_INFO Registered led device: %sn, led_cdev-name); return 0;#ifdef CONFIG_LEDS_TRIGGERSerr_out_led_list: device_remove_file(led_cdev-dev, &dev_attr_brightness); list_del(&led_cdev-node);#endiferr_out: device_unregister(led_cdev-dev); return rc;EXPORT_SYMBOL_GPL(led_classdev_register);4.3,lcd驱动调用led_classdev_register,在目录/sys/class/leds创建子目录lcd-backlight和属性文件brightness kerneldriversvideomsmMsm_fb.cstatic int lcd_backlight_registered;static void msm_fb_set_bl_brightness(struct led_classdev *led_cdev, enum led_brightness value) struct msm_fb_data_type *mfd = dev_get_drvdata(led_cdev-dev-parent); int bl_lvl; if (value MAX_BACKLIGHT_BRIGHTNESS) value = MAX_BACKLIGHT_BRIGHTNESS; /* This maps android backlight level 0 to 255 into driver backlight level 0 to bl_max with rounding */ bl_lvl = (2 * value * mfd-panel_info.bl_max + MAX_BACKLIGHT_BRIGHTNESS) /(2 * MAX_BACKLIGHT_BRIGHTNESS); if (!bl_lvl & value) bl_lvl = 1; msm_fb_set_backlight(mfd, bl_lvl, 1);static struct led_classdev backlight_led = .name = lcd-backlight, .brightness = MAX_BACKLIGHT_BRIGHTNESS, .brightness_set = msm_fb_set_bl_brightness,; if (!lcd_backlight_registered) if (led_classdev_register(&pdev-dev, &backlight_led) printk(KERN_ERR led_classdev_register failedn); else lcd_backlight_registered = 1; 就在目录/sys/class/leds创建子目录 lcd-backlight和属性文件brightness当按键或者来的或者改变lcd亮度时,上层对属性文件/sys/class/leds/lcd-backlight/brightness写入背光的亮度数值就调用led_brightness_store调用simple_strtoul(buf, &after, 10);将输入的字符串转换为10进制的数字执行led_set_brightness执行led_cdev-brightness_set(led_cdev, value调用msm_fb_set_bl_brightness ,因为 .brightness_set = msm_fb_set_bl_brightness, /* T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校招生宣传推广计划
- 重庆市潼南区初中学校联考2024-2025学年七年级上学期期中道德与法治试题(含答案)
- Unit 5 Dinosaurs说课稿-2023-2024学年小学英语五年级上册深港朗文版
- 办公耗材保养合同(标准版)
- 新外研版七年级英语下册人物介绍范文
- 浙教版科学七上4.2 质量的测量(1)说课稿
- 第3课 制作能爬行的机器人说课稿-2023-2024学年初中信息技术(信息科技)九年级下册川教版(旧版)
- 小型罐车租赁合同书4篇
- 产品全权代理经营合同6篇
- 消毒高级考试题及答案
- 空间向量及其线性运算课件 高二上学期数学人教A版(2019)选择性必修第一册
- 俄罗斯历史与文化课件
- 3.4 商品质量品级评定与质量监督
- 一年级谁比谁多练习题(比较实用)
- 油管的上扣扭矩表
- 金矿汇报实用教案课件
- 个案分析-万科四季花城
- 年轻人群酒水消费洞察报告
- 社会化媒体全套教学课件
- 幼儿园绘本:《你真好》 PPT课件
- 小学语文《一定要争气》教案设计
评论
0/150
提交评论