Skip to content

Commit c95189e

Browse files
Josh-Tsaiquinchou77
authored andcommitted
fwk: led: runtime to update the led duration
In the commit a30cccd, we only modified the LED driver to reduce the tick from 200ms to 10ms when the system enter suspend. We did not modify the LED driver to change the duration at runtime. It causes the period-ms value not to meet the actual behavior. This change modified the LED driver to change the color duration at runtime. BRANCH=fwk-main BUG=None TEST=When the system enter suspend, the led breathing can meet the period-ms value. Signed-off-by: Josh Tsai <[email protected]> (cherry picked from commit 5c04251c8ce2b246075a4d744d05432da730cf84)
1 parent e63966e commit c95189e

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

zephyr/program/framework/include/led.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,21 +141,21 @@ struct led_pins_node_t {
141141

142142
struct pattern_color_node_t {
143143
struct led_pins_node_t *led_color_node;
144-
uint8_t duration;
144+
int period_ms;
145145
};
146146

147147
struct led_pattern_node_t {
148148
uint8_t cur_color;
149-
uint8_t ticks;
149+
uint16_t ticks;
150150
enum led_transition transition;
151151
struct pattern_color_node_t *pattern_color;
152152
uint8_t pattern_len;
153153
};
154154

155155
#define GET_COLOR(pattern_element, color_index) \
156156
pattern_element.pattern_color[color_index].led_color
157-
#define GET_DURATION(pattern_element, color_index) \
158-
pattern_element.pattern_color[color_index].duration
157+
#define GET_DURATION(pattern_element, color_index, curr_tick) \
158+
(pattern_element.pattern_color[color_index].period_ms / curr_tick)
159159

160160
/**
161161
* Set LED color using color enum
@@ -188,6 +188,13 @@ int fp_led_auto_is_enable(void);
188188

189189
int kbbl_auto_dim_is_enable(void);
190190

191+
/**
192+
* Return the current tick time from led driver
193+
*
194+
* @return current led tick time
195+
*/
196+
int led_get_current_tick_time(void);
197+
191198
#ifdef TEST_BUILD
192199
const struct led_pins_node_t *led_get_node(enum led_color color,
193200
enum ec_led_id led_id);

zephyr/program/framework/src/led.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ DT_FOREACH_CHILD_STATUS_OKAY_VARGS(
6262
.led_color_node = &PINS_NODE_FROM_POLICY( \
6363
GET_PROP(DT_PARENT(id), led_id), \
6464
GET_PROP(id, led_color)), \
65-
.duration = \
66-
DT_PROP_OR(id, period_ms, 0) / HOOK_TICK_INTERVAL_MS, \
65+
.period_ms = DT_PROP_OR(id, period_ms, 0) \
6766
},
6867

6968
#define PATTERN_COLOR_ARRAY(id) DT_CAT(PATTERN_COLOR_, id)
@@ -156,6 +155,11 @@ static bool last_kbbl_led_brightness;
156155
#endif
157156
static int prev_als_lux;
158157

158+
int led_get_current_tick_time(void)
159+
{
160+
return led_tick_time;
161+
}
162+
159163
/*
160164
* return auto dim status, it decided by BIOS setup menu
161165
* option(Power Button LED Brightness level).
@@ -322,11 +326,11 @@ static void set_color(int node_idx)
322326

323327
led_set_color_with_pattern(&patterns[i]);
324328

325-
if (GET_DURATION(patterns[i], patterns[i].cur_color) != 0)
329+
if (GET_DURATION(patterns[i], patterns[i].cur_color, led_tick_time) != 0)
326330
patterns[i].ticks++;
327331

328332
if (patterns[i].ticks >=
329-
GET_DURATION(patterns[i], patterns[i].cur_color)) {
333+
GET_DURATION(patterns[i], patterns[i].cur_color, led_tick_time)) {
330334
patterns[i].cur_color++;
331335
patterns[i].ticks = 0;
332336
}

zephyr/program/framework/src/led_pwm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ void led_set_color_with_pattern(const struct led_pattern_node_t *pattern)
131131
{
132132
uint8_t pins_count = pattern->pattern_color[pattern->cur_color]
133133
.led_color_node->pins_count;
134-
uint8_t duration = pattern->pattern_color[pattern->cur_color].duration;
134+
int curr_tick = led_get_current_tick_time();
135+
int duration = pattern->pattern_color[pattern->cur_color].period_ms / curr_tick;
135136
struct pwm_pin_t *next_color =
136137
pattern->pattern_color[pattern->cur_color]
137138
.led_color_node->pwm_pins;

0 commit comments

Comments
 (0)