Nuvoton
/
NuMaker-mbed-emWin-example
NuMaker emWin HMI
emWin/Config/TARGET_NUMAKER_IOT_M467/ILI9341.cpp@10:c8165817d92a, 6 months ago (annotated)
- Committer:
- csyang2
- Date:
- Mon Mar 04 15:47:41 2024 +0800
- Revision:
- 10:c8165817d92a
Support NuMaker-IoT-M467
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
csyang2 |
10:c8165817d92a | 1 | /**************************************************************************//** |
csyang2 |
10:c8165817d92a | 2 | * @file ILI9341.c |
csyang2 |
10:c8165817d92a | 3 | * @version V1.00 |
csyang2 |
10:c8165817d92a | 4 | * @brief Display controller configuration. |
csyang2 |
10:c8165817d92a | 5 | * |
csyang2 |
10:c8165817d92a | 6 | * SPDX-License-Identifier: Apache-2.0 |
csyang2 |
10:c8165817d92a | 7 | * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. |
csyang2 |
10:c8165817d92a | 8 | *****************************************************************************/ |
csyang2 |
10:c8165817d92a | 9 | #include <stddef.h> |
csyang2 |
10:c8165817d92a | 10 | #include <stdio.h> |
csyang2 |
10:c8165817d92a | 11 | |
csyang2 |
10:c8165817d92a | 12 | #include "GUI.h" |
csyang2 |
10:c8165817d92a | 13 | #include "GUIDRV_FlexColor.h" |
csyang2 |
10:c8165817d92a | 14 | |
csyang2 |
10:c8165817d92a | 15 | #include "NuMicro.h" |
csyang2 |
10:c8165817d92a | 16 | |
csyang2 |
10:c8165817d92a | 17 | #include "mbed.h" |
csyang2 |
10:c8165817d92a | 18 | |
csyang2 |
10:c8165817d92a | 19 | #ifdef __DEMO_320x240__ |
csyang2 |
10:c8165817d92a | 20 | #include "TouchPanel.h" |
csyang2 |
10:c8165817d92a | 21 | |
csyang2 |
10:c8165817d92a | 22 | #include "lcm.h" |
csyang2 |
10:c8165817d92a | 23 | |
csyang2 |
10:c8165817d92a | 24 | SPI spi(PA_8, PA_9, PA_10); // mosi, miso, sclk |
csyang2 |
10:c8165817d92a | 25 | DigitalOut GPIO_SPI_SS(PA_11); |
csyang2 |
10:c8165817d92a | 26 | |
csyang2 |
10:c8165817d92a | 27 | DigitalOut GPIO_LCM_DC(PB_2); |
csyang2 |
10:c8165817d92a | 28 | DigitalOut ILI9341_LED(PB_5); |
csyang2 |
10:c8165817d92a | 29 | |
csyang2 |
10:c8165817d92a | 30 | #define SPI_PANEL_PORT SPI2 |
csyang2 |
10:c8165817d92a | 31 | #define SPI_PANEL_FREQ 40000000 |
csyang2 |
10:c8165817d92a | 32 | |
csyang2 |
10:c8165817d92a | 33 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 34 | * |
csyang2 |
10:c8165817d92a | 35 | * _Read1 |
csyang2 |
10:c8165817d92a | 36 | */ |
csyang2 |
10:c8165817d92a | 37 | U8 _Read1(void) |
csyang2 |
10:c8165817d92a | 38 | { |
csyang2 |
10:c8165817d92a | 39 | /* FIXME if panel supports read back feature */ |
csyang2 |
10:c8165817d92a | 40 | return 0; |
csyang2 |
10:c8165817d92a | 41 | } |
csyang2 |
10:c8165817d92a | 42 | |
csyang2 |
10:c8165817d92a | 43 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 44 | * |
csyang2 |
10:c8165817d92a | 45 | * _ReadM1 |
csyang2 |
10:c8165817d92a | 46 | */ |
csyang2 |
10:c8165817d92a | 47 | void _ReadM1(U8 * pData, int NumItems) |
csyang2 |
10:c8165817d92a | 48 | { |
csyang2 |
10:c8165817d92a | 49 | /* FIXME if panel supports read back feature */ |
csyang2 |
10:c8165817d92a | 50 | } |
csyang2 |
10:c8165817d92a | 51 | |
csyang2 |
10:c8165817d92a | 52 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 53 | * |
csyang2 |
10:c8165817d92a | 54 | * _Write0 |
csyang2 |
10:c8165817d92a | 55 | */ |
csyang2 |
10:c8165817d92a | 56 | void _Write0(U8 Cmd) |
csyang2 |
10:c8165817d92a | 57 | { |
csyang2 |
10:c8165817d92a | 58 | GPIO_LCM_DC = 0; |
csyang2 |
10:c8165817d92a | 59 | GPIO_SPI_SS = 0; |
csyang2 |
10:c8165817d92a | 60 | |
csyang2 |
10:c8165817d92a | 61 | spi.write(Cmd); |
csyang2 |
10:c8165817d92a | 62 | |
csyang2 |
10:c8165817d92a | 63 | GPIO_SPI_SS = 1; |
csyang2 |
10:c8165817d92a | 64 | } |
csyang2 |
10:c8165817d92a | 65 | |
csyang2 |
10:c8165817d92a | 66 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 67 | * |
csyang2 |
10:c8165817d92a | 68 | * _Write1 |
csyang2 |
10:c8165817d92a | 69 | */ |
csyang2 |
10:c8165817d92a | 70 | void _Write1(U8 Data) |
csyang2 |
10:c8165817d92a | 71 | { |
csyang2 |
10:c8165817d92a | 72 | GPIO_LCM_DC = 1; |
csyang2 |
10:c8165817d92a | 73 | GPIO_SPI_SS = 0; |
csyang2 |
10:c8165817d92a | 74 | |
csyang2 |
10:c8165817d92a | 75 | spi.write(Data); |
csyang2 |
10:c8165817d92a | 76 | |
csyang2 |
10:c8165817d92a | 77 | GPIO_SPI_SS = 1; |
csyang2 |
10:c8165817d92a | 78 | } |
csyang2 |
10:c8165817d92a | 79 | |
csyang2 |
10:c8165817d92a | 80 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 81 | * |
csyang2 |
10:c8165817d92a | 82 | * _WriteM1 |
csyang2 |
10:c8165817d92a | 83 | */ |
csyang2 |
10:c8165817d92a | 84 | void _WriteM1(U8 * pData, int NumItems) |
csyang2 |
10:c8165817d92a | 85 | { |
csyang2 |
10:c8165817d92a | 86 | GPIO_LCM_DC = 1; |
csyang2 |
10:c8165817d92a | 87 | GPIO_SPI_SS = 0; |
csyang2 |
10:c8165817d92a | 88 | |
csyang2 |
10:c8165817d92a | 89 | while(NumItems--) |
csyang2 |
10:c8165817d92a | 90 | { |
csyang2 |
10:c8165817d92a | 91 | //spi.write(*pData++); |
csyang2 |
10:c8165817d92a | 92 | #if 1 |
csyang2 |
10:c8165817d92a | 93 | SPI_WRITE_TX(SPI_PANEL_PORT, *pData++); |
csyang2 |
10:c8165817d92a | 94 | while(SPI_IS_BUSY(SPI_PANEL_PORT)); |
csyang2 |
10:c8165817d92a | 95 | #endif |
csyang2 |
10:c8165817d92a | 96 | } |
csyang2 |
10:c8165817d92a | 97 | |
csyang2 |
10:c8165817d92a | 98 | GPIO_SPI_SS = 1; |
csyang2 |
10:c8165817d92a | 99 | } |
csyang2 |
10:c8165817d92a | 100 | |
csyang2 |
10:c8165817d92a | 101 | static void _Open_SPI(void) |
csyang2 |
10:c8165817d92a | 102 | { |
csyang2 |
10:c8165817d92a | 103 | spi.format(8, 0); |
csyang2 |
10:c8165817d92a | 104 | spi.frequency(SPI_PANEL_FREQ); |
csyang2 |
10:c8165817d92a | 105 | } |
csyang2 |
10:c8165817d92a | 106 | |
csyang2 |
10:c8165817d92a | 107 | /********************************************************************* |
csyang2 |
10:c8165817d92a | 108 | * |
csyang2 |
10:c8165817d92a | 109 | * _InitController |
csyang2 |
10:c8165817d92a | 110 | * |
csyang2 |
10:c8165817d92a | 111 | * Purpose: |
csyang2 |
10:c8165817d92a | 112 | * Initializes the display controller |
csyang2 |
10:c8165817d92a | 113 | */ |
csyang2 |
10:c8165817d92a | 114 | void _InitController(void) |
csyang2 |
10:c8165817d92a | 115 | { |
csyang2 |
10:c8165817d92a | 116 | static uint8_t s_InitOnce = 0; |
csyang2 |
10:c8165817d92a | 117 | |
csyang2 |
10:c8165817d92a | 118 | if(s_InitOnce == 0) |
csyang2 |
10:c8165817d92a | 119 | s_InitOnce = 1; |
csyang2 |
10:c8165817d92a | 120 | else |
csyang2 |
10:c8165817d92a | 121 | return; |
csyang2 |
10:c8165817d92a | 122 | |
csyang2 |
10:c8165817d92a | 123 | _Open_SPI(); |
csyang2 |
10:c8165817d92a | 124 | |
csyang2 |
10:c8165817d92a | 125 | //Because the Reset signal of Arduino's SPI LCD is pulled together with the Reset signal of M467HJ, the Reset signal cannot be controlled. |
csyang2 |
10:c8165817d92a | 126 | // Reset signal = GPIO_LCM_RST |
csyang2 |
10:c8165817d92a | 127 | |
csyang2 |
10:c8165817d92a | 128 | GPIO_LCM_DC = 0; |
csyang2 |
10:c8165817d92a | 129 | // GPIO_LCM_RST = 0; |
csyang2 |
10:c8165817d92a | 130 | ILI9341_LED = 0; |
csyang2 |
10:c8165817d92a | 131 | |
csyang2 |
10:c8165817d92a | 132 | GPIO_LCM_DC = 1; |
csyang2 |
10:c8165817d92a | 133 | // GPIO_LCM_RST = 0; |
csyang2 |
10:c8165817d92a | 134 | // CLK_SysTickDelay(20000); |
csyang2 |
10:c8165817d92a | 135 | // GPIO_LCM_RST = 1; |
csyang2 |
10:c8165817d92a | 136 | // CLK_SysTickDelay(40000); |
csyang2 |
10:c8165817d92a | 137 | //************* Start Initial Sequence **********// |
csyang2 |
10:c8165817d92a | 138 | |
csyang2 |
10:c8165817d92a | 139 | _Write0(0xCF); |
csyang2 |
10:c8165817d92a | 140 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 141 | _Write1(0xD9); |
csyang2 |
10:c8165817d92a | 142 | _Write1(0X30); |
csyang2 |
10:c8165817d92a | 143 | |
csyang2 |
10:c8165817d92a | 144 | _Write0(0xED); |
csyang2 |
10:c8165817d92a | 145 | _Write1(0x64); |
csyang2 |
10:c8165817d92a | 146 | _Write1(0x03); |
csyang2 |
10:c8165817d92a | 147 | _Write1(0X12); |
csyang2 |
10:c8165817d92a | 148 | _Write1(0X81); |
csyang2 |
10:c8165817d92a | 149 | |
csyang2 |
10:c8165817d92a | 150 | _Write0(0xE8); |
csyang2 |
10:c8165817d92a | 151 | _Write1(0x85); |
csyang2 |
10:c8165817d92a | 152 | _Write1(0x10); |
csyang2 |
10:c8165817d92a | 153 | _Write1(0x78); |
csyang2 |
10:c8165817d92a | 154 | |
csyang2 |
10:c8165817d92a | 155 | _Write0(0xCB); |
csyang2 |
10:c8165817d92a | 156 | _Write1(0x39); |
csyang2 |
10:c8165817d92a | 157 | _Write1(0x2C); |
csyang2 |
10:c8165817d92a | 158 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 159 | _Write1(0x34); |
csyang2 |
10:c8165817d92a | 160 | _Write1(0x02); |
csyang2 |
10:c8165817d92a | 161 | |
csyang2 |
10:c8165817d92a | 162 | _Write0(0xF7); |
csyang2 |
10:c8165817d92a | 163 | _Write1(0x20); |
csyang2 |
10:c8165817d92a | 164 | |
csyang2 |
10:c8165817d92a | 165 | _Write0(0xEA); |
csyang2 |
10:c8165817d92a | 166 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 167 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 168 | |
csyang2 |
10:c8165817d92a | 169 | _Write0(0xC0); //Power control |
csyang2 |
10:c8165817d92a | 170 | _Write1(0x21); //VRH[5:0] |
csyang2 |
10:c8165817d92a | 171 | |
csyang2 |
10:c8165817d92a | 172 | _Write0(0xC1); //Power control |
csyang2 |
10:c8165817d92a | 173 | _Write1(0x12); //SAP[2:0];BT[3:0] |
csyang2 |
10:c8165817d92a | 174 | |
csyang2 |
10:c8165817d92a | 175 | _Write0(0xC5); //VCM control |
csyang2 |
10:c8165817d92a | 176 | _Write1(0x32); |
csyang2 |
10:c8165817d92a | 177 | _Write1(0x3C); |
csyang2 |
10:c8165817d92a | 178 | |
csyang2 |
10:c8165817d92a | 179 | _Write0(0xC7); //VCM control2 |
csyang2 |
10:c8165817d92a | 180 | _Write1(0XC1); |
csyang2 |
10:c8165817d92a | 181 | |
csyang2 |
10:c8165817d92a | 182 | _Write0(0x36); // Memory Access Control |
csyang2 |
10:c8165817d92a | 183 | _Write1(0xe8); |
csyang2 |
10:c8165817d92a | 184 | |
csyang2 |
10:c8165817d92a | 185 | _Write0(0x3A); |
csyang2 |
10:c8165817d92a | 186 | _Write1(0x55); |
csyang2 |
10:c8165817d92a | 187 | |
csyang2 |
10:c8165817d92a | 188 | _Write0(0xB1); |
csyang2 |
10:c8165817d92a | 189 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 190 | _Write1(0x18); |
csyang2 |
10:c8165817d92a | 191 | |
csyang2 |
10:c8165817d92a | 192 | _Write0(0xB6); // Display Function Control |
csyang2 |
10:c8165817d92a | 193 | _Write1(0x0A); |
csyang2 |
10:c8165817d92a | 194 | _Write1(0xA2); |
csyang2 |
10:c8165817d92a | 195 | |
csyang2 |
10:c8165817d92a | 196 | _Write0(0xF2); // 3Gamma Function Disable |
csyang2 |
10:c8165817d92a | 197 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 198 | |
csyang2 |
10:c8165817d92a | 199 | _Write0(0x26); //Gamma curve selected |
csyang2 |
10:c8165817d92a | 200 | _Write1(0x01); |
csyang2 |
10:c8165817d92a | 201 | |
csyang2 |
10:c8165817d92a | 202 | _Write0(0xE0); //Set Gamma |
csyang2 |
10:c8165817d92a | 203 | _Write1(0x0F); |
csyang2 |
10:c8165817d92a | 204 | _Write1(0x20); |
csyang2 |
10:c8165817d92a | 205 | _Write1(0x1E); |
csyang2 |
10:c8165817d92a | 206 | _Write1(0x09); |
csyang2 |
10:c8165817d92a | 207 | _Write1(0x12); |
csyang2 |
10:c8165817d92a | 208 | _Write1(0x0B); |
csyang2 |
10:c8165817d92a | 209 | _Write1(0x50); |
csyang2 |
10:c8165817d92a | 210 | _Write1(0XBA); |
csyang2 |
10:c8165817d92a | 211 | _Write1(0x44); |
csyang2 |
10:c8165817d92a | 212 | _Write1(0x09); |
csyang2 |
10:c8165817d92a | 213 | _Write1(0x14); |
csyang2 |
10:c8165817d92a | 214 | _Write1(0x05); |
csyang2 |
10:c8165817d92a | 215 | _Write1(0x23); |
csyang2 |
10:c8165817d92a | 216 | _Write1(0x21); |
csyang2 |
10:c8165817d92a | 217 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 218 | |
csyang2 |
10:c8165817d92a | 219 | _Write0(0XE1); //Set Gamma |
csyang2 |
10:c8165817d92a | 220 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 221 | _Write1(0x19); |
csyang2 |
10:c8165817d92a | 222 | _Write1(0x19); |
csyang2 |
10:c8165817d92a | 223 | _Write1(0x00); |
csyang2 |
10:c8165817d92a | 224 | _Write1(0x12); |
csyang2 |
10:c8165817d92a | 225 | _Write1(0x07); |
csyang2 |
10:c8165817d92a | 226 | _Write1(0x2D); |
csyang2 |
10:c8165817d92a | 227 | _Write1(0x28); |
csyang2 |
10:c8165817d92a | 228 | _Write1(0x3F); |
csyang2 |
10:c8165817d92a | 229 | _Write1(0x02); |
csyang2 |
10:c8165817d92a | 230 | _Write1(0x0A); |
csyang2 |
10:c8165817d92a | 231 | _Write1(0x08); |
csyang2 |
10:c8165817d92a | 232 | _Write1(0x25); |
csyang2 |
10:c8165817d92a | 233 | _Write1(0x2D); |
csyang2 |
10:c8165817d92a | 234 | _Write1(0x0F); |
csyang2 |
10:c8165817d92a | 235 | |
csyang2 |
10:c8165817d92a | 236 | _Write0(0x11); //Exit Sleep |
csyang2 |
10:c8165817d92a | 237 | GUI_X_Delay(120); |
csyang2 |
10:c8165817d92a | 238 | _Write0(0x29); //Display on |
csyang2 |
10:c8165817d92a | 239 | |
csyang2 |
10:c8165817d92a | 240 | ILI9341_LED = 1; |
csyang2 |
10:c8165817d92a | 241 | } |
csyang2 |
10:c8165817d92a | 242 | #endif |