Android Telechips89xx背光控制流程

android 9.0背光调节流程 1.背光服务框架 如下图是背光框架层图 2.UML时序图 这里主要标出的是各个服务或者框架层之间连接的api,中间会省略一些调用流程。 如下图,PowerManagerService会监听SettingProvider的亮度背光值screen_brightness变化,然后进行背光调节。 该图主要是一些服务之前的通信。 Jni层访问过程如下图: jni通过hidl直通式访问light库,对hardware层light库会访问对应的sys节点从而进行背光驱动的访问,最终达到调节 背光的目的。 注意点: 阅读详情

Android Telechips89xx背光控制流程
Rocky@20110322

这里我们以Telechips89xx背光控制来示例讲解一下Android2.1下的背光控制。

这个分成几个部分:

*********************************************
应用层调用
Framework层
Hardware层
Kernel层
总结
*********************************************





*********************************************
应用层调用
*********************************************

        API中设置背光的方法
       
        首先我们从/android_tcgit/packages/apps/Settings/src/com/android/settings/BrightnessPreference.java
        中获知:
        ///////////////////////////////////////
        import android.os.RemoteException;
        import android.os.IPowerManager;
        import android.os.ServiceManager;
       
         private void setBrightness(int brightness) {
                try {
                    IPowerManager power = IPowerManager.Stub.asInterface(
                            ServiceManager.getService("power"));
                    if (power != null) {
                        power.setBacklightBrightness(brightness);
                    }
                } catch (RemoteException doe) {
                   
                }       
            }
        ///////////////////////////////////////   
           
        这样我们也就可以使用同样的方法来设置当前的背光亮度了。





*********************************************
Framework层
*********************************************

        从上面可知,它是通过power service的setBacklightBrightness()来设置背光亮度的。
       
        在android_tcgit/frameworks/base/services/java/com/android/server/PowerManagerService.java中有以下函数:
       
                    /////////////////////////////////////////////////////
                    public void setBacklightBrightness(int brightness)
                      {
                        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
                        // Don't 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;
                        }
                    }
                        /////////////////////////////////////////////////////
            这样我们可以知道,这个背光亮度的设置不仅仅是设置LCD_Backlight,还有可鞥设置到键盘,按键等等的。
            当然,这里我们不需要管他们。
           
            这里面的设置还是从通过函数
            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness,
                            HardwareService.BRIGHTNESS_MODE_USER);
            来设置的。
            注意setLightBrightness_UNCHECKED。它的定义的地方时在
            android_tcgit/frameworks/base/services/java/com/android/server/HardwareService.java
           
            具体实现如下:
                /////////////////////////////////////////////////////////////////
            void 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);
            }
              ////////////////////////////////////////////////////////////////// 
          这里我们也可以清楚的明白setLightBrightness_UNCHECKED这个函数的三个参数。
          第一个参数是light的ID,
          第二个参数就是我们设置的亮度值brightness
          第三个参数是背光的模式,因为是手动设置这里是BRIGHTNESS_MODE_USER.
         
         
          brightness结果转换,最终还是调用setLight_native这个函数来实现。注意这个函数是native的,是通过JNI来实现的。他的cpp代码在
          android_tcgit/frameworks/base/services/jni/com_android_server_HardwareService.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);
                    }
                    ////////////////////////////////////////////////////////
                   
                ptr是通过init_native获得的。
                init_native又是通过hw_get_module来获得到的。
               
                总之
              这里我们发现devices->lights[light]是一个我们已经打开对象,然后通过该对象的set_light()来实现背光的设置。
             
              init_native是这个文件在系统装载的时候,根据系统的配置来装载。具体的实现是在Hardware层来实现的。
              同样它的set_light()也是在这Hardware来实现的。接下来我们就需要了解Hardware层了。
 
 
 
*********************************************
Hardware层
*********************************************

首先上面遗留了一个问题,就是Devices * devices是如何获取得到的。使用上面的定义,我们可以知道在Hardware.h中定义了
hw_get_module函数。
具体实现在android_tcgit/hardware/libhardware/hardware.c中。

        ///////////////////////////////////
        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)
        {
            int status;
            int i;
            const struct hw_module_t *hmi = NULL;
            char prop[PATH_MAX];
            char path[PATH_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 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
                if (i < HAL_VARIANT_KEYS_COUNT) {
                    if (property_get(variant_keys[i], 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, we're doomed, and we should not try
                 * to load a different variant. */
                status = load(id, path, module);
            }
       
            return status;
        }
        /**
         * Load the file defined by the variant and if successful
         * return the dlopen handle and the hmi.
         * @return 0 = success, !0 = failure.
         */
        static int load(const char *id,
                const char *path,
                const struct hw_module_t **pHmi)
        {
            int status;
            void *handle;
            struct hw_module_t *hmi;
       
            /*
             * load the symbols resolving undefined symbols before
             * dlopen returns. Since RTLD_GLOBAL is not or'd in with
             * RTLD_NOW the external symbols will not be global
             */
            handle = dlopen(path, RTLD_NOW);
            if (handle == NULL) {
                char const *err_str = dlerror();
                LOGE("load: module=%s/n%s", path, err_str?err_str:"unknown");
                status = -EINVAL;
                goto done;
            }
       
            /* Get the address of the struct hal_module_info. */
            const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
            hmi = (struct hw_module_t *)dlsym(handle, sym);
            if (hmi == NULL) {
                LOGE("load: couldn't find symbol %s", sym);
                status = -EINVAL;
                goto done;
            }
       
            /* Check that the id matches */
            if (strcmp(id, hmi->id) != 0) {
                LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
                status = -EINVAL;
                goto done;
            }
       
            hmi->dso = handle;
       
            /* success */
            status = 0;
       
            done:
            if (status != 0) {
                hmi = NULL;
                if (handle != NULL) {
                    dlclose(handle);
                    handle = NULL;
                }
            } else {
                LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
                        id, path, *pHmi, handle);
            }
       
            *pHmi = hmi;
       
            return status;
        }
        ///////////////////////////////////////
    这样我们就可以知道通过上面的函数装载了通过属性定义的一些动态链接库.so文件。
    我们这里文件就是/system/lib/hw/lights.tcc92xx.so
   
   
    那么接下来我们就需要找到谁定义了这个light.tcc92xx.so文件的生成。
   
    这介绍一个小技巧。
   
    #########################
    在Ubuntu10.04中时得到验证的。

    查找一个字符串
   
    grep -n "str" -r ./
   
    在指定的路径(./)中遍历查找字符串str,显示行信息的方式显示出来。
   
   
    查找一个文件
   
    find 查找目录 -name 查找文件名
   
    在指定路径下查找一个文件名。
    ##########################



    在android_tcgit/hardware/telechips/tcc92xx/module/lights下有这个的定义,其Android.mk文件如下:
   
    ##########################
    LOCAL_PATH := $(call my-dir)
   
    include $(CLEAR_VARS)
   
    LOCAL_PRELINK_MODULE := false
   
    # HAL module implemenation, not prelinked and stored in
    # hw/<BACKLIGHT_HARDWARE_MODULE_ID>.<ro.product.board>.so
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
   
    LOCAL_SHARED_LIBRARIES := liblog
   
    LOCAL_C_INCLUDES := /
      $(LOCAL_PATH)/include /
        kernel/arch/arm/mach-tcc92x/include
   
    LOCAL_SRC_FILES := lights.c
   
    LOCAL_MODULE := lights.tcc92xx
   
    LOCAL_CFLAGS := -fno-short-enums /
            $(BOARD_MEM_FLAGS)
   
    include $(BUILD_SHARED_LIBRARY)
    ##############################
   
    这个就足以说明了这个目录的文件就是我们需要找的。
    打开同目录下的light.c文件。发现

        /////////////////////////////////
        #define BACKLIGHT_LCD_DEVICE        "/dev/graphics/fb0"
       
         set_light = set_light_backlight;
         
         static int rgb_to_brightness(struct light_state_t const* state)
        {
            int color = state->color & 0x00ffffff;
            return ((77*((color>>16)&0x00ff))
                    + (150*((color>>8)&0x00ff)) + (29*(color&0x00ff))) >> 8;
        }
       
        static int set_light_backlight(struct light_device_t* dev,
                                       struct light_state_t const* state)
        {
            struct light_context_t *ctx = (struct light_context_t *) dev;
            int ret, level;
       
            level = rgb_to_brightness(state);
       
            LOGV("%s: level=%d", __func__, level);
           
            #ifdef BL_DRIVER
            ret = ioctl(ctx->fd, IOCTL_BL_SET_LEVEL, &level);
            #else
            ret = ioctl(ctx->fd, TCC_LCD_BL_SET, &level);
            #endif//
            return ret;
        }
        static int light_device_open(const struct hw_module_t* module, const char* name,
                struct hw_device_t** device)
        {
            int (*set_light)(struct light_device_t *dev,
                             struct light_state_t const* staet);
            struct light_context_t *ctx;
            int status = -EINVAL;
            int fd;
       
            if (!strcmp(LIGHT_ID_BACKLIGHT, name)) {
                /* open lcd device */
                fd = open(BACKLIGHT_LCD_DEVICE, O_RDWR);
       
                if (fd <= 0) {
                    LOGE("can't open lcd device '%s'", BACKLIGHT_LCD_DEVICE);
                    return -EINVAL;
                }      
                set_light = set_light_backlight;
            } else if (!strcmp(LIGHT_ID_KEYBOARD, name)) {     
                /* open keyboard device */
                fd = open(BACKLIGHT_KBD_DEVICE, O_RDWR);
       
                if (fd <= 0) {
                    LOGE("can't open keyboard device '%s'", BACKLIGHT_KBD_DEVICE);
                    return -EINVAL;
                }      
                set_light = set_light_keyboard;
            } else if (!strcmp(LIGHT_ID_BUTTONS, name)) {
                /* open button device */
                fd = open(BACKLIGHT_BTN_DEVICE, O_RDWR);
       
                if (fd <= 0) {
                    LOGE("can't open button device '%s'", BACKLIGHT_BTN_DEVICE);
                    return -EINVAL;
                }
                set_light = set_light_buttons;
            } else if (!strcmp(LIGHT_ID_BATTERY, name)) {
                set_light = set_light_battery;
            } else if (!strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
                set_light = set_light_notifications;
            } else if (!strcmp(LIGHT_ID_ATTENTION, name)) {
                set_light = set_light_attention;
            } else {
                return -EINVAL;
            }
       
            ctx = (struct light_context_t *) malloc(sizeof(struct light_context_t));
            if (ctx == NULL) {
                LOGE("can't allocate memory");
                return ENOMEM;
            }
       
            /* initialize our state here */
            memset(ctx, 0, sizeof(*ctx));
       
            /* initialize the procs */
            ctx->device.common.tag = HARDWARE_DEVICE_TAG;
            ctx->device.common.version = 0;
            ctx->device.common.module = (struct hw_module_t*)(module);
            ctx->device.common.close = light_device_close;
            ctx->device.set_light = set_light;
            ctx->fd = fd;
       
            *device = &ctx->device.common;
            return 0;
        }
        //////////////////////////////////


    这个就说明了,这个里面的调用实际上也是通过ioctl的方式调用另外一个设备驱动程序。
    那么接下来我们就看fb0这个内核驱动吧。



*********************************************
Kernel层
*********************************************

        通过以上的这些步骤,我们发现,我们实际上最后还是到了Kernel层的驱动调用。
        从背光的硬件角度,我们了解到大多素的都是利用PWM控制输出电压的大小,这样来控制背光的亮度。
       
        文件/android_tcgit/kernel/drivers/video/tcc92xxfb.c(可以通过查询TCC_LCD_BL_SET来找到这个文件)
        就是定义的这个地方,代码有如下片段:
            /////////////////////////////////////////
            static int tccfb_ioctl(struct fb_info *info, unsigned int cmd,unsigned long arg)
            {
                unsigned int imgch=0;
                void __user *argp = (void __user *) arg;
               
                unsigned int prev_fmt[CONFIG_FB_TCC_DEVS], prev_pd[CONFIG_FB_TCC_DEVS];
                unsigned int curr_fmt[CONFIG_FB_TCC_DEVS], curr_pd[CONFIG_FB_TCC_DEVS];
           
                if((0 <= info->node) && (info->node < CONFIG_FB_TCC_DEVS))
                {
                    imgch = info->node;
                }
                else
                {
                    dprintk("ioctl: Error - fix.id[%d]/n", info->node);
                    return 0;
                }
           
           
                switch(cmd)
                {
                   
                    case TCC_LCD_BL_SET:
                        {
                            unsigned long bl_val;
                           
                            copy_from_user((void *)&bl_val, (const void *)arg, sizeof(unsigned long));
                           
           
                            dprintk("ioctl: TCC_LCD_BL_SET %d %d %d /n", bl_val, backlight_level, fb_power_state);
           
                            backlight_level = bl_val;
           
                            tca_bkl_setpowerval(backlight_level);
                        }
                        break;           
                                   
                        ////////////////
                        ...............
                        ///////////////           
                 }
            }
            /////////////////////////////////////////
        可以看得出来,最后的设置是通过tca_bkl_setpowerval()来设置传入的参数的。
       
        继续往下走,看看tca_bkl_setpowerval定义做了什么。
        Tca_backlight.c (drivers/char)    中,定义如下:
           
            /////////////////////////////////////////////////////
            void tca_bkl_setpowerval(unsigned int inValue)
            {
                dprintk("tca_bkl_setpowerval inValue (%d) (%d) (%d) /n", inValue, tcc_lcd_fb_on, bl_value);
           
           
                if(tcc_lcd_fb_on)
                {
                    backlight_ctrl(inValue);
           
                    bl_value = inValue;
                }
            }
            ////////////////////////////////////////////////
       
       
       
        继续看backlight_ctrl
       
            ////////////////////////////////////////////////
            void backlight_ctrl(unsigned int level)
            {
                if(level)
                {
                       tca_bkl_OnOff(1);
                        BITCSET(HwGPIOA->GPFN0, HwPORTCFG_GPFN6_MASK, HwPORTCFG_GPFN6(2));
                        pTIMER->TMREF2 = (3200*level)/100;
             
                }
                else
                {        
                      BITCSET(HwGPIOA->GPFN0, HwPORTCFG_GPFN6_MASK, HwPORTCFG_GPFN6(0));
                      BITCSET(HwGPIOA->GPEN, Hw6, Hw6);
                      BITCSET(HwGPIOA->GPDAT, Hw6, 0);             
                  tca_bkl_OnOff(0);
                }
            }
           
            void tca_bkl_OnOff(char onoff)
            {
                         if(onoff)
                        {//GPIO_F16 output 1,
                            BITCLR(HwGPIOF->GPFN2, Hw4-Hw0);
                             BITSET(HwGPIOF->GPEN, Hw16);
                            BITSET(HwGPIOF->GPDAT, Hw16);
                        }
                        else
                        {    //GPIO F16 output 0
                            BITCLR(HwGPIOF->GPFN2, Hw4-Hw0);
                             BITSET(HwGPIOF->GPEN, Hw16);
                            BITCLR(HwGPIOF->GPDAT, Hw16);
                        }
            }
            ////////////////////////////////////////////////
        上面的代码就比较简单了。无非一些IO和Register操作。这样就完成整个操作。




*********************************************
总结
*********************************************

        通过以上我们可以获知,整个系统从应用到底层IO操作是一个怎么样的过程。
        这个我们就可以了解了BackLight的整个架构了!

TELECHIPS TCC89XX Datasheet TELECHIPS TCC8900 Datasheet 立即下载

相关推荐

ISD17xx-89C51开发试验板原理图.pdf

ISD1700-89C51开发试验板原理图

android lcd 背光控制流程

此文章是网上看到的,在MTK平台基础上的背光控制流程的分析。个人觉得写得比较详细,于是截取部分内容转载出来。 细节的框架图: 由此可见光系统从上到下依次分为java APP层、java 框架层、本地层和驱动层。下面就来看APP层,先给出调节背光的应用界面: 此功能在settings--->display--->bri

hbk320的专栏 1万+

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 272

Android:设置屏幕亮度的几种方法

Android:设置屏幕亮度的几种方法,有需要的朋友可以参考下。 首先,设置屏幕亮度分为两种:1、设置系统的亮度,即是在手机的设置->亮度中的设置。2、设置应用的亮度,即某一个activity的亮度 一: 设置系统亮度,显然,设置系统亮度是需要系统权限的,所以这个只适用于进行源码开发的猿们,这个怎么做应该不用我啰嗦了,有3中常规方法: 设置系统亮度,主要通过电源管理

2892

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

Pixel 5 Root, 安装Xposed框架, 解锁5G教程

Pixel 5 5G手机root 教程 前几天买的手机终于到货了,现在又开始折腾了,经过我的努力,现在已经拥有root权限了。

Ender_Zhao的博客 3万+

ADROID 2.1 架构解析 3 亮度设置

<br />3 亮度设置<br />3.1 应用设计<br />3.1.1 设置进度条范围<br />背光设置是在:设置->声音和显示->亮度,通过进度条来设置的。<br />文件:packages/apps/Settings/src/com/android/settings/BrightnessPreference.java<br />private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;<br

祥子的技术博客 586

LabVIEW 调用MATLAB 进行图像处理的实现

程机械及设备的变形、振动、冲击、粗糙度、刚度和强度等特性,还可用在土木结构、水利设施的变形测量[4][5]。因此,该技术在机械、土木、水利、电器、航空航天、兵器工业及生物医学等领域的检测中具有非常重要的地位。将物面前方空间的散斑用摄像设备记录下来,当物体运动或由于受力而变形时,这些随机分布的散斑图也随之在空间按一定的规律运动,因此能用记录的散斑图在计算机上分析物体的运动和变形,这就是电子散斑技术。当物体的漫反射表面被激光照射时,漫反射的光波在物体表面的前方相互干涉,由于漫反射光的。

qq_37971227的博客 3874

高通89xx平台,led flash

之前就知道有另外一组人在做,但是作为学习,自己也开始做了。驱动大部分都是copy过来的,只需要自己修改一下dtsi(device tree),对i2c/gpio做一些配置。高通的porting guide已经有明确的指导了,我做了一个星期是因为EE没有给我的板子rework。不过也好,使劲追代码,感觉学到了很多。dtsi是我们部门设置的,不一定和高通给的一样。具体还是要从最上面开始看,看inclu...

weixin_30341735的博客 1059

重磅!Repo Wiki!

RepoWiki是Qoder平台的智能文档生成功能,通过静态代码分析自动提取项目架构、模块依赖和核心逻辑,并持续追踪代码变更保持文档同步。其工作流程分为四个阶段:1)代码扫描与AST解析;2)结构分析与依赖映射;3)文档智能生成;4)增量更新机制。支持多种编程语言,能识别设计模式并推断技术决策,适用于新项目搭建和遗留系统维护。优势在于降低理解成本和提高开发效率,但存在文件数量限制和依赖Git的局限性。典型应用场景包括自动生成架构图、API手册和团队知识沉淀。

ayusong870的博客 4032

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

6045

Android背光系统实现

(一)Lights应用层 SystemUI——系统应用,其主要功能:状态栏信息显示、通知面板、截图/壁纸/屏保服务等; 代码: packages/apps/Settings/src/com/android/settings/BrightnessPreference.java frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java frameworks/base/p...

2946

2026年寒武纪数字IC笔试试卷带答案

本文摘要: 该数字IC设计测试卷包含单选题(30分)、波形分析题(15分)、多选题(30分)三类客观题,覆盖时序约束、半导体工艺、状态机、数制转换、同步复位等核心知识点。重点考察:1)跨时钟域处理(如异步FIFO、格雷码应用);2)时序分析(建立/保持时间、时钟约束指令);3)低功耗设计技术(时钟门控、DVFS);4)寒武纪MLU架构特性(张量核、混合精度计算)。解析强调工程实践要点,如异步复位需同步释放、建立时间违例与频率的关联性等。试题难度梯度明显,既包含基础概念辨析(如Moore/Mealy状态机),

Open 223

android 背光控制流程

Android Telechips89xx背光控制流程 Rocky@20110322 这里我们以Telechips89xx背光控制来示例讲解一下Android2.1下的背光控制。 这个分成几个部分: ********************************************* 应用层调用 Framework层 Hardware层 Kernel层 总结

manshq163com的专栏 1154

如何通过Davinci Configurator来新增一个BswM仲裁规则

详细介绍如何通过Davinci Configurator来新增一个BswM仲裁规则。

initiallizer的博客 772

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android关闭屏幕背光,Android 的背光控制

echo 23 > /sys/devices/platform/atmel_lcdfb.0/backlight/backlight/brightnesshttp://android.git.kernel.org/ android 源代码http://blog.chinaunix.net/u1/49742/showart_2077813.html android 知识总结http://www....

weixin_30077373的博客 2338

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android开发笔记(一百一十七)app省电方略

电源管理PowerManager PowerManager是Android的电源管理类,用于管理电源操作如睡眠、唤醒、重启以及调节屏幕亮度等等。 PowerManager的对象从系统服务POWER_SERVICE中获取,它的主要方法如下: goToSleep : 睡眠,即锁屏。 wakeUp : 唤醒,即解锁。 reboot : 重启。 另有下列几个隐藏的方法: getMinimum

aqi00的博客 4821

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android修改自动背光,Android LCD和键盘 背光亮度设置

亮度设置应用设计1.1 设置进度条范围背光设置是在:设置->声音和显示->亮度,通过进度条来设置的。文件:packages/apps/Settings/src/com/Android/settings/BrightnessPreference.javaprivate static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHT...

weixin_28681255的博客 1118

android 亮度调节 接口,使用android隐藏api实现亮度调节的方法

Android 1.5之后将调节亮度的api隐藏了,不过android的源码中依然有方法可以实现,如下:IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));if (power != null) {power.setBacklightBrightness(brightness...

weixin_29044713的博客 393

android自动调节背光,【从应用层到Framework】android LCD、键盘灯的背光亮度设置...

今天碰到一个键盘灯太亮的问题,整理了一下代码,发出来方便看流程。对比了一下android2.3和4.0的代码,关于这部分的代码没什么变化。应用部分,进入设置->显示->亮度\packages\apps\Settings\src\com\android\settings\BrightnessPreference.java// Backlightrange is from 0 - 255....

weixin_34526937的博客 1024

演示STC89xx系列单片机串行口功能 (8-bit/9-bit)

1 /*------------------------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ---------------- ---------------------------------------*/ 3 /* ---演示STC89...

weixin_30439131的博客 576

android背光控制 自动关闭,android 背光控制

echo 23 > /sys/devices/platform/atmel_lcdfb.0/backlight/backlight/brightnessandroid 源代码http://blog.chinaunix.net/u1/49742/showart_2077813.html android 知识总结http://www.limodev.cn/Android 背光的控制:屏幕背光设置...

weixin_33331978的博客 507

Android 屏幕亮度控制问题

Android的屏幕亮度好像在2.1+的时候提供了自动调节的功能,所以,如果当开启自动调节功能的时候, 我们进行调节好像是没有一点作用的,这点让我很是无语,结果只有进行判断,看是否开启了屏幕亮度的自动调节功能。/**      * 判断是否开启了自动亮度调节      *      * @param aContext      * @return      */     public static boolean isAutoBrightness(ContentResolver aConten

JiuJie_的专栏 3875
上一篇: IMEI
下一篇: Android 显示不满屏的问题解决
dadahacker
博客等级 码龄20年 78粉丝 120原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值