drivers: Clear SSD1673 display during display init
Clear SSD1673 display during display driver initialization instead of triggering clear via setting contrast. Signed-off-by: Jan Van Winkel <jan.van_winkel@dxplore.eu>
This commit is contained in:
parent
79b58aa3fa
commit
6f42904185
2 changed files with 83 additions and 55 deletions
|
@ -39,10 +39,7 @@ struct ssd1673_data {
|
||||||
#if defined(DT_SSD1673_SPI_GPIO_CS_DRV_NAME)
|
#if defined(DT_SSD1673_SPI_GPIO_CS_DRV_NAME)
|
||||||
struct spi_cs_control cs_ctrl;
|
struct spi_cs_control cs_ctrl;
|
||||||
#endif
|
#endif
|
||||||
u8_t contrast;
|
|
||||||
u8_t scan_mode;
|
u8_t scan_mode;
|
||||||
u8_t last_lut;
|
|
||||||
u8_t numof_part_cycles;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SSD1673_LAST_LUT_INITIAL 0
|
#define SSD1673_LAST_LUT_INITIAL 0
|
||||||
|
@ -174,7 +171,7 @@ static int ssd1673_suspend(const struct device *dev)
|
||||||
&tmp, sizeof(tmp));
|
&tmp, sizeof(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssd1673_update_display(const struct device *dev, bool initial)
|
static int ssd1673_update_display(const struct device *dev)
|
||||||
{
|
{
|
||||||
struct ssd1673_data *driver = dev->driver_data;
|
struct ssd1673_data *driver = dev->driver_data;
|
||||||
u8_t tmp;
|
u8_t tmp;
|
||||||
|
@ -187,29 +184,6 @@ static int ssd1673_update_display(const struct device *dev, bool initial)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initial) {
|
|
||||||
driver->numof_part_cycles = 0U;
|
|
||||||
driver->last_lut = SSD1673_LAST_LUT_INITIAL;
|
|
||||||
err = ssd1673_write_cmd(driver, SSD1673_CMD_UPDATE_LUT,
|
|
||||||
ssd1673_lut_initial,
|
|
||||||
sizeof(ssd1673_lut_initial));
|
|
||||||
if (err < 0) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
driver->numof_part_cycles++;
|
|
||||||
if (driver->last_lut != SSD1673_LAST_LUT_DEFAULT) {
|
|
||||||
driver->last_lut = SSD1673_LAST_LUT_DEFAULT;
|
|
||||||
err = ssd1673_write_cmd(driver, SSD1673_CMD_UPDATE_LUT,
|
|
||||||
ssd1673_lut_default,
|
|
||||||
sizeof(ssd1673_lut_default));
|
|
||||||
if (err < 0) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp = (SSD1673_CTRL2_ENABLE_CLK |
|
tmp = (SSD1673_CTRL2_ENABLE_CLK |
|
||||||
SSD1673_CTRL2_ENABLE_ANALOG |
|
SSD1673_CTRL2_ENABLE_ANALOG |
|
||||||
SSD1673_CTRL2_TO_PATTERN |
|
SSD1673_CTRL2_TO_PATTERN |
|
||||||
|
@ -235,7 +209,6 @@ static int ssd1673_write(const struct device *dev, const u16_t x,
|
||||||
u8_t dummy_page[SSD1673_RAM_YRES];
|
u8_t dummy_page[SSD1673_RAM_YRES];
|
||||||
struct spi_buf sbuf = {.buf = &cmd, .len = 1};
|
struct spi_buf sbuf = {.buf = &cmd, .len = 1};
|
||||||
struct spi_buf_set buf_set = {.buffers = &sbuf, .count = 1};
|
struct spi_buf_set buf_set = {.buffers = &sbuf, .count = 1};
|
||||||
bool update = true;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (desc->pitch < desc->width) {
|
if (desc->pitch < desc->width) {
|
||||||
|
@ -344,15 +317,7 @@ static int ssd1673_write(const struct device *dev, const u16_t x,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ssd1673_update_display(dev);
|
||||||
if (update) {
|
|
||||||
if (driver->contrast) {
|
|
||||||
return ssd1673_update_display(dev, true);
|
|
||||||
}
|
|
||||||
return ssd1673_update_display(dev, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssd1673_read(const struct device *dev, const u16_t x,
|
static int ssd1673_read(const struct device *dev, const u16_t x,
|
||||||
|
@ -379,11 +344,8 @@ static int ssd1673_set_brightness(const struct device *dev,
|
||||||
|
|
||||||
static int ssd1673_set_contrast(const struct device *dev, u8_t contrast)
|
static int ssd1673_set_contrast(const struct device *dev, u8_t contrast)
|
||||||
{
|
{
|
||||||
struct ssd1673_data *driver = dev->driver_data;
|
LOG_WRN("not supported");
|
||||||
|
return -ENOTSUP;
|
||||||
driver->contrast = contrast;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ssd1673_get_capabilities(const struct device *dev,
|
static void ssd1673_get_capabilities(const struct device *dev,
|
||||||
|
@ -418,11 +380,66 @@ static int ssd1673_set_pixel_format(const struct device *dev,
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ssd1673_clear_and_write_buffer(struct device *dev)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
u8_t clear_page[SSD1673_RAM_YRES];
|
||||||
|
u8_t page;
|
||||||
|
struct spi_buf sbuf;
|
||||||
|
struct spi_buf_set buf_set = {.buffers = &sbuf, .count = 1};
|
||||||
|
struct ssd1673_data *driver = dev->driver_data;
|
||||||
|
u8_t tmp;
|
||||||
|
|
||||||
|
tmp = SSD1673_DATA_ENTRY_XIYDY;
|
||||||
|
err = ssd1673_write_cmd(driver, SSD1673_CMD_ENTRY_MODE, &tmp, 1);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ssd1673_set_ram_param(driver, SSD1673_PANEL_FIRST_PAGE,
|
||||||
|
SSD1673_PANEL_LAST_PAGE + 1,
|
||||||
|
SSD1673_PANEL_LAST_GATE,
|
||||||
|
SSD1673_PANEL_FIRST_GATE);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ssd1673_set_ram_ptr(driver, SSD1673_PANEL_FIRST_PAGE,
|
||||||
|
SSD1673_PANEL_LAST_GATE);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio_pin_write(driver->dc, DT_SSD1673_DC_PIN, 0);
|
||||||
|
|
||||||
|
tmp = SSD1673_CMD_WRITE_RAM;
|
||||||
|
sbuf.buf = &tmp;
|
||||||
|
sbuf.len = 1;
|
||||||
|
err = spi_write(driver->spi_dev, &driver->spi_config, &buf_set);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio_pin_write(driver->dc, DT_SSD1673_DC_PIN, 1);
|
||||||
|
|
||||||
|
memset(clear_page, 0xff, sizeof(clear_page));
|
||||||
|
sbuf.buf = clear_page;
|
||||||
|
sbuf.len = sizeof(clear_page);
|
||||||
|
for (page = 0; page <= (SSD1673_PANEL_LAST_PAGE + 1); ++page) {
|
||||||
|
err = spi_write(driver->spi_dev, &driver->spi_config, &buf_set);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ssd1673_update_display(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int ssd1673_controller_init(struct device *dev)
|
static int ssd1673_controller_init(struct device *dev)
|
||||||
{
|
{
|
||||||
struct ssd1673_data *driver = dev->driver_data;
|
|
||||||
u8_t tmp[3];
|
|
||||||
int err;
|
int err;
|
||||||
|
u8_t tmp[3];
|
||||||
|
struct ssd1673_data *driver = dev->driver_data;
|
||||||
|
|
||||||
LOG_DBG("");
|
LOG_DBG("");
|
||||||
|
|
||||||
|
@ -477,11 +494,29 @@ static int ssd1673_controller_init(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
ssd1673_set_orientation_internall(driver);
|
ssd1673_set_orientation_internall(driver);
|
||||||
driver->numof_part_cycles = 0U;
|
|
||||||
driver->last_lut = SSD1673_LAST_LUT_INITIAL;
|
|
||||||
driver->contrast = 0U;
|
|
||||||
|
|
||||||
return 0;
|
err = ssd1673_write_cmd(driver, SSD1673_CMD_UPDATE_LUT,
|
||||||
|
ssd1673_lut_initial,
|
||||||
|
sizeof(ssd1673_lut_initial));
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ssd1673_clear_and_write_buffer(dev);
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssd1673_busy_wait(driver);
|
||||||
|
|
||||||
|
err = ssd1673_write_cmd(driver, SSD1673_CMD_UPDATE_LUT,
|
||||||
|
ssd1673_lut_default,
|
||||||
|
sizeof(ssd1673_lut_default));
|
||||||
|
if (err < 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ssd1673_clear_and_write_buffer(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssd1673_init(struct device *dev)
|
static int ssd1673_init(struct device *dev)
|
||||||
|
|
|
@ -162,7 +162,6 @@ static int cfb_invert(const struct char_framebuffer *fb)
|
||||||
|
|
||||||
int cfb_framebuffer_clear(struct device *dev, bool clear_display)
|
int cfb_framebuffer_clear(struct device *dev, bool clear_display)
|
||||||
{
|
{
|
||||||
const struct display_driver_api *api = dev->driver_api;
|
|
||||||
const struct char_framebuffer *fb = &char_fb;
|
const struct char_framebuffer *fb = &char_fb;
|
||||||
struct display_buffer_descriptor desc;
|
struct display_buffer_descriptor desc;
|
||||||
|
|
||||||
|
@ -176,12 +175,6 @@ int cfb_framebuffer_clear(struct device *dev, bool clear_display)
|
||||||
desc.pitch = fb->x_res;
|
desc.pitch = fb->x_res;
|
||||||
memset(fb->buf, 0, fb->size);
|
memset(fb->buf, 0, fb->size);
|
||||||
|
|
||||||
if (clear_display && (fb->screen_info & SCREEN_INFO_EPD)) {
|
|
||||||
api->set_contrast(dev, 1);
|
|
||||||
api->write(dev, 0, 0, &desc, fb->buf);
|
|
||||||
api->set_contrast(dev, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue