2828#define LED_ON_TICKS 5
2929
3030/* at 8-bit mode one cycle = 8ms */
31- #define BREATH_ON_LENGTH 62
31+ #define BREATH_ON_LENGTH_HIGH 62
32+ #define BREATH_ON_LENGTH_MID 72
33+ #define BREATH_ON_LENGTH_LOW 90
3234#define BREATH_OFF_LENGTH 200
3335
3436#define FP_LED_HIGH 55
3537#define FP_LED_MEDIUM 40
3638#define FP_LED_LOW 15
3739
40+ #define FP_BREATH_LOW 20
41+
3842const enum ec_led_id supported_led_ids [] = {
3943 EC_LED_ID_LEFT_LED ,
4044 EC_LED_ID_RIGHT_LED ,
@@ -44,6 +48,7 @@ const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
4448
4549int power_button_enable = 0 ;
4650static uint8_t led_level ;
51+ int breath_led_length ;
4752
4853struct pwm_led led_color_map [EC_LED_COLOR_COUNT ] = {
4954 /* Red, Green, Blue */
@@ -67,7 +72,7 @@ struct pwm_led pwr_led_color_map[EC_LED_COLOR_COUNT] = {
6772
6873struct pwm_led breath_led_color_map [EC_LED_COLOR_COUNT ] = {
6974 /* White, Green, Red */
70- [EC_LED_COLOR_WHITE ] = { 50 , 0 , 0 },
75+ [EC_LED_COLOR_WHITE ] = { FP_LED_HIGH , 0 , 0 },
7176};
7277
7378struct pwm_led pwm_leds [CONFIG_LED_PWM_COUNT ] = {
@@ -120,7 +125,7 @@ void set_pwr_led_color(enum pwm_led_id id, int color)
120125 led -> set_duty (led -> ch2 , duty .ch2 );
121126}
122127
123- void enable_pwr_breath (enum pwm_led_id id , int color , uint8_t enable )
128+ void enable_pwr_breath (enum pwm_led_id id , int color , int breath_length , uint8_t enable )
124129{
125130 struct pwm_led duty = { 0 };
126131 const struct pwm_led * led = & pwm_leds [id ];
@@ -136,11 +141,11 @@ void enable_pwr_breath(enum pwm_led_id id, int color, uint8_t enable)
136141 }
137142
138143 if (led -> ch0 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
139- bbled_enable (led -> ch0 , duty .ch0 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
144+ bbled_enable (led -> ch0 , duty .ch0 , breath_length , BREATH_OFF_LENGTH , enable );
140145 if (led -> ch1 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
141- bbled_enable (led -> ch1 , duty .ch1 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
146+ bbled_enable (led -> ch1 , duty .ch1 , breath_length , BREATH_OFF_LENGTH , enable );
142147 if (led -> ch2 != (enum pwm_channel )PWM_LED_NO_CHANNEL )
143- bbled_enable (led -> ch2 , duty .ch2 , BREATH_ON_LENGTH , BREATH_OFF_LENGTH , enable );
148+ bbled_enable (led -> ch2 , duty .ch2 , breath_length , BREATH_OFF_LENGTH , enable );
144149}
145150
146151void led_get_brightness_range (enum ec_led_id led_id , uint8_t * brightness_range )
@@ -282,14 +287,14 @@ static void led_set_power(void)
282287 /* don't light up when at lid close */
283288 if (!lid_is_open ()) {
284289 set_pwr_led_color (PWM_LED2 , -1 );
285- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 0 );
290+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 0 );
286291 return ;
287292 }
288293
289294 if (chipset_in_state (CHIPSET_STATE_ANY_SUSPEND ))
290- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 1 );
295+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 1 );
291296 else
292- enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , 0 );
297+ enable_pwr_breath (PWM_LED2 , EC_LED_COLOR_WHITE , breath_led_length , 0 );
293298
294299 if (chipset_in_state (CHIPSET_STATE_ON ) | power_button_enable ) {
295300 if (charge_prevent_power_on (0 ))
@@ -321,6 +326,7 @@ static void led_tick(void)
321326static void led_configure (void )
322327{
323328 int i ;
329+ uint8_t breath_led_level = FP_LED_HIGH ;
324330
325331 /*Initialize PWM channels*/
326332 for (i = 0 ; i < PWM_CH_COUNT ; i ++ ) {
@@ -329,8 +335,29 @@ static void led_configure(void)
329335
330336 system_get_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , & led_level );
331337
332- if (led_level )
338+
339+ if (led_level ) {
340+ switch (led_level ) {
341+ case FP_LED_BRIGHTNESS_HIGH :
342+ breath_led_level = FP_LED_HIGH ;
343+ breath_led_length = BREATH_ON_LENGTH_HIGH ;
344+ break ;
345+ case FP_LED_BRIGHTNESS_MEDIUM :
346+ breath_led_level = FP_LED_MEDIUM ;
347+ breath_led_length = BREATH_ON_LENGTH_MID ;
348+ break ;
349+ case FP_LED_BRIGHTNESS_LOW :
350+ breath_led_level = FP_BREATH_LOW ;
351+ breath_led_length = BREATH_ON_LENGTH_LOW ;
352+ break ;
353+ default :
354+ break ;
355+ }
356+ breath_led_color_map [EC_LED_COLOR_WHITE ].ch0 = breath_led_level ;
333357 pwr_led_color_map [EC_LED_COLOR_WHITE ].ch0 = led_level ;
358+ } else
359+ breath_led_length = BREATH_ON_LENGTH_HIGH ;
360+
334361
335362 led_tick ();
336363}
@@ -348,6 +375,7 @@ static enum ec_status fp_led_level_control(struct host_cmd_handler_args *args)
348375{
349376 const struct ec_params_fp_led_control * p = args -> params ;
350377 struct ec_response_fp_led_level * r = args -> response ;
378+ uint8_t breath_led_level ;
351379
352380 if (p -> get_led_level ) {
353381 system_get_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , & r -> level );
@@ -358,19 +386,27 @@ static enum ec_status fp_led_level_control(struct host_cmd_handler_args *args)
358386 switch (p -> set_led_level ) {
359387 case FP_LED_BRIGHTNESS_HIGH :
360388 led_level = FP_LED_HIGH ;
389+ breath_led_level = FP_LED_HIGH ;
390+ breath_led_length = BREATH_ON_LENGTH_HIGH ;
361391 break ;
362392 case FP_LED_BRIGHTNESS_MEDIUM :
363393 led_level = FP_LED_MEDIUM ;
394+ breath_led_level = FP_LED_MEDIUM ;
395+ breath_led_length = BREATH_ON_LENGTH_MID ;
364396 break ;
365397 case FP_LED_BRIGHTNESS_LOW :
366398 led_level = FP_LED_LOW ;
399+ breath_led_level = FP_BREATH_LOW ;
400+ breath_led_length = BREATH_ON_LENGTH_LOW ;
367401 break ;
368402 default :
369403 return EC_RES_INVALID_PARAM ;
370404 break ;
371405 }
372406
373407 system_set_bbram (STSTEM_BBRAM_IDX_FP_LED_LEVEL , led_level );
408+
409+ breath_led_color_map [EC_LED_COLOR_WHITE ].ch0 = breath_led_level ;
374410 pwr_led_color_map [EC_LED_COLOR_WHITE ].ch0 = led_level ;
375411
376412 return EC_RES_SUCCESS ;
0 commit comments