| /* |
| * Copyright (c) 2019 Marc Reilly |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #include "display_st7789v.h" |
| #include <zephyr.h> |
| #include <stddef.h> |
| |
| void st7789v_lcd_init(struct st7789v_data *p_st7789v) |
| { |
| /* the LCD itself is smaller than the area of the ram on |
| * the controller. In its 'natural' orientation the LCD is |
| * 170 columns and 320 rows which is centered in the controller |
| * RAM area (so the LCD actually starts at column 35). |
| * We switch the rows/column addressing around so that the |
| * display is 320x170, and so the effective LCD is offset |
| * by 35 "rows". |
| */ |
| st7789v_set_lcd_margins(p_st7789v, 0, 35); |
| |
| u8_t cmd; |
| u8_t data[14]; |
| |
| cmd = ST7789V_CMD_PORCTRL; |
| data[0] = 0x0c; |
| data[1] = 0x0c; |
| data[2] = 0x00; |
| data[3] = 0x33; |
| data[4] = 0x33; |
| st7789v_transmit(p_st7789v, cmd, data, 5); |
| |
| cmd = ST7789V_CMD_CMD2EN; |
| data[0] = 0x5a; |
| data[1] = 0x69; |
| data[2] = 0x02; |
| data[3] = 0x01; |
| st7789v_transmit(p_st7789v, cmd, data, 4); |
| |
| cmd = ST7789V_CMD_DGMEN; |
| data[0] = 0x00; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_GCTRL; |
| data[0] = 0x35; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_VCOMS; |
| data[0] = 0x2b; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| #if CONFIG_ST7789V_REVERSE_LCD_RGB_ORDER |
| cmd = ST7789V_CMD_LCMCTRL; |
| data[0] = ST7789V_LCMCTRL_XBGR; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| #endif |
| |
| cmd = ST7789V_CMD_VDVVRHEN; |
| data[0] = 0x01; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_VRH; |
| data[0] = 0x0f; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_VDS; |
| data[0] = 0x20; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_FRCTRL2; |
| data[0] = 0x0f; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_PWCTRL1; |
| data[0] = 0x52; |
| data[1] = (0x2 << 6) | (0x2 << 4) | 0x01; |
| st7789v_transmit(p_st7789v, cmd, data, 2); |
| |
| cmd = ST7789V_CMD_MADCTL; |
| data[0] = ST7789V_MADCTL_MV_REVERSE_MODE; |
| #ifdef CONFIG_ST7789V_REVERSE_X |
| data[0] |= ST7789V_MADCTL_MX_RIGHT_TO_LEFT; |
| #endif |
| #ifdef CONFIG_ST7789V_REVERSE_Y |
| data[0] |= ST7789V_MADCTL_MY_BOTTOM_TO_TOP; |
| #endif |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_COLMOD; |
| #ifdef CONFIG_ST7789V_RGB565 |
| data[0] = ST7789V_COLMOD_RGB_65K |
| | ST7789V_COLMOD_FMT_16bit; |
| #else |
| data[0] = ST7789V_COLMOD_RGB_262K |
| | ST7789V_COLMOD_FMT_18bit; |
| #endif |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_INV_ON; |
| st7789v_transmit(p_st7789v, cmd, NULL, 0); |
| |
| cmd = ST7789V_CMD_GAMSET; |
| data[0] = 0x01U; |
| st7789v_transmit(p_st7789v, cmd, data, 1); |
| |
| cmd = ST7789V_CMD_PVGAMCTRL; |
| data[0] = 0xD0 | 0x00; /* v63 | V0 */ |
| data[1] = 0x00; /* v1 */ |
| data[2] = 0x02; /* v2 */ |
| data[3] = 0x07; /* v4 */ |
| data[4] = 0x0B; /* V6 */ |
| data[5] = (0x01 << 4) | 0x0a; /* J0 | V13 */ |
| data[6] = 0x31; /* V2 */ |
| data[7] = (0x5 << 4) | 0x4; /* V36 | V27 */ |
| data[8] = 0x40; /* V43 */ |
| data[9] = (0x02 << 4) | 0x09; /* J1 | V50 */ |
| data[10] = 0x12; /* V57 */ |
| data[11] = 0x12; /* V59 */ |
| data[12] = 0x12; /* V61 */ |
| data[13] = 0x17; /* V62 */ |
| st7789v_transmit(p_st7789v, cmd, data, 14); |
| |
| cmd = ST7789V_CMD_NVGAMCTRL; |
| data[0] = (0xd << 4) | 0x00; /* V63 | V0 */ |
| data[1] = 0x00; /* v1 */ |
| data[2] = 0x02; /* v2 */ |
| data[3] = 0x07; /* v4 */ |
| data[4] = 0x05; /* V6 */ |
| data[5] = (0x01 << 4) | 0x05; /* J0 | V13 */ |
| data[6] = 0x2D; /* V20 */ |
| data[7] = (0x4 << 4) | 0x4; /* V36 | V27 */ |
| data[8] = 0x44; /* V43 */ |
| data[9] = (0x01 << 4) | 0x0c; /* J1 | V50 */ |
| data[10] = 0x18; /* V57 */ |
| data[11] = 0x16; /* V59 */ |
| data[12] = 0x1c; /* V61 */ |
| data[13] = 0x1d; /* V62 */ |
| st7789v_transmit(p_st7789v, cmd, data, 14); |
| |
| cmd = ST7789V_CMD_RAMCTRL; |
| data[0] = 0x00; |
| data[1] = (0x3 << 6) | (0x3u << 4); |
| #if CONFIG_ST7789V_SWAP_PIXEL_LCD_ENDIANNESS |
| data[1] |= 0x08; |
| #endif |
| st7789v_transmit(p_st7789v, cmd, data, 2); |
| |
| cmd = ST7789V_CMD_RGBCTRL; |
| data[0] = 0x80 | (0x2 << 5) | 0xd; |
| data[1] = 0x08; |
| data[2] = 0x14; |
| st7789v_transmit(p_st7789v, cmd, data, 3); |
| } |