NXP
/
rt1050_emwin_gui_demo
RT1050 GUI demo using emWin library
source/emwin_support.c@0:dd702039127a, 2018-09-20 (annotated)
- Committer:
- alejandroRL
- Date:
- Thu Sep 20 19:16:34 2018 +0000
- Revision:
- 0:dd702039127a
emWin GUI Demo for RT1050
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alejandroRL | 0:dd702039127a | 1 | /* |
alejandroRL | 0:dd702039127a | 2 | * The Clear BSD License |
alejandroRL | 0:dd702039127a | 3 | * Copyright (c) 2016, Freescale Semiconductor, Inc. |
alejandroRL | 0:dd702039127a | 4 | * Copyright 2016-2017 NXP |
alejandroRL | 0:dd702039127a | 5 | * All rights reserved. |
alejandroRL | 0:dd702039127a | 6 | * |
alejandroRL | 0:dd702039127a | 7 | * Redistribution and use in source and binary forms, with or without modification, |
alejandroRL | 0:dd702039127a | 8 | * are permitted (subject to the limitations in the disclaimer below) provided |
alejandroRL | 0:dd702039127a | 9 | * that the following conditions are met: |
alejandroRL | 0:dd702039127a | 10 | * |
alejandroRL | 0:dd702039127a | 11 | * o Redistributions of source code must retain the above copyright notice, this list |
alejandroRL | 0:dd702039127a | 12 | * of conditions and the following disclaimer. |
alejandroRL | 0:dd702039127a | 13 | * |
alejandroRL | 0:dd702039127a | 14 | * o Redistributions in binary form must reproduce the above copyright notice, this |
alejandroRL | 0:dd702039127a | 15 | * list of conditions and the following disclaimer in the documentation and/or |
alejandroRL | 0:dd702039127a | 16 | * other materials provided with the distribution. |
alejandroRL | 0:dd702039127a | 17 | * |
alejandroRL | 0:dd702039127a | 18 | * o Neither the name of the copyright holder nor the names of its |
alejandroRL | 0:dd702039127a | 19 | * contributors may be used to endorse or promote products derived from this |
alejandroRL | 0:dd702039127a | 20 | * software without specific prior written permission. |
alejandroRL | 0:dd702039127a | 21 | * |
alejandroRL | 0:dd702039127a | 22 | * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. |
alejandroRL | 0:dd702039127a | 23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
alejandroRL | 0:dd702039127a | 24 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
alejandroRL | 0:dd702039127a | 25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
alejandroRL | 0:dd702039127a | 26 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
alejandroRL | 0:dd702039127a | 27 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
alejandroRL | 0:dd702039127a | 28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
alejandroRL | 0:dd702039127a | 29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
alejandroRL | 0:dd702039127a | 30 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
alejandroRL | 0:dd702039127a | 31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
alejandroRL | 0:dd702039127a | 32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
alejandroRL | 0:dd702039127a | 33 | */ |
alejandroRL | 0:dd702039127a | 34 | |
alejandroRL | 0:dd702039127a | 35 | #include "GUI.h" |
alejandroRL | 0:dd702039127a | 36 | #include "WM.h" |
alejandroRL | 0:dd702039127a | 37 | #include "emwin_support.h" |
alejandroRL | 0:dd702039127a | 38 | #include "GUIDRV_Lin.h" |
alejandroRL | 0:dd702039127a | 39 | |
alejandroRL | 0:dd702039127a | 40 | #include "fsl_elcdif.h" |
alejandroRL | 0:dd702039127a | 41 | #include "fsl_lpi2c.h" |
alejandroRL | 0:dd702039127a | 42 | #include "fsl_ft5406_rt.h" |
alejandroRL | 0:dd702039127a | 43 | |
alejandroRL | 0:dd702039127a | 44 | /* |
alejandroRL | 0:dd702039127a | 45 | ** Define everything necessary for different color depths |
alejandroRL | 0:dd702039127a | 46 | */ |
alejandroRL | 0:dd702039127a | 47 | #if LCD_BITS_PER_PIXEL == 8 /* Palette definition for LUT */ |
alejandroRL | 0:dd702039127a | 48 | static uint32_t lutData[ELCDIF_LUT_ENTRY_NUM]; |
alejandroRL | 0:dd702039127a | 49 | static const LCD_COLOR _aColors_256[] = { |
alejandroRL | 0:dd702039127a | 50 | 0x000000, 0x000033, 0x000066, 0x000099, 0x0000CC, 0x0000FF, 0x003300, 0x003333, 0x003366, 0x003399, 0x0033CC, |
alejandroRL | 0:dd702039127a | 51 | 0x0033FF, 0x006600, 0x006633, 0x006666, 0x006699, 0x0066CC, 0x0066FF, 0x009900, 0x009933, 0x009966, 0x009999, |
alejandroRL | 0:dd702039127a | 52 | 0x0099CC, 0x0099FF, 0x00CC00, 0x00CC33, 0x00CC66, 0x00CC99, 0x00CCCC, 0x00CCFF, 0x00FF00, 0x00FF33, 0x00FF66, |
alejandroRL | 0:dd702039127a | 53 | 0x00FF99, 0x00FFCC, 0x00FFFF, 0x330000, 0x330033, 0x330066, 0x330099, 0x3300CC, 0x3300FF, 0x333300, 0x333333, |
alejandroRL | 0:dd702039127a | 54 | 0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336600, 0x336633, 0x336666, 0x336699, 0x3366CC, 0x3366FF, 0x339900, |
alejandroRL | 0:dd702039127a | 55 | 0x339933, 0x339966, 0x339999, 0x3399CC, 0x3399FF, 0x33CC00, 0x33CC33, 0x33CC66, 0x33CC99, 0x33CCCC, 0x33CCFF, |
alejandroRL | 0:dd702039127a | 56 | 0x33FF00, 0x33FF33, 0x33FF66, 0x33FF99, 0x33FFCC, 0x33FFFF, 0x660000, 0x660033, 0x660066, 0x660099, 0x6600CC, |
alejandroRL | 0:dd702039127a | 57 | 0x6600FF, 0x663300, 0x663333, 0x663366, 0x663399, 0x6633CC, 0x6633FF, 0x666600, 0x666633, 0x666666, 0x666699, |
alejandroRL | 0:dd702039127a | 58 | 0x6666CC, 0x6666FF, 0x669900, 0x669933, 0x669966, 0x669999, 0x6699CC, 0x6699FF, 0x66CC00, 0x66CC33, 0x66CC66, |
alejandroRL | 0:dd702039127a | 59 | 0x66CC99, 0x66CCCC, 0x66CCFF, 0x66FF00, 0x66FF33, 0x66FF66, 0x66FF99, 0x66FFCC, 0x66FFFF, 0x000000, 0x000000, |
alejandroRL | 0:dd702039127a | 60 | 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, |
alejandroRL | 0:dd702039127a | 61 | 0x111111, 0x222222, 0x333333, 0x444444, 0x555555, 0x666666, 0x777777, 0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB, |
alejandroRL | 0:dd702039127a | 62 | 0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, |
alejandroRL | 0:dd702039127a | 63 | 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x990000, 0x990033, 0x990066, 0x990099, 0x9900CC, 0x9900FF, |
alejandroRL | 0:dd702039127a | 64 | 0x993300, 0x993333, 0x993366, 0x993399, 0x9933CC, 0x9933FF, 0x996600, 0x996633, 0x996666, 0x996699, 0x9966CC, |
alejandroRL | 0:dd702039127a | 65 | 0x9966FF, 0x999900, 0x999933, 0x999966, 0x999999, 0x9999CC, 0x9999FF, 0x99CC00, 0x99CC33, 0x99CC66, 0x99CC99, |
alejandroRL | 0:dd702039127a | 66 | 0x99CCCC, 0x99CCFF, 0x99FF00, 0x99FF33, 0x99FF66, 0x99FF99, 0x99FFCC, 0x99FFFF, 0xCC0000, 0xCC0033, 0xCC0066, |
alejandroRL | 0:dd702039127a | 67 | 0xCC0099, 0xCC00CC, 0xCC00FF, 0xCC3300, 0xCC3333, 0xCC3366, 0xCC3399, 0xCC33CC, 0xCC33FF, 0xCC6600, 0xCC6633, |
alejandroRL | 0:dd702039127a | 68 | 0xCC6666, 0xCC6699, 0xCC66CC, 0xCC66FF, 0xCC9900, 0xCC9933, 0xCC9966, 0xCC9999, 0xCC99CC, 0xCC99FF, 0xCCCC00, |
alejandroRL | 0:dd702039127a | 69 | 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCCC, 0xCCCCFF, 0xCCFF00, 0xCCFF33, 0xCCFF66, 0xCCFF99, 0xCCFFCC, 0xCCFFFF, |
alejandroRL | 0:dd702039127a | 70 | 0xFF0000, 0xFF0033, 0xFF0066, 0xFF0099, 0xFF00CC, 0xFF00FF, 0xFF3300, 0xFF3333, 0xFF3366, 0xFF3399, 0xFF33CC, |
alejandroRL | 0:dd702039127a | 71 | 0xFF33FF, 0xFF6600, 0xFF6633, 0xFF6666, 0xFF6699, 0xFF66CC, 0xFF66FF, 0xFF9900, 0xFF9933, 0xFF9966, 0xFF9999, |
alejandroRL | 0:dd702039127a | 72 | 0xFF99CC, 0xFF99FF, 0xFFCC00, 0xFFCC33, 0xFFCC66, 0xFFCC99, 0xFFCCCC, 0xFFCCFF, 0xFFFF00, 0xFFFF33, 0xFFFF66, |
alejandroRL | 0:dd702039127a | 73 | 0xFFFF99, 0xFFFFCC, 0xFFFFFF |
alejandroRL | 0:dd702039127a | 74 | |
alejandroRL | 0:dd702039127a | 75 | }; |
alejandroRL | 0:dd702039127a | 76 | static const LCD_PHYSPALETTE _aPalette_256 = {ARRAY_SIZE(_aColors_256), _aColors_256}; |
alejandroRL | 0:dd702039127a | 77 | #endif |
alejandroRL | 0:dd702039127a | 78 | #if LCD_BITS_PER_PIXEL < 32 /* Buffer definitions for emwin and LCD framebuffer */ |
alejandroRL | 0:dd702039127a | 79 | AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_gui_memory[GUI_NUMBYTES * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN); |
alejandroRL | 0:dd702039127a | 80 | AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN); |
alejandroRL | 0:dd702039127a | 81 | #else |
alejandroRL | 0:dd702039127a | 82 | uint32_t s_gui_memory[(GUI_NUMBYTES)]; |
alejandroRL | 0:dd702039127a | 83 | uint32_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS]; |
alejandroRL | 0:dd702039127a | 84 | #endif |
alejandroRL | 0:dd702039127a | 85 | |
alejandroRL | 0:dd702039127a | 86 | /* Memory address definitions */ |
alejandroRL | 0:dd702039127a | 87 | #define GUI_MEMORY_ADDR ((uint32_t)s_gui_memory) |
alejandroRL | 0:dd702039127a | 88 | #define VRAM_ADDR ((uint32_t)s_vram_buffer) |
alejandroRL | 0:dd702039127a | 89 | |
alejandroRL | 0:dd702039127a | 90 | static volatile int32_t s_LCDpendingBuffer = -1; |
alejandroRL | 0:dd702039127a | 91 | |
alejandroRL | 0:dd702039127a | 92 | /******************************************************************************* |
alejandroRL | 0:dd702039127a | 93 | * Implementation of PortAPI for emWin LCD driver |
alejandroRL | 0:dd702039127a | 94 | ******************************************************************************/ |
alejandroRL | 0:dd702039127a | 95 | |
alejandroRL | 0:dd702039127a | 96 | /* Enable interrupt. */ |
alejandroRL | 0:dd702039127a | 97 | void BOARD_EnableLcdInterrupt(void) |
alejandroRL | 0:dd702039127a | 98 | { |
alejandroRL | 0:dd702039127a | 99 | EnableIRQ(LCDIF_IRQn); |
alejandroRL | 0:dd702039127a | 100 | } |
alejandroRL | 0:dd702039127a | 101 | |
alejandroRL | 0:dd702039127a | 102 | void APP_LCDIF_IRQHandler(void) |
alejandroRL | 0:dd702039127a | 103 | { |
alejandroRL | 0:dd702039127a | 104 | uint32_t intStatus; |
alejandroRL | 0:dd702039127a | 105 | |
alejandroRL | 0:dd702039127a | 106 | intStatus = ELCDIF_GetInterruptStatus(APP_ELCDIF); |
alejandroRL | 0:dd702039127a | 107 | |
alejandroRL | 0:dd702039127a | 108 | ELCDIF_ClearInterruptStatus(APP_ELCDIF, intStatus); |
alejandroRL | 0:dd702039127a | 109 | |
alejandroRL | 0:dd702039127a | 110 | if (intStatus & kELCDIF_CurFrameDone) |
alejandroRL | 0:dd702039127a | 111 | { |
alejandroRL | 0:dd702039127a | 112 | if (s_LCDpendingBuffer >= 0) |
alejandroRL | 0:dd702039127a | 113 | { |
alejandroRL | 0:dd702039127a | 114 | /* Send a confirmation that the given buffer is visible */ |
alejandroRL | 0:dd702039127a | 115 | GUI_MULTIBUF_Confirm(s_LCDpendingBuffer); |
alejandroRL | 0:dd702039127a | 116 | s_LCDpendingBuffer = -1; |
alejandroRL | 0:dd702039127a | 117 | } |
alejandroRL | 0:dd702039127a | 118 | } |
alejandroRL | 0:dd702039127a | 119 | /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping |
alejandroRL | 0:dd702039127a | 120 | exception return operation might vector to incorrect interrupt */ |
alejandroRL | 0:dd702039127a | 121 | #if defined __CORTEX_M && (__CORTEX_M == 4U) |
alejandroRL | 0:dd702039127a | 122 | __DSB(); |
alejandroRL | 0:dd702039127a | 123 | #endif |
alejandroRL | 0:dd702039127a | 124 | } |
alejandroRL | 0:dd702039127a | 125 | |
alejandroRL | 0:dd702039127a | 126 | void LCDIF_IRQHandler(void) |
alejandroRL | 0:dd702039127a | 127 | { |
alejandroRL | 0:dd702039127a | 128 | APP_LCDIF_IRQHandler(); |
alejandroRL | 0:dd702039127a | 129 | } |
alejandroRL | 0:dd702039127a | 130 | |
alejandroRL | 0:dd702039127a | 131 | void APP_ELCDIF_Init(void) |
alejandroRL | 0:dd702039127a | 132 | { |
alejandroRL | 0:dd702039127a | 133 | const elcdif_rgb_mode_config_t config = { |
alejandroRL | 0:dd702039127a | 134 | .panelWidth = APP_IMG_WIDTH, |
alejandroRL | 0:dd702039127a | 135 | .panelHeight = APP_IMG_HEIGHT, |
alejandroRL | 0:dd702039127a | 136 | .hsw = APP_HSW, |
alejandroRL | 0:dd702039127a | 137 | .hfp = APP_HFP, |
alejandroRL | 0:dd702039127a | 138 | .hbp = APP_HBP, |
alejandroRL | 0:dd702039127a | 139 | .vsw = APP_VSW, |
alejandroRL | 0:dd702039127a | 140 | .vfp = APP_VFP, |
alejandroRL | 0:dd702039127a | 141 | .vbp = APP_VBP, |
alejandroRL | 0:dd702039127a | 142 | .polarityFlags = APP_POL_FLAGS, |
alejandroRL | 0:dd702039127a | 143 | .bufferAddr = VRAM_ADDR, |
alejandroRL | 0:dd702039127a | 144 | .pixelFormat = ELCDIF_PIXEL_FORMAT, |
alejandroRL | 0:dd702039127a | 145 | .dataBus = APP_LCDIF_DATA_BUS, |
alejandroRL | 0:dd702039127a | 146 | }; |
alejandroRL | 0:dd702039127a | 147 | ELCDIF_RgbModeInit(APP_ELCDIF, &config); |
alejandroRL | 0:dd702039127a | 148 | |
alejandroRL | 0:dd702039127a | 149 | #if (LCD_BITS_PER_PIXEL == 8) |
alejandroRL | 0:dd702039127a | 150 | /* Load the LUT data. */ |
alejandroRL | 0:dd702039127a | 151 | ELCDIF_UpdateLut(APP_ELCDIF, kELCDIF_Lut0, 0, lutData, ELCDIF_LUT_ENTRY_NUM); |
alejandroRL | 0:dd702039127a | 152 | ELCDIF_EnableLut(APP_ELCDIF, true); |
alejandroRL | 0:dd702039127a | 153 | #endif |
alejandroRL | 0:dd702039127a | 154 | BOARD_EnableLcdInterrupt(); |
alejandroRL | 0:dd702039127a | 155 | ELCDIF_EnableInterrupts(APP_ELCDIF, kELCDIF_CurFrameDoneInterruptEnable); |
alejandroRL | 0:dd702039127a | 156 | ELCDIF_RgbModeStart(APP_ELCDIF); |
alejandroRL | 0:dd702039127a | 157 | } |
alejandroRL | 0:dd702039127a | 158 | |
alejandroRL | 0:dd702039127a | 159 | /******************************************************************************* |
alejandroRL | 0:dd702039127a | 160 | * Implementation of communication with the touch controller |
alejandroRL | 0:dd702039127a | 161 | ******************************************************************************/ |
alejandroRL | 0:dd702039127a | 162 | |
alejandroRL | 0:dd702039127a | 163 | /* Touch driver handle. */ |
alejandroRL | 0:dd702039127a | 164 | static ft5406_rt_handle_t touchHandle; |
alejandroRL | 0:dd702039127a | 165 | |
alejandroRL | 0:dd702039127a | 166 | static void BOARD_Touch_Init(void) |
alejandroRL | 0:dd702039127a | 167 | { |
alejandroRL | 0:dd702039127a | 168 | lpi2c_master_config_t masterConfig = {0}; |
alejandroRL | 0:dd702039127a | 169 | /* |
alejandroRL | 0:dd702039127a | 170 | * masterConfig.debugEnable = false; |
alejandroRL | 0:dd702039127a | 171 | * masterConfig.ignoreAck = false; |
alejandroRL | 0:dd702039127a | 172 | * masterConfig.pinConfig = kLPI2C_2PinOpenDrain; |
alejandroRL | 0:dd702039127a | 173 | * masterConfig.baudRate_Hz = 100000U; |
alejandroRL | 0:dd702039127a | 174 | * masterConfig.busIdleTimeout_ns = 0; |
alejandroRL | 0:dd702039127a | 175 | * masterConfig.pinLowTimeout_ns = 0; |
alejandroRL | 0:dd702039127a | 176 | * masterConfig.sdaGlitchFilterWidth_ns = 0; |
alejandroRL | 0:dd702039127a | 177 | * masterConfig.sclGlitchFilterWidth_ns = 0; |
alejandroRL | 0:dd702039127a | 178 | */ |
alejandroRL | 0:dd702039127a | 179 | LPI2C_MasterGetDefaultConfig(&masterConfig); |
alejandroRL | 0:dd702039127a | 180 | |
alejandroRL | 0:dd702039127a | 181 | /* Change the default baudrate configuration */ |
alejandroRL | 0:dd702039127a | 182 | masterConfig.baudRate_Hz = BOARD_TOUCH_I2C_BAUDRATE; |
alejandroRL | 0:dd702039127a | 183 | |
alejandroRL | 0:dd702039127a | 184 | /* Initialize the LPI2C master peripheral */ |
alejandroRL | 0:dd702039127a | 185 | LPI2C_MasterInit(BOARD_TOUCH_I2C, &masterConfig, BOARD_TOUCH_I2C_CLOCK_FREQ); |
alejandroRL | 0:dd702039127a | 186 | |
alejandroRL | 0:dd702039127a | 187 | /* Initialize the touch handle. */ |
alejandroRL | 0:dd702039127a | 188 | FT5406_RT_Init(&touchHandle, BOARD_TOUCH_I2C); |
alejandroRL | 0:dd702039127a | 189 | } |
alejandroRL | 0:dd702039127a | 190 | |
alejandroRL | 0:dd702039127a | 191 | void BOARD_Touch_Deinit(void) |
alejandroRL | 0:dd702039127a | 192 | { |
alejandroRL | 0:dd702039127a | 193 | LPI2C_MasterDeinit(BOARD_TOUCH_I2C); |
alejandroRL | 0:dd702039127a | 194 | } |
alejandroRL | 0:dd702039127a | 195 | |
alejandroRL | 0:dd702039127a | 196 | int BOARD_Touch_Poll(void) |
alejandroRL | 0:dd702039127a | 197 | { |
alejandroRL | 0:dd702039127a | 198 | touch_event_t touch_event; |
alejandroRL | 0:dd702039127a | 199 | int touch_x; |
alejandroRL | 0:dd702039127a | 200 | int touch_y; |
alejandroRL | 0:dd702039127a | 201 | GUI_PID_STATE pid_state; |
alejandroRL | 0:dd702039127a | 202 | |
alejandroRL | 0:dd702039127a | 203 | if (kStatus_Success != FT5406_RT_GetSingleTouch(&touchHandle, &touch_event, &touch_x, &touch_y)) |
alejandroRL | 0:dd702039127a | 204 | { |
alejandroRL | 0:dd702039127a | 205 | return 0; |
alejandroRL | 0:dd702039127a | 206 | } |
alejandroRL | 0:dd702039127a | 207 | else if (touch_event != kTouch_Reserved) |
alejandroRL | 0:dd702039127a | 208 | { |
alejandroRL | 0:dd702039127a | 209 | pid_state.x = touch_y; |
alejandroRL | 0:dd702039127a | 210 | pid_state.y = touch_x; |
alejandroRL | 0:dd702039127a | 211 | pid_state.Pressed = ((touch_event == kTouch_Down) || (touch_event == kTouch_Contact)); |
alejandroRL | 0:dd702039127a | 212 | pid_state.Layer = 0; |
alejandroRL | 0:dd702039127a | 213 | GUI_TOUCH_StoreStateEx(&pid_state); |
alejandroRL | 0:dd702039127a | 214 | return 1; |
alejandroRL | 0:dd702039127a | 215 | } |
alejandroRL | 0:dd702039127a | 216 | return 0; |
alejandroRL | 0:dd702039127a | 217 | } |
alejandroRL | 0:dd702039127a | 218 | |
alejandroRL | 0:dd702039127a | 219 | /******************************************************************************* |
alejandroRL | 0:dd702039127a | 220 | * Application implemented functions required by emWin library |
alejandroRL | 0:dd702039127a | 221 | ******************************************************************************/ |
alejandroRL | 0:dd702039127a | 222 | void LCD_X_Config(void) |
alejandroRL | 0:dd702039127a | 223 | { |
alejandroRL | 0:dd702039127a | 224 | GUI_MULTIBUF_Config(GUI_BUFFERS); |
alejandroRL | 0:dd702039127a | 225 | GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0); |
alejandroRL | 0:dd702039127a | 226 | LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT); |
alejandroRL | 0:dd702039127a | 227 | LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT); |
alejandroRL | 0:dd702039127a | 228 | LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR); |
alejandroRL | 0:dd702039127a | 229 | #if (LCD_BITS_PER_PIXEL == 8) |
alejandroRL | 0:dd702039127a | 230 | LCD_SetLUT(&_aPalette_256); |
alejandroRL | 0:dd702039127a | 231 | #endif |
alejandroRL | 0:dd702039127a | 232 | BOARD_Touch_Init(); |
alejandroRL | 0:dd702039127a | 233 | } |
alejandroRL | 0:dd702039127a | 234 | |
alejandroRL | 0:dd702039127a | 235 | int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *p) |
alejandroRL | 0:dd702039127a | 236 | { |
alejandroRL | 0:dd702039127a | 237 | uint32_t addr; |
alejandroRL | 0:dd702039127a | 238 | #if (LCD_BITS_PER_PIXEL == 8) |
alejandroRL | 0:dd702039127a | 239 | uint16_t colorR, colorG, colorB; |
alejandroRL | 0:dd702039127a | 240 | uint32_t color; |
alejandroRL | 0:dd702039127a | 241 | #endif |
alejandroRL | 0:dd702039127a | 242 | int result = 0; |
alejandroRL | 0:dd702039127a | 243 | LCD_X_SHOWBUFFER_INFO *pData; |
alejandroRL | 0:dd702039127a | 244 | switch (Cmd) |
alejandroRL | 0:dd702039127a | 245 | { |
alejandroRL | 0:dd702039127a | 246 | case LCD_X_INITCONTROLLER: |
alejandroRL | 0:dd702039127a | 247 | { |
alejandroRL | 0:dd702039127a | 248 | APP_ELCDIF_Init(); |
alejandroRL | 0:dd702039127a | 249 | break; |
alejandroRL | 0:dd702039127a | 250 | } |
alejandroRL | 0:dd702039127a | 251 | case LCD_X_SHOWBUFFER: |
alejandroRL | 0:dd702039127a | 252 | { |
alejandroRL | 0:dd702039127a | 253 | pData = (LCD_X_SHOWBUFFER_INFO *)p; |
alejandroRL | 0:dd702039127a | 254 | /* Calculate address of the given buffer */ |
alejandroRL | 0:dd702039127a | 255 | addr = VRAM_ADDR + VRAM_SIZE * pData->Index; |
alejandroRL | 0:dd702039127a | 256 | /* Make the given buffer visible */ |
alejandroRL | 0:dd702039127a | 257 | ELCDIF_SetNextBufferAddr(APP_ELCDIF, addr); |
alejandroRL | 0:dd702039127a | 258 | // |
alejandroRL | 0:dd702039127a | 259 | // Remember buffer index to be used by ISR |
alejandroRL | 0:dd702039127a | 260 | // |
alejandroRL | 0:dd702039127a | 261 | s_LCDpendingBuffer = pData->Index; |
alejandroRL | 0:dd702039127a | 262 | while (s_LCDpendingBuffer >= 0) |
alejandroRL | 0:dd702039127a | 263 | ; |
alejandroRL | 0:dd702039127a | 264 | return 0; |
alejandroRL | 0:dd702039127a | 265 | } |
alejandroRL | 0:dd702039127a | 266 | #if (LCD_BITS_PER_PIXEL == 8) |
alejandroRL | 0:dd702039127a | 267 | case LCD_X_SETLUTENTRY: |
alejandroRL | 0:dd702039127a | 268 | { |
alejandroRL | 0:dd702039127a | 269 | // |
alejandroRL | 0:dd702039127a | 270 | // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p |
alejandroRL | 0:dd702039127a | 271 | // |
alejandroRL | 0:dd702039127a | 272 | LCD_X_SETLUTENTRY_INFO *pData; |
alejandroRL | 0:dd702039127a | 273 | pData = (LCD_X_SETLUTENTRY_INFO *)p; |
alejandroRL | 0:dd702039127a | 274 | // |
alejandroRL | 0:dd702039127a | 275 | // Call hardware routine to write a LUT entry to the controller |
alejandroRL | 0:dd702039127a | 276 | // |
alejandroRL | 0:dd702039127a | 277 | color = pData->Color; |
alejandroRL | 0:dd702039127a | 278 | colorB = (color & 0xFF0000) >> 16; |
alejandroRL | 0:dd702039127a | 279 | colorG = (color & 0x00FF00) >> 8; |
alejandroRL | 0:dd702039127a | 280 | colorR = (color & 0x0000FF); |
alejandroRL | 0:dd702039127a | 281 | /* 16-bit bus */ |
alejandroRL | 0:dd702039127a | 282 | lutData[pData->Pos] = ((colorR >> 3) << 11) | ((colorG >> 2) << 5) | ((colorB >> 3) << 0); |
alejandroRL | 0:dd702039127a | 283 | return 0; |
alejandroRL | 0:dd702039127a | 284 | } |
alejandroRL | 0:dd702039127a | 285 | #endif |
alejandroRL | 0:dd702039127a | 286 | default: |
alejandroRL | 0:dd702039127a | 287 | result = -1; |
alejandroRL | 0:dd702039127a | 288 | break; |
alejandroRL | 0:dd702039127a | 289 | } |
alejandroRL | 0:dd702039127a | 290 | |
alejandroRL | 0:dd702039127a | 291 | return result; |
alejandroRL | 0:dd702039127a | 292 | } |
alejandroRL | 0:dd702039127a | 293 | |
alejandroRL | 0:dd702039127a | 294 | void GUI_X_Config(void) |
alejandroRL | 0:dd702039127a | 295 | { |
alejandroRL | 0:dd702039127a | 296 | /* Assign work memory area to emWin */ |
alejandroRL | 0:dd702039127a | 297 | GUI_ALLOC_AssignMemory((void *)GUI_MEMORY_ADDR, GUI_NUMBYTES); |
alejandroRL | 0:dd702039127a | 298 | |
alejandroRL | 0:dd702039127a | 299 | /* Select default font */ |
alejandroRL | 0:dd702039127a | 300 | GUI_SetDefaultFont(GUI_FONT_6X8); |
alejandroRL | 0:dd702039127a | 301 | } |
alejandroRL | 0:dd702039127a | 302 | |
alejandroRL | 0:dd702039127a | 303 | void GUI_X_Init(void) |
alejandroRL | 0:dd702039127a | 304 | { |
alejandroRL | 0:dd702039127a | 305 | } |
alejandroRL | 0:dd702039127a | 306 | |
alejandroRL | 0:dd702039127a | 307 | /* Dummy RTOS stub required by emWin */ |
alejandroRL | 0:dd702039127a | 308 | void GUI_X_InitOS(void) |
alejandroRL | 0:dd702039127a | 309 | { |
alejandroRL | 0:dd702039127a | 310 | } |
alejandroRL | 0:dd702039127a | 311 | |
alejandroRL | 0:dd702039127a | 312 | /* Dummy RTOS stub required by emWin */ |
alejandroRL | 0:dd702039127a | 313 | void GUI_X_Lock(void) |
alejandroRL | 0:dd702039127a | 314 | { |
alejandroRL | 0:dd702039127a | 315 | } |
alejandroRL | 0:dd702039127a | 316 | |
alejandroRL | 0:dd702039127a | 317 | /* Dummy RTOS stub required by emWin */ |
alejandroRL | 0:dd702039127a | 318 | void GUI_X_Unlock(void) |
alejandroRL | 0:dd702039127a | 319 | { |
alejandroRL | 0:dd702039127a | 320 | } |
alejandroRL | 0:dd702039127a | 321 | |
alejandroRL | 0:dd702039127a | 322 | /* Dummy RTOS stub required by emWin */ |
alejandroRL | 0:dd702039127a | 323 | U32 GUI_X_GetTaskId(void) |
alejandroRL | 0:dd702039127a | 324 | { |
alejandroRL | 0:dd702039127a | 325 | return 0; |
alejandroRL | 0:dd702039127a | 326 | } |
alejandroRL | 0:dd702039127a | 327 | |
alejandroRL | 0:dd702039127a | 328 | void GUI_X_ExecIdle(void) |
alejandroRL | 0:dd702039127a | 329 | { |
alejandroRL | 0:dd702039127a | 330 | } |
alejandroRL | 0:dd702039127a | 331 | |
alejandroRL | 0:dd702039127a | 332 | GUI_TIMER_TIME GUI_X_GetTime(void) |
alejandroRL | 0:dd702039127a | 333 | { |
alejandroRL | 0:dd702039127a | 334 | return 0; |
alejandroRL | 0:dd702039127a | 335 | } |
alejandroRL | 0:dd702039127a | 336 | |
alejandroRL | 0:dd702039127a | 337 | void GUI_X_Delay(int Period) |
alejandroRL | 0:dd702039127a | 338 | { |
alejandroRL | 0:dd702039127a | 339 | volatile int i; |
alejandroRL | 0:dd702039127a | 340 | for (; Period > 0; Period--) |
alejandroRL | 0:dd702039127a | 341 | { |
alejandroRL | 0:dd702039127a | 342 | for (i = 15000; i > 0; i--) |
alejandroRL | 0:dd702039127a | 343 | ; |
alejandroRL | 0:dd702039127a | 344 | } |
alejandroRL | 0:dd702039127a | 345 | } |
alejandroRL | 0:dd702039127a | 346 | |
alejandroRL | 0:dd702039127a | 347 | void *emWin_memcpy(void *pDst, const void *pSrc, long size) |
alejandroRL | 0:dd702039127a | 348 | { |
alejandroRL | 0:dd702039127a | 349 | return memcpy(pDst, pSrc, size); |
alejandroRL | 0:dd702039127a | 350 | } |