Android 背光的控制:

屏幕背光设置

packages/apps/Settings/src/com/android/settings/BrightnessPreference.java

背光设置滚动条和关闭按钮都会调用 setBrightness(mOldBrightness);

public void onProgressChanged(SeekBar seekBar, int progress,boolean fromTouch)

protected void onDialogClosed(boolean positiveResult)

private void setBrightness(int brightness) {

try {

IHardwareService hardware = IHardwareService.Stub.asInterface(

ServiceManager.getService("hardware"));

if (hardware != null) {

hardware.setBacklights(brightness);

}

} catch (RemoteException doe) {

}

}

调用硬件服务器 HardwareService 的 setBacklights 函数

HardwareService.java (frameworks\base\services\java\com\android\server):

public void setBacklights(int brightness)

{

. . .

// Don't let applications turn the screen all the way off

brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);

setLightBrightness_UNCHECKED(LIGHT_ID_BACKLIGHT, brightness);

setLightBrightness_UNCHECKED(LIGHT_ID_KEYBOARD, brightness);

setLightBrightness_UNCHECKED(LIGHT_ID_BUTTONS, brightness);

. . .

}

void setLightOff_UNCHECKED(int light)

{

//本地调用 setLight_native

setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0);

}

void setLightBrightness_UNCHECKED(int light, int brightness) {

int b = brightness & 0x000000ff;

b = 0xff000000 | (b << 16) | (b << 8) | b;

setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0);

}

因为有:

com_android_server_HardwareService.cpp (frameworks\base\services\jni):

static JNINativeMethod method_table[] = {

{ "init_native", "()I", (void*)init_native },

{ "finalize_native", "(I)V", (void*)init_native },

{ "setLight_native", "(IIIIII)V", (void*)setLight_native },

{ "vibratorOn", "(J)V", (void*)vibratorOn },

{ "vibratorOff", "()V", (void*)vibratorOff }

};

所以最终调用的是文件:

com_android_server_HardwareService.cpp (frameworks\base\services\jni)中的函数:

static void setLight_native(JNIEnv *env, jobject clazz, int ptr,

int light, int colorARGB, int flashMode, int onMS, int offMS)

{

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;

devices->lights[light]->set_light(devices->lights[light], &state);

}

Lights.h (hardware\libhardware\include\hardware):#define LIGHTS_HARDWARE_MODULE_ID "lights"

com_android_server_HardwareService.cpp (frameworks\base\services\jni)

err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);

static const char *variant_keys[] = {

"ro.hardware", /* This goes first so that it can pick up a different

file on the emulator. */

"ro.product.board",

"ro.board.platform",

"ro.arch"

};

int hw_get_module(const char *id, const struct hw_module_t **module)

status = load(id, prop, &hmi);

status = load(id, HAL_DEFAULT_VARIANT, &hmi);

static int load(const char *id, const char *variant,const struct hw_module_t **pHmi)

snprintf(path, sizeof(path), "%s/%s.%s.so", HAL_LIBRARY_PATH, id, variant);

#define HAL_DEFAULT_VARIANT "default"

#define HAL_LIBRARY_PATH "/system/lib/hw"

所以path等于:

/system/lib/hw/light.marvell.so

/system/lib/hw/light.default.so

我们编译的light模块放在 /system/lib/hw/light.default.so 所以初始化成功。

property_get(variant_keys[i], prop, NULL) 只有 ro.hardware 存在 [ro.hardware]: [marvell]

static int lights_device_open(const struct hw_module_t* module, const char* name,struct hw_device_t** device)

dev->set_light = set_light_backlight;

static struct hw_module_methods_t lights_module_methods = {

open: lights_device_open

};

hardware/libhardware/modules/lights/Android.mk

LOCAL_MODULE:= lights.default

err = module->methods->open(module, name, &device);

执行的是 : lights_device_open

const char * const brightness_file = "/sys/class/backlight/micco-bl/brightness";

static int set_light_backlight(struct light_device_t* dev,

struct light_state_t const* state)

. . .

color = state->color;

tmp = ((77*((color>>16)&0x00ff)) + (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8;

brightness = tmp/16;

LOGD("---->calling %s(),line=%d state->color=%d,brightness=%d\n",__FUNCTION__,__LINE__,state->color,brightness);

len = sprintf(buf,"%d",brightness);

len = write(fd, buf, len);

. . .

上面的函数完成了与内核的交互

综上所述,程序调用流程如下,上层应用通过 /sys/class/leds/lcd-backlight/brightnes 于内核打交道

设置模块 -> 硬件服务器 -> 本地调用 ->功能库 -> 读写 /sys/class/leds/lcd-backlight/brightness 函数与内核交互

Init.rc (vendor\marvell\littleton): chown system system /sys/class/leds/keyboard-backlight/brightness

Init.rc (vendor\marvell\littleton): chown system system /sys/class/leds/lcd-backlight/brightness

Init.rc (vendor\marvell\littleton): chown system system /sys/class/leds/button-backlight/brightness

这个是博客中记录的,非常详细,很具有参考价值。

在 Atmel 开发板的背光问题解决中使用了 另外一个路径:

# pwd

/sys/class/backlight

# ls -l

lrwxrwxrwx root root 1970-01-01 00:00 backlight -> ../../devices/platform/atmel_lcdfb.0/backlight/backlight

改变该路径的属性: 可读可写。 init.rc

MK 文件

LOCAL_PATH:= $(call my-dir)

# HAL module implemenation, not prelinked and stored in

# hw/..so

include $(CLEAR_VARS)

LOCAL_SRC_FILES := lights.c

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

LOCAL_SHARED_LIBRARIES := liblog

LOCAL_MODULE := lights.atmel

include $(BUILD_SHARED_LIBRARY)

改变 lights.c 文件中的路径。

# ls -l /system/lib/hw

-rwxrwxrwx root root 9560 2010-07-06 10:21 lights.default.so

-rwxrwxrwx root root 14040 2010-07-06 09:03 gralloc.default.so

-rwxrwxrwx root root 9560 2010-07-06 09:03 light.atmel.so.bak

-rwxrwxrwx root root 9752 2010-07-06 10:21 alsa.default.so

-rwxrwxrwx root root 9848 2010-07-06 09:03 sensors.goldfish.so

-rwxrwxrwx root root 5308 2010-07-06 10:21 acoustics.default.so

lights.default.so light.atmel.so 均可实现亮度控制。

你的赞赏是我坚持原创的动力

赞赏

共 0 人赞赏

android背光系统,Android 的背光控制相关推荐

  1. android版本10安装包,Android 10系统,Android 10手机系统正式版安装预约 v10.0-手游汇...

    Android 10系统正式版上线啦,如果你是一个安卓机的使用用户,那么更新到的10系统,等你上线开启你的更新操作.无需任何的复杂操作,只需要在手机应用商店点击进行更新,你就可以获得全新上线的新系统体 ...

  2. 最新android 电脑系统,android l操作系统|android l操作系统最新版 - 系统天堂

    Android新一代操作系统被称为"L",采用被称为"材料设计"的全新设计语言,这是谷歌为了解决碎片化问题的重要举措,将统一包括手机. 平板.笔记本以及网页端设 ...

  3. android考勤系统,Android端实现考勤管理系统

    [实例简介] 登录.注册.找回密码.滑动页.签到.百度地图功能.个人信息.信息界面' [实例截图] [核心代码] Android端源码 └── Android端源码 └── Gcsxdzy ├── A ...

  4. Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方

    Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方 如果你想修改MTK的AAL自动背光调整相关的内容,那么根据情况,可能需要涉及如下文件: 这是Android L版本的 ...

  5. Android背光系统实现

    (一)Lights应用层 SystemUI--系统应用,其主要功能:状态栏信息显示.通知面板.截图/壁纸/屏保服务等: 代码: packages/apps/Settings/src/com/andro ...

  6. Android中背光系统架构

    Mg Android中背光系统架构 Email:wei7758@126.com Blog:http://blog.csdn.net/yinwei520 Author:Yww Time:2011-9-2 ...

  7. Android系统 屏幕最低背光亮度值/最高背光亮度值 调试

    通过 adb 确认合适的 最低背光亮度值/最高背光亮度值 参数 , 并使用万用表量测 背光IC的反馈电阻输出电压确认,具体计算方式根据 背光IC 贴的反馈电阻来计算.(可以找硬件协助 一般是 1.35 ...

  8. android系统重力感应传感器 方向控制与方向切换,android sensor orientation 方向传感器 重力感应...

    首先,获取方向传感器(参照http://developer.android.com/reference/android/hardware/SensorManager.html): publicclas ...

  9. win7 android双系统,Win7+Android双系统 Acer AOD255评测

    Win7+Android双系统 Acer AOD255评测 2010年09月16日 00:08作者:尹航编辑:尹航文章出处:泡泡网原创 分享 泡泡网上网本频道9月16日 Acer Aspire One ...

最新文章

  1. Wannafly挑战赛9
  2. Apache Jackrabbit源码研究(五)
  3. Oauth2认证以及新浪微博开放平台应用
  4. nginx 服务器的学习(1)
  5. python编程题三
  6. Silverlight的自定义tooltip提示工具条
  7. oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化
  8. 嵌入式成长轨迹25 【Linux应用编程强化】【Linux下的C编程 下】【实例:客户端/服务器端程序】...
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的实验室设备管理系统
  10. uni-app中的数据绑定
  11. C++ STL front_inserter back_inserter inserter 插入型迭代器的正确打开方式
  12. Proteus仿真错误解决方法:No power supply specified for net 5V in Power Rail Configuration.
  13. phpcms开启在线编辑模版 方法
  14. 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
  15. 布局之StackPanel面板
  16. 电子工程师元器件应用必备宝典
  17. x390拆机图解_Thinkpadx390详细拆机图解
  18. unity入门2.0
  19. 港科夜闻|香港科大(广州)熊辉教授获委任为协理副校长(知识转移)
  20. vue中的@keyup事件

热门文章

  1. dijkstra算法详解加例题分析 NOIP 2012 文化之旅
  2. vue3学习—state的变化和使用
  3. C#常用加密解密方法(MD5加密解密)
  4. 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?
  5. excel自定义功能区图标_将您自己的图标添加到Excel自定义功能区选项卡
  6. 用Ruby替代Java做rest接口的单元测试!
  7. 微信小程序:40029错误(invalid code)
  8. 听完网易大佬描述 “ 软件测试工程师的一生 ”,我哭了!
  9. Volume Compute In SIMT Hardware Architecture
  10. m031开发 新唐_基于新唐M031开发的激光测距仪方案