drivers: display: st7789v: use spi_dt_spec

Simplify driver implementation by using spi_dt_spec.

Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
Gerard Marull-Paretas 2022-01-31 12:25:19 +01:00 committed by Anas Nashif
commit 065f8645fb

View file

@ -23,7 +23,6 @@
#include <logging/log.h>
LOG_MODULE_REGISTER(display_st7789v);
#define ST7789V_CS_PIN DT_INST_SPI_DEV_CS_GPIOS_PIN(0)
#define ST7789V_CMD_DATA_PIN DT_INST_GPIO_PIN(0, cmd_data_gpios)
#define ST7789V_CMD_DATA_FLAGS DT_INST_GPIO_FLAGS(0, cmd_data_gpios)
#define ST7789V_RESET_PIN DT_INST_GPIO_PIN(0, reset_gpios)
@ -37,13 +36,11 @@ static uint8_t st7789v_nvgam_param[] = DT_INST_PROP(0, nvgam_param);
static uint8_t st7789v_ram_param[] = DT_INST_PROP(0, ram_param);
static uint8_t st7789v_rgb_param[] = DT_INST_PROP(0, rgb_param);
struct st7789v_data {
const struct device *spi_dev;
struct spi_config spi_config;
#if DT_INST_SPI_DEV_HAS_CS_GPIOS(0)
struct spi_cs_control cs_ctrl;
#endif
struct st7789v_config {
struct spi_dt_spec bus;
};
struct st7789v_data {
#if DT_INST_NODE_HAS_PROP(0, reset_gpios)
const struct device *reset_gpio;
#endif
@ -80,19 +77,19 @@ static void st7789v_set_cmd(const struct device *dev, int is_cmd)
static void st7789v_transmit(const struct device *dev, uint8_t cmd,
uint8_t *tx_data, size_t tx_count)
{
struct st7789v_data *data = dev->data;
const struct st7789v_config *config = dev->config;
struct spi_buf tx_buf = { .buf = &cmd, .len = 1 };
struct spi_buf_set tx_bufs = { .buffers = &tx_buf, .count = 1 };
st7789v_set_cmd(dev, 1);
spi_write(data->spi_dev, &data->spi_config, &tx_bufs);
spi_write_dt(&config->bus, &tx_bufs);
if (tx_data != NULL) {
tx_buf.buf = tx_data;
tx_buf.len = tx_count;
st7789v_set_cmd(dev, 0);
spi_write(data->spi_dev, &data->spi_config, &tx_bufs);
spi_write_dt(&config->bus, &tx_bufs);
}
}
@ -164,7 +161,7 @@ static int st7789v_write(const struct device *dev,
const struct display_buffer_descriptor *desc,
const void *buf)
{
struct st7789v_data *data = dev->data;
const struct st7789v_config *config = dev->config;
const uint8_t *write_data_start = (uint8_t *) buf;
struct spi_buf tx_buf;
struct spi_buf_set tx_bufs;
@ -199,7 +196,7 @@ static int st7789v_write(const struct device *dev,
for (write_cnt = 1U; write_cnt < nbr_of_writes; ++write_cnt) {
tx_buf.buf = (void *)write_data_start;
tx_buf.len = desc->width * ST7789V_PIXEL_SIZE * write_h;
spi_write(data->spi_dev, &data->spi_config, &tx_bufs);
spi_write_dt(&config->bus, &tx_bufs);
write_data_start += (desc->pitch * ST7789V_PIXEL_SIZE);
}
@ -340,30 +337,14 @@ static void st7789v_lcd_init(const struct device *dev)
static int st7789v_init(const struct device *dev)
{
const struct st7789v_config *config = dev->config;
struct st7789v_data *data = dev->data;
data->spi_dev = device_get_binding(DT_INST_BUS_LABEL(0));
if (data->spi_dev == NULL) {
LOG_ERR("Could not get SPI device for LCD");
return -EPERM;
if (!spi_is_ready(&config->bus)) {
LOG_ERR("SPI device not ready");
return -ENODEV;
}
data->spi_config.frequency =
DT_INST_PROP(0, spi_max_frequency);
data->spi_config.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8);
data->spi_config.slave = DT_INST_REG_ADDR(0);
#if DT_INST_SPI_DEV_HAS_CS_GPIOS(0)
data->cs_ctrl.gpio_dev = device_get_binding(
DT_INST_SPI_DEV_CS_GPIOS_LABEL(0));
data->cs_ctrl.gpio_pin = DT_INST_SPI_DEV_CS_GPIOS_PIN(0);
data->cs_ctrl.gpio_dt_flags = DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0);
data->cs_ctrl.delay = 0U;
data->spi_config.cs = &(data->cs_ctrl);
#else
data->spi_config.cs = NULL;
#endif
#if DT_INST_NODE_HAS_PROP(0, reset_gpios)
data->reset_gpio = device_get_binding(
DT_INST_GPIO_LABEL(0, reset_gpios));
@ -437,6 +418,10 @@ static const struct display_driver_api st7789v_api = {
.set_orientation = st7789v_set_orientation,
};
static const struct st7789v_config st7789v_config = {
.bus = SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0),
};
static struct st7789v_data st7789v_data = {
.width = DT_INST_PROP(0, width),
.height = DT_INST_PROP(0, height),
@ -446,6 +431,6 @@ static struct st7789v_data st7789v_data = {
PM_DEVICE_DT_INST_DEFINE(0, st7789v_pm_action);
DEVICE_DT_INST_DEFINE(0, &st7789v_init,
PM_DEVICE_DT_INST_GET(0), &st7789v_data, NULL, POST_KERNEL,
CONFIG_DISPLAY_INIT_PRIORITY, &st7789v_api);
DEVICE_DT_INST_DEFINE(0, &st7789v_init, PM_DEVICE_DT_INST_GET(0), &st7789v_data,
&st7789v_config, POST_KERNEL,
CONFIG_DISPLAY_INIT_PRIORITY, &st7789v_api);