日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 充电LED控制

發布時間:2023/12/20 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 充电LED控制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、前言

充電LED燈控制是Android設備的基本功能,主要用于提示設備的電池狀態,充電狀態,滿電狀態,低電狀態,很多手機廠商還使用呼吸效果來顯示,普通的低端設備會使用兩個LED燈表示,紅燈表示充電和低電,綠燈表示滿電。

?

之前寫的文章 《Android充電系統介紹》

2、kernel 層控制充電LED

代碼位置主要在kernel/driver/power/power_supply_leds.c

?

/* Battery specific LEDs triggers. */ static void power_supply_update_bat_leds(struct power_supply *psy) {union power_supply_propval status;unsigned long delay_on = 0;unsigned long delay_off = 0;if (power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &status))return;dev_dbg(&psy->dev, "%s %d\n", __func__, status.intval);switch (status.intval) {case POWER_SUPPLY_STATUS_FULL:led_trigger_event(psy->charging_full_trig, LED_FULL);led_trigger_event(psy->charging_trig, LED_OFF);led_trigger_event(psy->full_trig, LED_FULL);led_trigger_event(psy->charging_blink_full_solid_trig,LED_FULL);break;case POWER_SUPPLY_STATUS_CHARGING:led_trigger_event(psy->charging_full_trig, LED_FULL);led_trigger_event(psy->charging_trig, LED_FULL);led_trigger_event(psy->full_trig, LED_OFF);led_trigger_blink(psy->charging_blink_full_solid_trig,&delay_on, &delay_off);break;default:led_trigger_event(psy->charging_full_trig, LED_OFF);led_trigger_event(psy->charging_trig, LED_OFF);led_trigger_event(psy->full_trig, LED_OFF);led_trigger_event(psy->charging_blink_full_solid_trig,LED_OFF);break;} }

?

如果想在kernel 層控制led燈,就需要在這里修改代碼,會需要使用到trigger相關的東西,要理解什么是trigger,可以看下面的鏈接

https://blog.csdn.net/sgmenghuo/article/details/38322141

?

trigger主要是做led燈的一些效果的東西,默認有default-on 對應打開led的trigger,還有none對應關閉LED的trigger。

?

被[ ]括起來的,就是當前trigger的值,然后回觸發對應trigger的.activate函數。

Trigger的代碼位置在 kernel/drivers/leds/trigger

3、framework控制led燈

為了統一控制led接口,Android有一個自己的框架控制led燈

Framework->Hal->kernel->hardware

設置對應的LED燈顏色主要在

Framework/base/core/res/res/values/config.xml

<color name="config_defaultNotificationColor">#ffffffff</color><!-- Default LED on time for notification LED in milliseconds. --><integer name="config_defaultNotificationLedOn">500</integer><!-- Default LED off time for notification LED in milliseconds. --><integer name="config_defaultNotificationLedOff">2000</integer><!-- Default value for led color when battery is low on charge --><integer name="config_notificationsBatteryLowARGB">0xFFFF0000</integer> <!-- Default value for led color when battery is medium charged --><integer name="config_notificationsBatteryMediumARGB">0xFFFF0000</integer><!-- Default value for led color when battery is fully charged --><integer name="config_notificationsBatteryFullARGB">0xFF00FF00</integer><!-- Default value for LED on time when the battery is low on charge in miliseconds --><integer name="config_notificationsBatteryLedOn">125</integer>

?

充電狀態燈指示狀態函數調用

frameworks\base\services\core\java\com\android\server\BatteryService.java

/** * Synchronize on BatteryService. */public void updateLightsLocked() {final int level = mBatteryProps.batteryLevel;final int status = mBatteryProps.batteryStatus;if (level < mLowBatteryWarningLevel) {if (status == BatteryManager.BATTERY_STATUS_CHARGING) {// Solid red when battery is chargingmBatteryLight.setColor(mBatteryLowARGB);} else {// Flash red when battery is low and not chargingmBatteryLight.setFlashing(mBatteryLowARGB, Light.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) {// Solid green when full or charging and nearly fullmBatteryLight.setColor(mBatteryFullARGB);} else {if (isHvdcpPresent()) {// Blinking orange if HVDCP chargermBatteryLight.setFlashing(mBatteryMediumARGB, Light.LIGHT_FLASH_TIMED,mBatteryLedOn, mBatteryLedOn);} else {// Solid orange when charging and halfway fullmBatteryLight.setColor(mBatteryMediumARGB);}}} else {// No lights if not charging and not lowmBatteryLight.turnOff();}}}

?

LightsService 管理LED

frameworks\base\services\core\java\com\android\server\lights\LightsService.java

private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode);{//調用JNI函數設置狀態setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);} static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr,jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode){//調用HAL層接口設置指示燈狀態devices->lights[light]->set_light(devices->lights[light], &state);}

?

獲取HAL層接口函數

static jlong 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 (jlong)devices;}

?

中間層的代碼位置主要在

Hardware/rockchip/liblight/

一個字節對應一種顏色,一共有三個顏色,想最終控制顏色就需要修改上面說的xml文件,比如0x00ffffff,表示紅藍綠三個燈同時亮。具體代碼如下

int set_battery_light(struct light_device_t* dev, struct light_state_t const* state) { int err = 0; char red,blue,green; unsigned int colorRGB = state->color & 0x00ffffff;red = (colorRGB >> 16) & 0xFF; green = (colorRGB >> 8) & 0xFF; blue = colorRGB & 0xFF; pthread_mutex_lock(&g_lock); LOGI(">>>weiqifa set_battery_light 0x%x",state->color);err = write_int(RED_LED_PATH, red?1:0);err = write_int(BLUE_LED_PATH, blue?1:0);err = write_int(GREEN_LED_PATH, green?1:0);pthread_mutex_unlock(&g_lock); return 0; }

?

然后控制的主要是led的設備節點,led的設備節點主要是驅動層生成,代碼的位置如下:kernel/driver/leds/

#define RED_LED_PATH "sys/class/leds/red/brightness"
#define GREEN_LED_PATH "sys/class/leds/green/brightness"
#define BLUE_LED_PATH "sys/class/leds/blue/brightness"

?

?

Led驅動對應的dts代碼如下:

leds: gpio-leds {compatible = "gpio-leds";led-green {┊ label = "green";gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer";default-state = "off";}; led-blue {┊ label = "blue";gpios = <&gpio7 14 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer";default-state = "off";}; led-red {┊ label = "red";gpios = <&gpio7 15 GPIO_ACTIVE_HIGH>;inux,default-trigger = "timer"; default-state = "off";};};

里面的linux,default-trigger 表示默認的trigger模式,如果設置為none就是表示關閉,現在我們的代碼設置為timer表示用定時器的模式,實際上我們沒有編譯定時器模式,所以設置并沒有生效。

?

歡迎關注微信公眾號-嵌入式Linux

覺得不錯,請幫忙轉發,點贊,您的每一次支持,我都將銘記于心

總結

以上是生活随笔為你收集整理的Android 充电LED控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。