diff options
Diffstat (limited to 'drivers/oled')
| -rw-r--r-- | drivers/oled/oled_driver.c | 29 | ||||
| -rw-r--r-- | drivers/oled/oled_driver.h | 12 | 
2 files changed, 39 insertions, 2 deletions
| diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c index 92c64399e2..082115d534 100644 --- a/drivers/oled/oled_driver.c +++ b/drivers/oled/oled_driver.c @@ -24,6 +24,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "progmem.h" +#include "keyboard.h" +  // Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf  // for SH1106: https://www.velleman.eu/downloads/29/infosheets/sh1106_datasheet.pdf @@ -71,6 +73,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define PRE_CHARGE_PERIOD 0xD9  #define VCOM_DETECT 0xDB +// Advance Graphic Commands +#define FADE_BLINK 0x23 +#define ENABLE_FADE 0x20 +#define ENABLE_BLINK 0x30 +  // Charge Pump Commands  #define CHARGE_PUMP 0x8D @@ -152,6 +159,12 @@ static void InvertCharacter(uint8_t *cursor) {  }  bool oled_init(uint8_t rotation) { +#if defined(USE_I2C) && defined(SPLIT_KEYBOARD) +    if (!is_keyboard_master()) { +        return true; +    } +#endif +      oled_rotation = oled_init_user(rotation);      if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {          oled_rotation_width = OLED_DISPLAY_WIDTH; @@ -539,7 +552,13 @@ bool oled_on(void) {      oled_timeout = timer_read32() + OLED_TIMEOUT;  #endif -    static const uint8_t PROGMEM display_on[] = {I2C_CMD, DISPLAY_ON}; +    static const uint8_t PROGMEM display_on[] = +#ifdef OLED_FADE_OUT +        {I2C_CMD, FADE_BLINK, 0x00}; +#else +        {I2C_CMD, DISPLAY_ON}; +#endif +      if (!oled_active) {          if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {              print("oled_on cmd failed\n"); @@ -555,7 +574,13 @@ bool oled_off(void) {          return !oled_active;      } -    static const uint8_t PROGMEM display_off[] = {I2C_CMD, DISPLAY_OFF}; +    static const uint8_t PROGMEM display_off[] = +#ifdef OLED_FADE_OUT +        {I2C_CMD, FADE_BLINK, ENABLE_FADE | OLED_FADE_OUT_INTERVAL}; +#else +        {I2C_CMD, DISPLAY_OFF}; +#endif +      if (oled_active) {          if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {              print("oled_off cmd failed\n"); diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h index 72ab21247d..cbf5380ee0 100644 --- a/drivers/oled/oled_driver.h +++ b/drivers/oled/oled_driver.h @@ -154,10 +154,22 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #    endif  #endif +#if !defined(OLED_FADE_OUT_INTERVAL) +#    define OLED_FADE_OUT_INTERVAL 0x00 +#endif + +#if OLED_FADE_OUT_INTERVAL > 0x0F || OLED_FADE_OUT_INTERVAL < 0x00 +#    error OLED_FADE_OUT_INTERVAL must be between 0x00 and 0x0F +#endif +  #if !defined(OLED_I2C_TIMEOUT)  #    define OLED_I2C_TIMEOUT 100  #endif +#if !defined(OLED_UPDATE_INTERVAL) && defined(SPLIT_KEYBOARD) +#    define OLED_UPDATE_INTERVAL 50 +#endif +  typedef struct __attribute__((__packed__)) {      uint8_t *current_element;      uint16_t remaining_element_count; | 
