From c51496fe2e1e4539beee1e179aacd46e2e9cfea3 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Sun, 9 Jul 2023 11:57:59 +0200 Subject: [PATCH] drivers/ili9341: move basic communication functions to drivers/lcd --- drivers/ili9341/ili9341.c | 87 +++++++++++++++------------------------ 1 file changed, 34 insertions(+), 53 deletions(-) diff --git a/drivers/ili9341/ili9341.c b/drivers/ili9341/ili9341.c index 36212e2be2..9490a41674 100644 --- a/drivers/ili9341/ili9341.c +++ b/drivers/ili9341/ili9341.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2018 Koen Zandberg + * 2023 Gunar Schorcht * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level @@ -14,6 +15,7 @@ * @brief Device driver implementation for the ili9341 display controller * * @author Koen Zandberg + * @author Gunar Schorcht * * @} */ @@ -22,8 +24,8 @@ #include #include "byteorder.h" #include "periph/spi.h" -#include "ztimer.h" #include "kernel_defines.h" +#include "ztimer.h" #include "ili9341.h" #include "ili9341_internal.h" @@ -33,18 +35,6 @@ #define ENABLE_DEBUG 0 #include "debug.h" -static void _write_cmd(const lcd_t *dev, uint8_t cmd, const uint8_t *data, - size_t len) -{ - gpio_clear(dev->params->dcx_pin); - spi_transfer_byte(dev->params->spi, dev->params->cs_pin, len ? true : false, cmd); - gpio_set(dev->params->dcx_pin); - if (len) { - spi_transfer_bytes(dev->params->spi, dev->params->cs_pin, false, data, - NULL, len); - } -} - /* datasheet page 178, table converted to equation. * gvdd in 1mv increments: 4850 = 4.85V */ static uint8_t _ili9341_calc_pwrctl1(uint16_t gvdd) @@ -66,72 +56,57 @@ static uint8_t _ili9341_calc_vml(int16_t vcoml) static int _init(lcd_t *dev, const lcd_params_t *params) { assert(params->lines >= 16 && params->lines <= 320 && !(params->lines & 0x7)); - dev->params = params; - uint8_t command_params[4] = { 0 }; - gpio_init(dev->params->dcx_pin, GPIO_OUT); - int res = spi_init_cs(dev->params->spi, dev->params->cs_pin); - if (res != SPI_OK) { - DEBUG("[ili9341] init: error initializing the CS pin [%i]\n", res); - return -1; - } - if (gpio_is_valid(dev->params->rst_pin)) { - gpio_init(dev->params->rst_pin, GPIO_OUT); - gpio_clear(dev->params->rst_pin); - ztimer_sleep(ZTIMER_MSEC, 120); - gpio_set(dev->params->rst_pin); - } - ztimer_sleep(ZTIMER_MSEC, 120); + uint8_t command_params[4] = { 0 }; /* Acquire once at release at the end */ - spi_acquire(dev->params->spi, dev->params->cs_pin, dev->params->spi_mode, - dev->params->spi_clk); + lcd_ll_acquire(dev); /* Soft Reset */ - _write_cmd(dev, LCD_CMD_SWRESET, NULL, 0); + lcd_ll_write_cmd(dev, LCD_CMD_SWRESET, NULL, 0); ztimer_sleep(ZTIMER_MSEC, 120); /* Display off */ - _write_cmd(dev, LCD_CMD_DISPOFF, NULL, 0); + lcd_ll_write_cmd(dev, LCD_CMD_DISPOFF, NULL, 0); /* PWRCTL1/2 */ command_params[0] = _ili9341_calc_pwrctl1(CONFIG_ILI9341_GVDD); - _write_cmd(dev, LCD_CMD_PWCTRL1, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_PWCTRL1, command_params, 1); command_params[0] = 0x10; /* PWRCTL 0 0 0 */ - _write_cmd(dev, LCD_CMD_PWCTRL2, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_PWCTRL2, command_params, 1); /* VCOMCTL */ command_params[0] = _ili9341_calc_vmh(CONFIG_ILI9341_VCOMH); command_params[1] = _ili9341_calc_vml(CONFIG_ILI9341_VCOML); - _write_cmd(dev, LCD_CMD_VMCTRL1, command_params, 2); + lcd_ll_write_cmd(dev, LCD_CMD_VMCTRL1, command_params, 2); command_params[0] = 0x86; - _write_cmd(dev, LCD_CMD_VMCTRL2, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_VMCTRL2, command_params, 1); /* Memory access CTL */ command_params[0] = dev->params->rotation; command_params[0] |= dev->params->rgb ? 0 : LCD_MADCTL_BGR; - _write_cmd(dev, LCD_CMD_MADCTL, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_MADCTL, command_params, 1); /* Frame control */ command_params[0] = 0x00; command_params[1] = 0x18; - _write_cmd(dev, LCD_CMD_FRAMECTL1, command_params, 2); + lcd_ll_write_cmd(dev, LCD_CMD_FRAMECTL1, command_params, 2); /* Display function control */ command_params[0] = 0x08; command_params[1] = 0x82; /* number of lines, see datasheet p. 166 (DISCTRL::NL) */ command_params[2] = (params->lines >> 3) - 1; - _write_cmd(dev, LCD_CMD_DFUNC, command_params, 3); + lcd_ll_write_cmd(dev, LCD_CMD_DFUNC, command_params, 3); /* Pixel format */ command_params[0] = 0x55; /* 16 bit mode */ - _write_cmd(dev, LCD_CMD_PIXSET, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_PIXSET, command_params, 1); command_params[0] = 0x01; - _write_cmd(dev, LCD_CMD_GAMSET, command_params, 1); + lcd_ll_write_cmd(dev, LCD_CMD_GAMSET, command_params, 1); /* Gamma correction */ { @@ -139,27 +114,30 @@ static int _init(lcd_t *dev, const lcd_params_t *params) 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00 }; - _write_cmd(dev, LCD_CMD_PGAMCTRL, gamma_pos, - sizeof(gamma_pos)); + lcd_ll_write_cmd(dev, LCD_CMD_PGAMCTRL, gamma_pos, + sizeof(gamma_pos)); } { static const uint8_t gamma_neg[] = { 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F }; - _write_cmd(dev, LCD_CMD_NGAMCTRL, gamma_neg, - sizeof(gamma_neg)); + lcd_ll_write_cmd(dev, LCD_CMD_NGAMCTRL, gamma_neg, + sizeof(gamma_neg)); } if (dev->params->inverted) { - _write_cmd(dev, LCD_CMD_DINVON, NULL, 0); + lcd_ll_write_cmd(dev, LCD_CMD_DINVON, NULL, 0); } /* Sleep out (turn off sleep mode) */ - _write_cmd(dev, LCD_CMD_SLPOUT, NULL, 0); + lcd_ll_write_cmd(dev, LCD_CMD_SLPOUT, NULL, 0); /* Display on */ - _write_cmd(dev, LCD_CMD_DISPON, NULL, 0); - spi_release(dev->params->spi); + lcd_ll_write_cmd(dev, LCD_CMD_DISPON, NULL, 0); + + /* Finally release the device */ + lcd_ll_release(dev); + return 0; } @@ -176,12 +154,15 @@ static void _set_area(const lcd_t *dev, uint16_t x1, uint16_t x2, params[0] = byteorder_htons(x1); params[1] = byteorder_htons(x2); - _write_cmd(dev, LCD_CMD_CASET, (uint8_t *)params, - sizeof(params)); + /* Function is called by a high level function of the LCD driver where + * the device is already acquired. So we don't must acquire it here. + * Therefore the low level write command function is called. */ + lcd_ll_write_cmd(dev, LCD_CMD_CASET, (uint8_t *)params, + sizeof(params)); params[0] = byteorder_htons(y1); params[1] = byteorder_htons(y2); - _write_cmd(dev, LCD_CMD_PASET, (uint8_t *)params, - sizeof(params)); + lcd_ll_write_cmd(dev, LCD_CMD_PASET, (uint8_t *)params, + sizeof(params)); } const lcd_driver_t lcd_ili9341_driver = {