diff options
Diffstat (limited to 'zephyr/shim/src/led_driver/led_pwm.c')
-rw-r--r-- | zephyr/shim/src/led_driver/led_pwm.c | 83 |
1 files changed, 40 insertions, 43 deletions
diff --git a/zephyr/shim/src/led_driver/led_pwm.c b/zephyr/shim/src/led_driver/led_pwm.c index 7935bc0d8a..00002fc32e 100644 --- a/zephyr/shim/src/led_driver/led_pwm.c +++ b/zephyr/shim/src/led_driver/led_pwm.c @@ -1,4 +1,4 @@ -/* Copyright 2022 The Chromium OS Authors. All rights reserved. +/* Copyright 2022 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * @@ -27,54 +27,44 @@ LOG_MODULE_REGISTER(pwm_led, LOG_LEVEL_ERR); * e.g. freq = 500 Hz, period_ns = 1000000000/500 = 2000000ns * duty_cycle = 50 %, pulse_ns = (2000000*50)/100 = 1000000ns */ -const uint32_t period_ns = - (NSEC_PER_SEC / DT_PROP(PWM_LED_PINS_NODE, pwm_frequency)); - -#define SET_PIN(node_id, prop, i) \ -{ \ - .pwm = DEVICE_DT_GET( \ - DT_PWMS_CTLR(DT_PHANDLE_BY_IDX(node_id, prop, i))), \ - .channel = DT_PWMS_CHANNEL( \ - DT_PHANDLE_BY_IDX(node_id, prop, i)), \ - .flags = DT_PWMS_FLAGS(DT_PHANDLE_BY_IDX(node_id, prop, i)), \ - .pulse_ns = DIV_ROUND_NEAREST( \ - period_ns * DT_PHA_BY_IDX(node_id, prop, i, value), 100), \ -}, - -#define SET_PWM_PIN(node_id) \ -{ \ - DT_FOREACH_PROP_ELEM(node_id, led_pins, SET_PIN) \ -}; - -#define GEN_PINS_ARRAY(id) \ -struct pwm_pin_t PINS_ARRAY(id)[] = SET_PWM_PIN(id) + +#define SET_PIN(node_id, prop, i) \ + { \ + .pwm = PWM_DT_SPEC_GET(DT_PHANDLE_BY_IDX(node_id, prop, i)), \ + .pulse_ns = DIV_ROUND_NEAREST( \ + DT_PWMS_PERIOD(DT_PHANDLE_BY_IDX(node_id, prop, i)) * \ + DT_PHA_BY_IDX(node_id, prop, i, value), \ + 100), \ + }, + +#define SET_PWM_PIN(node_id) \ + { DT_FOREACH_PROP_ELEM(node_id, led_pins, SET_PIN) }; + +#define GEN_PINS_ARRAY(id) struct pwm_pin_t PINS_ARRAY(id)[] = SET_PWM_PIN(id) DT_FOREACH_CHILD(PWM_LED_PINS_NODE, GEN_PINS_ARRAY) -#define SET_PIN_NODE(node_id) \ -{ \ - .led_color = GET_PROP(node_id, led_color), \ - .led_id = GET_PROP(node_id, led_id), \ - .br_color = GET_PROP_NVE(node_id, br_color), \ - .pwm_pins = PINS_ARRAY(node_id), \ - .pins_count = DT_PROP_LEN(node_id, led_pins) \ -}; +#define SET_PIN_NODE(node_id) \ + { .led_color = GET_PROP(node_id, led_color), \ + .led_id = GET_PROP(node_id, led_id), \ + .br_color = GET_PROP_NVE(node_id, br_color), \ + .pwm_pins = PINS_ARRAY(node_id), \ + .pins_count = DT_PROP_LEN(node_id, led_pins) }; /* * Initialize led_pins_node_t struct for each pin node defined */ -#define GEN_PINS_NODES(id) \ -const struct led_pins_node_t PINS_NODE(id) = SET_PIN_NODE(id) +#define GEN_PINS_NODES(id) \ + const struct led_pins_node_t PINS_NODE(id) = SET_PIN_NODE(id) DT_FOREACH_CHILD(PWM_LED_PINS_NODE, GEN_PINS_NODES) /* * Array of pointers to each pin node */ -#define PINS_NODE_PTR(id) &PINS_NODE(id), -const struct led_pins_node_t *pins_node[] = { - DT_FOREACH_CHILD(PWM_LED_PINS_NODE, PINS_NODE_PTR) -}; +#define PINS_NODE_PTR(id) &PINS_NODE(id), +const struct led_pins_node_t *pins_node[] = { DT_FOREACH_CHILD( + PWM_LED_PINS_NODE, PINS_NODE_PTR) }; /* * Set all the PWM channels defined in the node to the defined value, @@ -83,13 +73,9 @@ const struct led_pins_node_t *pins_node[] = { */ void led_set_color_with_node(const struct led_pins_node_t *pins_node) { + struct pwm_pin_t *pwm_pins = pins_node->pwm_pins; for (int j = 0; j < pins_node->pins_count; j++) { - pwm_set( - pins_node->pwm_pins[j].pwm, - pins_node->pwm_pins[j].channel, - period_ns, - pins_node->pwm_pins[j].pulse_ns, - pins_node->pwm_pins[j].flags); + pwm_set_pulse_dt(&pwm_pins[j].pwm, pwm_pins[j].pulse_ns); } } @@ -109,11 +95,18 @@ void led_set_color(enum led_color color, enum ec_led_id led_id) void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { + memset(brightness_range, 0, EC_LED_COLOR_COUNT); + for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { int br_color = pins_node[i]->br_color; - if (br_color != -1) + if (pins_node[i]->led_id != led_id) { + continue; + } + + if (br_color != -1) { brightness_range[br_color] = 100; + } } } @@ -124,6 +117,10 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { int br_color = pins_node[i]->br_color; + if (pins_node[i]->led_id != led_id) { + continue; + } + if ((br_color != -1) && (brightness[br_color] != 0)) { color_set = true; led_set_color(pins_node[i]->led_color, led_id); |