diff --git a/drivers/display/ssd1306.c b/drivers/display/ssd1306.c index 3f959e01abf..3c91e3d8127 100644 --- a/drivers/display/ssd1306.c +++ b/drivers/display/ssd1306.c @@ -47,6 +47,7 @@ LOG_MODULE_REGISTER(ssd1306); #endif struct ssd1306_data { + struct device *reset; struct device *i2c; u8_t contrast; u8_t scan_mode; @@ -366,6 +367,12 @@ static int ssd1306_init_device(struct device *dev) SSD1306_SET_NORMAL_DISPLAY, }; +#ifdef DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_CONTROLLER + gpio_pin_write(driver->reset, DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_PIN, 0); + k_sleep(SSD1306_RESET_DELAY); + gpio_pin_write(driver->reset, DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_PIN, 1); +#endif + /* Turn display off */ if (ssd1306_reg_write(driver, SSD1306_CONTROL_LAST_BYTE_CMD, SSD1306_DISPLAY_OFF)) { @@ -415,6 +422,18 @@ static int ssd1306_init(struct device *dev) return -EINVAL; } +#ifdef DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_CONTROLLER + driver->reset = device_get_binding(DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_CONTROLLER); + if (driver->reset == NULL) { + LOG_ERR("Failed to get pointer to %s device!", + DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_CONTROLLER); + return -EINVAL; + } + + gpio_pin_configure(driver->reset, DT_SOLOMON_SSD1306FB_0_RESET_GPIOS_PIN, + GPIO_DIR_OUT); +#endif + if (ssd1306_init_device(dev)) { LOG_ERR("Failed to initialize device!"); return -EIO; diff --git a/drivers/display/ssd1306_regs.h b/drivers/display/ssd1306_regs.h index 15974067c74..0d001f8b592 100644 --- a/drivers/display/ssd1306_regs.h +++ b/drivers/display/ssd1306_regs.h @@ -106,4 +106,7 @@ #define SSD1306_READ_MODIFY_WRITE_START 0xe0 #define SSD1306_READ_MODIFY_WRITE_END 0xee +/* time constants in ms */ +#define SSD1306_RESET_DELAY 1 + #endif