diff options
author | Yun-chieh, Lee <lyunjie@google.com> | 2020-09-14 00:31:55 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-09-24 18:46:40 +0000 |
commit | 1c5511ed5e33231038e019b247df19e1b6178afd (patch) | |
tree | e90328994c46bf1fe679229be090cf7fd9d8d969 /board | |
parent | de120a50f59240ed76d3942b779a36bd0cdeb888 (diff) | |
download | chrome-ec-1c5511ed5e33231038e019b247df19e1b6178afd.tar.gz |
ucsa: display pdo on lcd and handle button event
Display pdo on lcd and select supply voltage with buttons.
BUG=b:162057390
TEST=make buildall
BRANCH=master
Signed-off-by: Yun-Chieh Lee <lyunjie@google.com>
Change-Id: Ibee29a47bd7744dff08deb8eb14bf97d0ddc627e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2407614
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/fusb307bgevb/board.c | 130 | ||||
-rw-r--r-- | board/fusb307bgevb/gpio.inc | 6 |
2 files changed, 113 insertions, 23 deletions
diff --git a/board/fusb307bgevb/board.c b/board/fusb307bgevb/board.c index a872afc7e8..35dececafb 100644 --- a/board/fusb307bgevb/board.c +++ b/board/fusb307bgevb/board.c @@ -11,6 +11,7 @@ #include "hooks.h" #include "i2c.h" #include "lcd.h" +#include "printf.h" #include "queue_policies.h" #include "registers.h" #include "task.h" @@ -20,6 +21,7 @@ #include "usart_rx_dma.h" #include "usb_gpio.h" #include "usb-stream.h" +#include "usb_common.h" #include "util.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) @@ -31,14 +33,119 @@ static void tcpc_alert_event(enum gpio_signal signal) } /****************************************************************************** + * Handle button presses. Press BUTTON REFRESH to refresh pdos shown on lcd. + * Press BUTTON DOWN to select pdo. Prss BUTTON ENTER to confirm selection. + */ +static int count; + +static void button_enter_event_deferred(void) +{ + uint32_t ma, mv; + + CPRINTS("Button enter event"); + + if (count >= 0 && count < pd_get_src_cap_cnt(0)) { + pd_extract_pdo_power(pd_get_src_caps(0)[count], &ma, &mv); + pd_request_source_voltage(0, mv); + } else { + CPRINTS("ERROR: button counter weird value."); + return; + } +} +DECLARE_DEFERRED(button_enter_event_deferred); + +void button_enter_event(enum gpio_signal signal) +{ + hook_call_deferred(&button_enter_event_deferred_data, 100 * MSEC); +} + +static void button_refresh_event_deferred(void) +{ + int i; + uint32_t ma, mv; + char c[20]; + + CPRINTS("Button refresh event"); + count = 0; + + /* Display supply voltage on first page. */ + lcd_clear(); + for (i = 0; i < MIN(pd_get_src_cap_cnt(0), 4); i++) { + pd_extract_pdo_power(pd_get_src_caps(0)[i], &ma, &mv); + snprintf(c, ARRAY_SIZE(c), "[%d] %dmV %dmA", i, mv, ma); + lcd_set_cursor(0, i); + lcd_print_string(c); + } + + /* Display selector */ + lcd_set_cursor(19, 0); + lcd_print_string("V"); +} +DECLARE_DEFERRED(button_refresh_event_deferred); + +void button_refresh_event(enum gpio_signal signal) +{ + hook_call_deferred(&button_refresh_event_deferred_data, 100 * MSEC); +} + +static void button_down_event_deferred(void) +{ + int i; + uint32_t ma, mv; + char c[20]; + + CPRINTS("Button down event"); + if (pd_get_src_cap_cnt(0) > 0) + count = (count + 1) % pd_get_src_cap_cnt(0); + else { + /* Hasn't plug in adaptor yet, do nothing. */ + return; + } + + /* Display all supply voltage, count will never be greater than 7 */ + if (count == 0) { + lcd_clear(); + for (i = 0; i < MIN(pd_get_src_cap_cnt(0), 4); i++) { + pd_extract_pdo_power(pd_get_src_caps(0)[i], &ma, &mv); + snprintf(c, ARRAY_SIZE(c), "[%d] %dmV %dmA", i, mv, ma); + lcd_set_cursor(0, i); + lcd_print_string(c); + } + } + if (count == 4) { + lcd_clear(); + for (i = 4; i < pd_get_src_cap_cnt(0); i++) { + pd_extract_pdo_power(pd_get_src_caps(0)[i], &ma, &mv); + snprintf(c, ARRAY_SIZE(c), "[%d] %dmV %dmA", i, mv, ma); + lcd_set_cursor(0, i - 4); + lcd_print_string(c); + } + } + + /* Clear last col on LCD */ + for (i = 0; i < 4; i++) { + lcd_set_cursor(19, i); + lcd_print_string(" "); + } + /* Display selector */ + lcd_set_cursor(19, count % 4); + lcd_print_string("V"); +} +DECLARE_DEFERRED(button_down_event_deferred); + +void button_down_event(enum gpio_signal signal) +{ + hook_call_deferred(&button_down_event_deferred_data, 100 * MSEC); +} + +/****************************************************************************** * Build GPIO tables and expose a subset of the GPIOs over USB. */ -void button_event(enum gpio_signal signal); #include "gpio_list.h" static enum gpio_signal const usb_gpio_list[] = { GPIO_USER_BUTTON_ENTER, - GPIO_USER_BUTTON_UP, + GPIO_USER_BUTTON_REFRESH, GPIO_USER_BUTTON_DOWN, }; @@ -114,23 +221,6 @@ USB_STREAM_CONFIG(forward_usb, usart_to_usb) /****************************************************************************** - * Handle button presses by cycling the LEDs on the board. Also run a tick - * handler to cycle them when they are not actively under USB control. - */ -static enum gpio_signal button_signal; - -static void button_event_deferred(void) -{ -} -DECLARE_DEFERRED(button_event_deferred); - -void button_event(enum gpio_signal signal) -{ - button_signal = signal; - hook_call_deferred(&button_event_deferred_data, 100 * MSEC); -} - -/****************************************************************************** * Define the strings used in our USB descriptors. */ const void *const usb_strings[] = { @@ -215,7 +305,7 @@ static void board_init(void) { /* Enable button interrupts */ gpio_enable_interrupt(GPIO_USER_BUTTON_ENTER); - gpio_enable_interrupt(GPIO_USER_BUTTON_UP); + gpio_enable_interrupt(GPIO_USER_BUTTON_REFRESH); gpio_enable_interrupt(GPIO_USER_BUTTON_DOWN); /* Enable TCPC alert interrupts */ gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); diff --git a/board/fusb307bgevb/gpio.inc b/board/fusb307bgevb/gpio.inc index 2aef4e3d2d..16a845576d 100644 --- a/board/fusb307bgevb/gpio.inc +++ b/board/fusb307bgevb/gpio.inc @@ -8,10 +8,10 @@ /* Declare symbolic names for all the GPIOs that we care about. * Note: Those with interrupt handlers must be declared first. */ -GPIO_INT(USER_BUTTON_ENTER, PIN(A, 0), GPIO_INT_FALLING, button_event) -GPIO_INT(USER_BUTTON_UP, PIN(A, 1), GPIO_INT_FALLING, button_event) -GPIO_INT(USER_BUTTON_DOWN, PIN(A, 2), GPIO_INT_FALLING, button_event) GPIO_INT(USB_C0_PD_INT_ODL, PIN(A, 8), GPIO_INT_FALLING | GPIO_PULL_UP, tcpc_alert_event) +GPIO_INT(USER_BUTTON_ENTER, PIN(A, 0), GPIO_INT_FALLING, button_enter_event) +GPIO_INT(USER_BUTTON_REFRESH, PIN(A, 1), GPIO_INT_FALLING, button_refresh_event) +GPIO_INT(USER_BUTTON_DOWN, PIN(A, 2), GPIO_INT_FALLING, button_down_event) /* * I2C pins should be configured as inputs until I2C module is |