android mtk6592 添加led三色灯,红色蓝色绿色
16lz
2021-01-26
本文的led是三色的分别是红色,蓝色,绿色
红色:低电量,电量低于15%
蓝色:充电,电量在15%到90%之间
绿色:电量在90%到100%
开机充电情况:
驱动层:
mediatek\custom\**project\lk\cust_leds.c
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {{"red", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0,{0,0,0,0,0}},{"green", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK1,{0,0,0,0,0}},{"blue", MT65XX_LED_MODE_NONE, MT65XX_LED_PMIC_NLED_ISINK2,{0,0,0,0,0}},{"jogball-backlight", MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"keyboard-backlight",MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"button-backlight", MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"lcd-backlight", MT65XX_LED_MODE_CUST_BLS_PWM, (int)disp_bls_set_backlight,{0,0,0,0,0}},};
上层:
aplse\frameworks\base\core\res\res\values\config.xml
上层配置文件,修改开机充电模式下led显示情况
15 控制低电量的最低值 20 #ffffffff 500 2000 0xFFFF0000 低电量红色 0xFF0000FF 15到90 蓝色 0xFF00FF00 90以上绿色
apls\ frameworks\base\services\java\com\android\server\BatteryService.java
public void updateLightsLocked() { final int level = mBatteryProps.batteryLevel; final int status = mBatteryProps.batteryStatus; if(mIPOBoot) { //Get led status in IPO mode getIpoLedStatus(); } if (level < mLowBatteryWarningLevel) { if (status == BatteryManager.BATTERY_STATUS_CHARGING) { updateLedStatus(); // Solid red when battery is charging mBatteryLight.setColor(mBatteryLowARGB); } else { LowLevelFlag = true; updateLedStatus(); // Flash red when battery is low and not charging mBatteryLight.setFlashing(mBatteryLowARGB, LightsService.LIGHT_FLASH_TIMED, mBatteryLedOn, mBatteryLedOff); } } else if (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL) { if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) { updateLedStatus(); // Solid green when full or charging and nearly full mBatteryFullARGB mBatteryLight.setColor(mBatteryFullARGB); } else { updateLedStatus(); // Solid orange when charging and halfway full mBatteryLight.setColor(mBatteryMediumARGB); } } else { if(ipo_led_on && mIPOBoot){ if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) { mBatteryLight.setColor(mBatteryFullARGB); } else { mBatteryLight.setColor(mBatteryMediumARGB); } mIPOBoot = false; ipo_led_on = false; } // No lights if not charging and not low mBatteryLight.turnOff(); } }
这里是对三色的判断并输出
关机充电情况:
修改两个文件: mediatek\external\ipod目录下面的ipodlights.cpp和ipodmain.h
修改的代码如下:
ipodlights.cpp
#include #include #include "ipodmain.h"#define LED_RED_PATH "/sys/class/leds/red/brightness"#define LED_BLUE_PATH "/sys/class/leds/blue/brightness" #define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity" #define LED_GREEN_PATH "/sys/class/leds/green/brightness"#define LED_ONOFF_PROP "sys.ipo.ledon"/*int (*ipod_chglights[])(void) = {lights_init,lights_chgfull,lights_chgon,lights_chgexit,};*/static int led_isOn = CONTROL_UNKNOWN;static int led_green_isOn = CONTROL_UNKNOWN;static int led_red_isOn = CONTROL_UNKNOWN;static int led_blue_isOn = CONTROL_UNKNOWN; static int nChargingFull = CONTROL_UNKNOWN;static int nChargingRemoved = CONTROL_UNKNOWN;void turn_led_on() {if (led_isOn == CONTROL_ON)return;led_isOn = CONTROL_ON;property_set(LED_ONOFF_PROP, "1");}void turn_led_off() {if (led_isOn == CONTROL_OFF)return;led_isOn = CONTROL_OFF;property_set(LED_ONOFF_PROP, "0");}void start_blue_led(int skew){if (led_blue_isOn == CONTROL_ON)return;led_blue_isOn = CONTROL_ON;if (skew > 255) skew = 255;else if (skew < 0) skew = 0;set_int_value(LED_BLUE_PATH, skew);}void stop_blue_led(){if (led_blue_isOn == CONTROL_OFF)return;led_blue_isOn = CONTROL_OFF;set_int_value(LED_BLUE_PATH, 0);}void start_red_led(int skew){if (led_red_isOn == CONTROL_ON)return;led_red_isOn = CONTROL_ON;if (skew > 255) skew = 255;else if (skew < 0) skew = 0;set_int_value(LED_RED_PATH, skew);}void stop_red_led(){if (led_red_isOn == CONTROL_OFF)return;led_red_isOn = CONTROL_OFF;set_int_value(LED_RED_PATH, 0);}void start_green_led(int skew){if (led_green_isOn == CONTROL_ON)return;led_green_isOn = CONTROL_ON;if (skew > 255) skew = 255;else if (skew < 0) skew = 0;set_int_value(LED_GREEN_PATH, skew);}void stop_green_led(){if (led_green_isOn == CONTROL_OFF)return;led_green_isOn = CONTROL_OFF;set_int_value(LED_GREEN_PATH, 0);}int lights_chgfull(){/* do not block this function like sleep */SXLOGI("lights_chgfull");pthread_mutex_lock(&mutex);nChargingFull = CONTROL_ON;nChargingRemoved = CONTROL_OFF;stop_blue_led(); start_green_led(255);turn_led_on();pthread_mutex_unlock(&mutex);return 0;}int lights_chgon(){SXLOGI("lights_chgon");#if 1pthread_mutex_lock(&mutex);nChargingFull = CONTROL_OFF;nChargingRemoved = CONTROL_OFF;stop_green_led();if(get_int_value(BATTERY_CAPACITY_PATH) < 15){stop_blue_led();start_red_led(255); }else{stop_red_led();start_blue_led(255); } turn_led_on(); pthread_mutex_unlock(&mutex);#else// an example of light on 2sec, off 3sec.pthread_mutex_lock(&mutex);if (nChargingFull != CONTROL_ON && nChargingRemoved != CONTROL_ON){nChargingFull = CONTROL_OFF;nChargingRemoved = CONTROL_OFF;stop_green_led();start_red_led(255); turn_led_on();}else{nChargingFull = CONTROL_OFF;nChargingRemoved = CONTROL_OFF;pthread_mutex_unlock(&mutex);return 0;}pthread_mutex_unlock(&mutex);usleep(2000*1000); //sleep 2 secpthread_mutex_lock(&mutex);if (nChargingFull != CONTROL_ON && nChargingRemoved != CONTROL_ON){stop_red_led();turn_led_off();}// reset the state to let next time chgon can work normally.nChargingFull = CONTROL_OFF;nChargingRemoved = CONTROL_OFF;pthread_mutex_unlock(&mutex);#endif return 0;}int lights_chgexit(){/* do not block this function like sleep */SXLOGI("lights_chgexit");pthread_mutex_lock(&mutex);nChargingFull = CONTROL_OFF;nChargingRemoved = CONTROL_ON;stop_green_led();if(get_int_value(BATTERY_CAPACITY_PATH) < 15){stop_red_led();}else{stop_blue_led();}turn_led_off();pthread_mutex_unlock(&mutex);return 0;}
ipodmain.h头文件中需要添加get_int_value()
更多相关文章
- Android Battery 开发(三) BatteryService
- unity android获取电量和wifi信号强度
- 蓝牙遥控器获取电量GATT
- Android(安卓)优化电池使用时间 ——监控电池电量和充电状态
- Android实现电量控制降低耗电
- Android中CMake的使用之三调用第三方库
- [置顶] Android(安卓)显示手机电池的当前电量
- 降低android应用程序耗电量的解决方案
- Android功耗测试小工具集锦