From 3f199180414445d4157a80f505dbf48d00d02fca Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Mon, 11 May 2020 16:29:47 +0200 Subject: [PATCH] drivers: ssd16xx: add temperature sensor support Appropriate WS can be loaded automatically if the display controller has integrated temperature sensor or an external sensor is connected. Signed-off-by: Johann Fischer --- .../waveshare_epaper_gdeh0154a07.overlay | 1 + drivers/display/ssd16xx.c | 26 ++++++++++++++++--- dts/bindings/display/solomon,ssd16xx.yaml | 9 +++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/boards/shields/waveshare_epaper/waveshare_epaper_gdeh0154a07.overlay b/boards/shields/waveshare_epaper/waveshare_epaper_gdeh0154a07.overlay index 15872e9482c..7e0ae2b35f5 100644 --- a/boards/shields/waveshare_epaper/waveshare_epaper_gdeh0154a07.overlay +++ b/boards/shields/waveshare_epaper/waveshare_epaper_gdeh0154a07.overlay @@ -24,5 +24,6 @@ sdv = [41 a8 32]; vcom = <0x00>; border-waveform = <0x05>; + tssv = <0x80>; }; }; diff --git a/drivers/display/ssd16xx.c b/drivers/display/ssd16xx.c index b1acd2537d0..59f52f764a5 100644 --- a/drivers/display/ssd16xx.c +++ b/drivers/display/ssd16xx.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 PHYTEC Messtechnik GmbH + * Copyright (c) 2018-2020 PHYTEC Messtechnik GmbH * * SPDX-License-Identifier: Apache-2.0 */ @@ -22,7 +22,7 @@ LOG_MODULE_REGISTER(ssd16xx); #include /** - * SSD1673, SSD1608 compatible EPD controller driver. + * SSD1673, SSD1608, SSD1681, ILI3897 compatible EPD controller driver. */ #define SSD16XX_SPI_FREQ DT_INST_PROP(0, spi_max_frequency) @@ -435,9 +435,28 @@ static int ssd16xx_clear_cntlr_mem(struct device *dev, uint8_t ram_cmd, static inline int ssd16xx_load_ws_from_otp(struct device *dev) { struct ssd16xx_data *driver = dev->driver_data; - int16_t t = (SSD16XX_DEFAULT_TR_VALUE * SSD16XX_TR_SCALE_FACTOR); uint8_t tmp[2]; +#if DT_INST_NODE_HAS_PROP(0, tssv) + /* + * Controller has an integrated temperature sensor or external + * temperature sensor is connected to the controller. + */ + LOG_INF("Select and load WS from OTP"); + + tmp[0] = DT_INST_PROP(0, tssv); + if (ssd16xx_write_cmd(driver, + SSD16XX_CMD_TSENSOR_SELECTION, + tmp, 1)) { + return -EIO; + } + + driver->update_cmd |= SSD16XX_CTRL2_LOAD_LUT | + SSD16XX_CTRL2_LOAD_TEMPERATURE; + + return 0; +#else + int16_t t = (SSD16XX_DEFAULT_TR_VALUE * SSD16XX_TR_SCALE_FACTOR); LOG_INF("Load default WS (25 degrees Celsius) from OTP"); @@ -477,6 +496,7 @@ static inline int ssd16xx_load_ws_from_otp(struct device *dev) driver->update_cmd |= SSD16XX_CTRL2_LOAD_LUT; return 0; +#endif } static int ssd16xx_load_ws_initial(struct device *dev) diff --git a/dts/bindings/display/solomon,ssd16xx.yaml b/dts/bindings/display/solomon,ssd16xx.yaml index 6ceec4684c3..97ab09042ad 100644 --- a/dts/bindings/display/solomon,ssd16xx.yaml +++ b/dts/bindings/display/solomon,ssd16xx.yaml @@ -92,3 +92,12 @@ properties: lut-default: type: uint8-array required: false + + tssv: + type: int + required: false + description: Temperature Sensor Selection Value + + Display controller can have integrated temperature sensor or + an external temperature sensor is connected to the controller. + The value selects which sensor should be used.