From 304e7534c9868a71e5b1c231df7e8fa5cd260e15 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 5 Jan 2021 13:16:57 -0700 Subject: [PATCH] Add led value and color commands --- src/board/system76/common/smfi.c | 61 +++++++++++++++++++++++++++++ src/common/include/common/command.h | 10 +++++ tool/src/ec.rs | 51 ++++++++++++++++++++++++ 3 files changed, 122 insertions(+) diff --git a/src/board/system76/common/smfi.c b/src/board/system76/common/smfi.c index eb64177..e6a0749 100644 --- a/src/board/system76/common/smfi.c +++ b/src/board/system76/common/smfi.c @@ -19,6 +19,7 @@ #ifndef __SCRATCH__ #include + #include #include #endif #include @@ -183,6 +184,54 @@ static enum Result cmd_keymap_set(void) { return RES_ERR; } } + +static enum Result cmd_led_get_value(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + smfi_cmd[SMFI_CMD_DATA + 1] = kbled_get(); + smfi_cmd[SMFI_CMD_DATA + 2] = kbled_max(); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_set_value(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + kbled_set(smfi_cmd[SMFI_CMD_DATA + 1]); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_get_color(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + uint32_t color = kbled_get_color(); + smfi_cmd[SMFI_CMD_DATA + 1] = (uint8_t)(color >> 16); + smfi_cmd[SMFI_CMD_DATA + 2] = (uint8_t)(color >> 8); + smfi_cmd[SMFI_CMD_DATA + 3] = (uint8_t)(color >> 0); + return RES_OK; + } else { + return RES_ERR; + } +} + +static enum Result cmd_led_set_color(void) { + uint8_t index = smfi_cmd[SMFI_CMD_DATA]; + if (index == CMD_LED_INDEX_ALL) { + kbled_set_color( + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 1]) << 16) | + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 2]) << 8) | + (((uint32_t)smfi_cmd[SMFI_CMD_DATA + 3]) << 0) + ); + return RES_OK; + } else { + return RES_ERR; + } +} #endif // !defined(__SCRATCH__) #if defined(__SCRATCH__) @@ -296,6 +345,18 @@ void smfi_event(void) { case CMD_KEYMAP_SET: smfi_cmd[SMFI_CMD_RES] = cmd_keymap_set(); break; + case CMD_LED_GET_VALUE: + smfi_cmd[SMFI_CMD_RES] = cmd_led_get_value(); + break; + case CMD_LED_SET_VALUE: + smfi_cmd[SMFI_CMD_RES] = cmd_led_set_value(); + break; + case CMD_LED_GET_COLOR: + smfi_cmd[SMFI_CMD_RES] = cmd_led_get_color(); + break; + case CMD_LED_SET_COLOR: + smfi_cmd[SMFI_CMD_RES] = cmd_led_set_color(); + break; #endif // !defined(__SCRATCH__) case CMD_SPI: smfi_cmd[SMFI_CMD_RES] = cmd_spi(); diff --git a/src/common/include/common/command.h b/src/common/include/common/command.h index e9f442e..3043cc0 100644 --- a/src/common/include/common/command.h +++ b/src/common/include/common/command.h @@ -26,6 +26,14 @@ enum Command { CMD_KEYMAP_GET = 9, // Set keyboard map index CMD_KEYMAP_SET = 10, + // Get LED value by index + CMD_LED_GET_VALUE = 11, + // Set LED value by index + CMD_LED_SET_VALUE = 12, + // Get LED color by index + CMD_LED_GET_COLOR = 13, + // Set LED color by index + CMD_LED_SET_COLOR = 14, //TODO }; @@ -48,4 +56,6 @@ enum CommandSpiFlag { CMD_SPI_FLAG_BACKUP = (1 << 3), }; +#define CMD_LED_INDEX_ALL 0xFF + #endif // _COMMON_COMMAND_H diff --git a/tool/src/ec.rs b/tool/src/ec.rs index 8491b25..7d25b88 100644 --- a/tool/src/ec.rs +++ b/tool/src/ec.rs @@ -25,6 +25,10 @@ enum Cmd { FanSet = 8, KeymapGet = 9, KeymapSet = 10, + LedGetValue = 11, + LedSetValue = 12, + LedGetColor = 13, + LedSetColor = 14, } const CMD_SPI_FLAG_READ: u8 = 1 << 0; @@ -193,6 +197,53 @@ impl Ec { ]; self.command(Cmd::KeymapSet, &mut data) } + + // Get LED value by index + pub unsafe fn led_get_value(&mut self, index: u8) -> Result<(u8, u8), Error> { + let mut data = [ + index, + 0, + 0, + ]; + self.command(Cmd::LedGetValue, &mut data)?; + Ok((data[1], data[2])) + } + + // Set LED value by index + pub unsafe fn led_set_value(&mut self, index: u8, value: u8) -> Result<(), Error> { + let mut data = [ + index, + value, + ]; + self.command(Cmd::LedSetValue, &mut data) + } + + // Get LED color by index + pub unsafe fn led_get_color(&mut self, index: u8) -> Result<(u8, u8, u8), Error> { + let mut data = [ + index, + 0, + 0, + 0, + ]; + self.command(Cmd::LedGetColor, &mut data)?; + Ok(( + data[1], + data[2], + data[3], + )) + } + + // Set LED color by index + pub unsafe fn led_set_color(&mut self, index: u8, red: u8, green: u8, blue: u8) -> Result<(), Error> { + let mut data = [ + index, + red, + green, + blue, + ]; + self.command(Cmd::LedSetColor, &mut data) + } } pub struct EcSpi<'a, A: Access> {