This is an automated email from the ASF dual-hosted git repository. rymek pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 5e5d002171f960b4ac8c01ff630693c72e984478 Author: Jerzy Kasenberg <[email protected]> AuthorDate: Thu Mar 2 12:24:39 2023 +0100 lvgl/ili9486: Add initial support for ILI9486 TFT --- hw/drivers/display/lvgl/pkg.yml | 2 + hw/drivers/display/lvgl/syscfg.yml | 3 + hw/drivers/display/lvgl/tft/ili9486/pkg.yml | 25 +++ hw/drivers/display/lvgl/tft/ili9486/src/ili9486.c | 252 ++++++++++++++++++++++ hw/drivers/display/lvgl/tft/ili9486/syscfg.yml | 23 ++ 5 files changed, 305 insertions(+) diff --git a/hw/drivers/display/lvgl/pkg.yml b/hw/drivers/display/lvgl/pkg.yml index 8a34ac60b..c3955ba67 100644 --- a/hw/drivers/display/lvgl/pkg.yml +++ b/hw/drivers/display/lvgl/pkg.yml @@ -60,6 +60,8 @@ pkg.deps: pkg.deps.LVGL_ILI9341: - "@apache-mynewt-core/hw/drivers/display/lvgl/tft/ili9341" +pkg.deps.LVGL_ILI9486: + - "@apache-mynewt-core/hw/drivers/display/lvgl/tft/ili9486" pkg.cflags: - -DLV_CONF_INCLUDE_SIMPLE=1 diff --git a/hw/drivers/display/lvgl/syscfg.yml b/hw/drivers/display/lvgl/syscfg.yml index 7f4dd4af6..f55e5fb9a 100644 --- a/hw/drivers/display/lvgl/syscfg.yml +++ b/hw/drivers/display/lvgl/syscfg.yml @@ -25,6 +25,9 @@ syscfg.defs: LVGL_ILI9341: description: Enable ILI9341 display driver. value: + LVGL_ILI9486: + description: Enable ILI9486 display driver. + value: LVGL_TIMER_PERIOD_MS: description: LV timer interval for periodical refresh and touch read value: 10 diff --git a/hw/drivers/display/lvgl/tft/ili9486/pkg.yml b/hw/drivers/display/lvgl/tft/ili9486/pkg.yml new file mode 100644 index 000000000..cf89f436d --- /dev/null +++ b/hw/drivers/display/lvgl/tft/ili9486/pkg.yml @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +pkg.name: hw/drivers/display/lvgl/tft/ili9486 +pkg.description: LVGL display driver for ili9486 +pkg.author: "Apache Mynewt <[email protected]>" +pkg.homepage: "http://mynewt.apache.org/" +pkg.keywords: + +pkg.cflags: diff --git a/hw/drivers/display/lvgl/tft/ili9486/src/ili9486.c b/hw/drivers/display/lvgl/tft/ili9486/src/ili9486.c new file mode 100644 index 000000000..73eabb4eb --- /dev/null +++ b/hw/drivers/display/lvgl/tft/ili9486/src/ili9486.c @@ -0,0 +1,252 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <bsp/bsp.h> +#include <hal/hal_gpio.h> +#include <lv_glue.h> +#include <hal/lv_hal_disp.h> +#include <lcd_itf.h> + +#define ILI9486_TFTWIDTH 320 +#define ILI9486_TFTHEIGHT 480 + +/* Level 1 Commands -------------- [section] Description */ + +#define ILI9486_NOP 0x00 /* [8.2.1 ] No Operation / Terminate Frame Memory Write */ +#define ILI9486_SWRESET 0x01 /* [8.2.2 ] Software Reset */ +#define ILI9486_RDDIDIF 0x04 /* [8.2.3 ] Read Display Identification Information */ +#define ILI9486_RDNOE 0x05 /* [8.2.4 ] Read Number of the Errors on DSI */ +#define ILI9486_RDDST 0x09 /* [8.2.5 ] Read Display Status */ +#define ILI9486_RDDPM 0x0A /* [8.2.6 ] Read Display Power Mode */ +#define ILI9486_RDDMADCTL 0x0B /* [8.2.7 ] Read Display MADCTL */ +#define ILI9486_RDDCOLMOD 0x0C /* [8.2.8 ] Read Display Pixel Format */ +#define ILI9486_RDDIM 0x0D /* [8.2.9 ] Read Display Image Mode */ +#define ILI9486_RDDSM 0x0E /* [8.2.10] Read Display Signal Mode */ +#define ILI9486_RDDSDR 0x0F /* [8.2.11] Read Display Self-Diagnostic Result */ +#define ILI9486_SLPIN 0x10 /* [8.2.12] Enter Sleep Mode */ +#define ILI9486_SLPOUT 0x11 /* [8.2.13] Leave Sleep Mode */ +#define ILI9486_PTLON 0x12 /* [8.2.14] Partial Display Mode ON */ +#define ILI9486_NORON 0x13 /* [8.2.15] Normal Display Mode ON */ +#define ILI9486_DINVOFF 0x20 /* [8.2.16] Display Inversion OFF */ +#define ILI9486_DINVON 0x21 /* [8.2.17] Display Inversion ON */ +#define ILI9486_DISPOFF 0x28 /* [8.2.18] Display OFF */ +#define ILI9486_DISPON 0x29 /* [8.2.19] Display ON */ +#define ILI9486_CASET 0x2A /* [8.2.20] Column Address Set */ +#define ILI9486_PASET 0x2B /* [8.2.21] Page Address Set */ +#define ILI9486_RAMWR 0x2C /* [8.2.22] Memory Write */ +#define ILI9486_RAMRD 0x2E /* [8.2.23] Memory Read */ +#define ILI9486_PTLAR 0x30 /* [8.2.24] Partial Area */ +#define ILI9486_VSCRDEF 0x33 /* [8.2.25] Vertical Scrolling Definition */ +#define ILI9486_TEOFF 0x34 /* [8.2.26] Tearing Effect Line OFF */ +#define ILI9486_TEON 0x35 /* [8.2.27] Tearing Effect Line ON */ +#define ILI9486_MADCTL 0x36 /* [8.2.28] Memory Access Control */ +#define MADCTL_MY 0x80 /* MY row address order */ +#define MADCTL_MX 0x40 /* MX column address order */ +#define MADCTL_MV 0x20 /* MV row / column exchange */ +#define MADCTL_ML 0x10 /* ML vertical refresh order */ +#define MADCTL_MH 0x04 /* MH horizontal refresh order */ +#define MADCTL_RGB 0x00 /* RGB Order [default] */ +#define MADCTL_BGR 0x08 /* BGR Order */ +#define ILI9486_VSCRSADD 0x37 /* [8.2.29] Vertical Scrolling Start Address */ +#define ILI9486_IDMOFF 0x38 /* [8.2.30] Idle Mode OFF */ +#define ILI9486_IDMON 0x39 /* [8.2.31] Idle Mode ON */ +#define ILI9486_PIXSET 0x3A /* [8.2.32] Pixel Format Set */ +#define ILI9486_WRMEMCONT 0x3C /* [8.2.33] Write Memory Continue */ +#define ILI9486_RDMEMCONT 0x3E /* [8.2.34] Read Memory Continue */ +#define ILI9486_SETSCANTE 0x44 /* [8.2.35] Set Tear Scanline */ +#define ILI9486_GETSCAN 0x45 /* [8.2.36] Get Scanline */ +#define ILI9486_WRDISBV 0x51 /* [8.2.37] Write Display Brightness Value */ +#define ILI9486_RDDISBV 0x52 /* [8.2.38] Read Display Brightness Value */ +#define ILI9486_WRCTRLD 0x53 /* [8.2.39] Write Control Display */ +#define ILI9486_RDCTRLD 0x54 /* [8.2.40] Read Control Display */ +#define ILI9486_WRCABC 0x55 /* [8.2.41] Write Content Adaptive Brightness Control Value */ +#define ILI9486_RDCABC 0x56 /* [8.2.42] Read Content Adaptive Brightness Control Value */ +#define ILI9486_WRCABCMIN 0x5E /* [8.2.43] Write CABC Minimum Brightness */ +#define ILI9486_RDCABCMIN 0x5F /* [8.2.44] Read CABC Minimum Brightness */ +#define ILI9486_RDID1 0xDA /* [8.2.47] Read ID1 - Manufacturer ID (user) */ +#define ILI9486_RDID2 0xDB /* [8.2.48] Read ID2 - Module/Driver version (supplier) */ +#define ILI9486_RDID3 0xDC /* [8.2.49] Read ID3 - Module/Driver version (user) */ + +/* Level 2 Commands -------------- [section] Description */ + +#define ILI9486_IFMODE 0xB0 /* [8.2.50] Interface Mode Control */ +#define ILI9486_FRMCTR1 0xB1 /* [8.2.51] Frame Rate Control (In Normal Mode/Full Colors) */ +#define ILI9486_FRMCTR2 0xB2 /* [8.2.52] Frame Rate Control (In Idle Mode/8 colors) */ +#define ILI9486_FRMCTR3 0xB3 /* [8.2.53] Frame Rate control (In Partial Mode/Full Colors) */ +#define ILI9486_INVTR 0xB4 /* [8.2.54] Display Inversion Control */ +#define ILI9486_PRCTR 0xB5 /* [8.2.55] Blanking Porch Control */ +#define ILI9486_DISCTRL 0xB6 /* [8.2.56] Display Function Control */ +#define ILI9486_ETMOD 0xB7 /* [8.2.57] Entry Mode Set */ +#define ILI9486_PWCTRL1 0xC0 /* [8.2.58] Power Control 1 - GVDD */ +#define ILI9486_PWCTRL2 0xC1 /* [8.2.59] Power Control 2 - step-up factor for operating voltage */ +#define ILI9486_PWCTRL3 0xC2 /* [8.2.60] Power Control 3 - for normal mode */ +#define ILI9486_PWCTRL4 0xC3 /* [8.2.61] Power Control 4 - for idle mode */ +#define ILI9486_PWCTRL5 0xC4 /* [8.2.62] Power Control 5 - for partial mode */ +#define ILI9486_VMCTRL 0xC5 /* [8.2.63] VCOM Control */ +#define ILI9486_CABCCTRL1 0xC6 /* [8.2.64] VCOM Control */ +#define ILI9486_CABCCTRL2 0xC8 /* [8.2.65] VCOM Control */ +#define ILI9486_CABCCTRL3 0xC9 /* [8.2.66] VCOM Control */ +#define ILI9486_CABCCTRL4 0xCA /* [8.2.67] VCOM Control */ +#define ILI9486_CABCCTRL5 0xCB /* [8.2.68] VCOM Control */ +#define ILI9486_CABCCTRL6 0xCC /* [8.2.69] VCOM Control */ +#define ILI9486_CABCCTRL7 0xCD /* [8.2.70] VCOM Control */ +#define ILI9486_CABCCTRL8 0xCE /* [8.2.71] VCOM Control */ +#define ILI9486_CABCCTRL9 0xCF /* [8.2.72] VCOM Control */ +#define ILI9486_NVMWR 0xD0 /* [8.2.73] NV Memory Write */ +#define ILI9486_NVMPKEY 0xD1 /* [8.2.74] NV Memory Protection Key */ +#define ILI9486_RDNVM 0xD2 /* [8.2.75] NV Memory Status Read */ +#define ILI9486_RDID4 0xD3 /* [8.2.76] Read ID4 - IC Device Code */ +#define ILI9486_PGAMCTRL 0xE0 /* [8.2.77] Positive Gamma Control */ +#define ILI9486_NGAMCTRL 0xE1 /* [8.2.78] Negative Gamma Correction */ +#define ILI9486_DGAMCTRL1 0xE2 /* [8.2.79] Digital Gamma Control 1 */ +#define ILI9486_DGAMCTRL2 0xE3 /* [8.2.80] Digital Gamma Control 2 */ +#define ILI9486_SPIRCS 0xFB /* [8.2.81] SPI read command settings */ + +#define ILI9486_HOR_RES ILI9486_TFTWIDTH +#define ILI9486_VER_RES ILI9486_TFTHEIGHT + +static const uint8_t madctl[] = { + 0, + MADCTL_MX | MADCTL_MV, + MADCTL_MX | MADCTL_MY, + MADCTL_MV | MADCTL_MY | MADCTL_ML, +}; + +void +ili9486_rotate(lv_disp_rot_t rotation) +{ + uint8_t madcmd[2] = { ILI9486_MADCTL, MADCTL_BGR | madctl[rotation] }; + + lcd_ift_write_cmd(madcmd, 2); +} + +LCD_SEQUENCE(init_cmds) + LCD_SEQUENCE_LCD_CS_INACTIVATE(), + LCD_SEQUENCE_LCD_DC_DATA(), +#if MYNEWT_VAL(LCD_RESET_PIN) >= 0 + LCD_SEQUENCE_LCD_RESET_ACTIVATE(), + LCD_SEQUENCE_DELAY_US(10), + LCD_SEQUENCE_LCD_RESET_INACTIVATE(), + LCD_SEQUENCE_DELAY(5), +#endif + 1, ILI9486_NOP, +#if MYNEWT_VAL(LCD_RESET_PIN) < 0 + 1, ILI9486_SWRESET, + LCD_SEQUENCE_DELAY(5), +#endif + 3, ILI9486_PWCTRL1, 0x19, 0x1A, + 3, ILI9486_PWCTRL2, 0x45, 0x00, + 2, ILI9486_PWCTRL3, 0x33, + 3, ILI9486_VMCTRL, 0x00, 0x28, + 3, ILI9486_FRMCTR1, 0xA0, 0x11, + 2 ,ILI9486_INVTR, 0x02, + 4, ILI9486_DISCTRL, 0x00, 0x42, 0x3B, + /* positive gamma correction */ + 16, ILI9486_PGAMCTRL, 0x0F, 0x1F, 0x1C, 0x0C, 0x0F, 0x08, 0x48, 0x98, + 0x37, 0x0A, 0x13, 0x04, 0x11, 0x0D, 0x00, + 16, ILI9486_NGAMCTRL, 0x0F, 0x32, 0x2E, 0x0B, 0x0D, 0x05, 0x47, 0x75, + 0x37, 0x06, 0x10, 0x03, 0x24, 0x20, 0x00, + /* 16 bit pixel */ + 2, ILI9486_PIXSET, 0x55, + 3, ILI9486_DISCTRL, 0x00, 0x22, + 2, ILI9486_MADCTL, MADCTL_BGR, + 1, ILI9486_SLPOUT, + LCD_SEQUENCE_DELAY(100), + 1, ILI9486_DISPON, +LCD_SEQUENCE_END + +/** + * Initialize the ILI9486 display controller + */ +void +ili9486_init(lv_disp_drv_t *driver) +{ + lcd_command_sequence(init_cmds); +} + +static void +ili9486_drv_update(struct _lv_disp_drv_t *drv) +{ + ili9486_rotate(drv->rotated); +} + +void +ili9486_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p) +{ + int32_t y; + lv_coord_t w; + uint8_t cmd[5]; + + if (area->x2 < 0 || area->y2 < 0 || area->x1 >= ILI9486_HOR_RES || area->y1 >= ILI9486_VER_RES) { + lv_disp_flush_ready(drv); + return; + } + + /* Truncate the area to the screen */ + int32_t act_x1 = area->x1 < 0 ? 0 : area->x1; + int32_t act_y1 = area->y1 < 0 ? 0 : area->y1; + int32_t act_x2 = area->x2 >= ILI9486_HOR_RES ? ILI9486_HOR_RES - 1 : area->x2; + int32_t act_y2 = area->y2 >= ILI9486_VER_RES ? ILI9486_VER_RES - 1 : area->y2; + + w = lv_area_get_width(area); + + /* Column address */ + cmd[0] = ILI9486_CASET; + cmd[1] = (uint8_t)(act_x1 >> 8); + cmd[2] = (uint8_t)act_x1; + cmd[3] = (uint8_t)(act_x2 >> 8); + cmd[4] = (uint8_t)act_x2; + lcd_ift_write_cmd(cmd, 5); + + /* Page address */ + cmd[0] = ILI9486_PASET; + cmd[1] = (uint8_t)(act_y1 >> 8); + cmd[2] = (uint8_t)act_y1; + cmd[3] = (uint8_t)(act_y2 >> 8); + cmd[4] = (uint8_t)act_y2; + lcd_ift_write_cmd(cmd, 5); + + cmd[0] = ILI9486_RAMWR; + lcd_ift_write_cmd(cmd, 1); + + for (y = act_y1; y <= act_y2; y++) { + lcd_itf_write_color_data(color_p, w * sizeof(*color_p)); + color_p += w; + } + + lv_disp_flush_ready(drv); +} + +void +mynewt_lv_drv_init(lv_disp_drv_t *driver) +{ + if (MYNEWT_VAL(LCD_BL_PIN) >= 0) { + hal_gpio_init_out(MYNEWT_VAL(LCD_BL_PIN), 1); + } + if (MYNEWT_VAL(LCD_RESET_PIN) >= 0) { + hal_gpio_init_out(MYNEWT_VAL(LCD_RESET_PIN), 1); + } + lcd_itf_init(); + driver->flush_cb = ili9486_flush; + driver->drv_update_cb = ili9486_drv_update; + driver->hor_res = ILI9486_TFTWIDTH; + driver->ver_res = ILI9486_TFTHEIGHT; + + ili9486_init(driver); +} diff --git a/hw/drivers/display/lvgl/tft/ili9486/syscfg.yml b/hw/drivers/display/lvgl/tft/ili9486/syscfg.yml new file mode 100644 index 000000000..df89fbc87 --- /dev/null +++ b/hw/drivers/display/lvgl/tft/ili9486/syscfg.yml @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +syscfg.defs: + +syscfg.vals: + LVGL_DISPLAY_HORIZONTAL_RESOLUTION: 320 + LVGL_DISPLAY_VERTICAL_RESOLUTION: 480
