Sylvain Letreguilly / Mbed 2 deprecated cpelcddemo

Dependencies:   mbed

Committer:
agemio
Date:
Thu Nov 05 12:53:31 2015 +0000
Revision:
0:14f16771fe40
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
agemio 0:14f16771fe40 1 /**
agemio 0:14f16771fe40 2 ******************************************************************************
agemio 0:14f16771fe40 3 * @file stm32746g_discovery_lcd.c
agemio 0:14f16771fe40 4 * @author MCD Application Team
agemio 0:14f16771fe40 5 * @version V1.0.0
agemio 0:14f16771fe40 6 * @date 25-June-2015
agemio 0:14f16771fe40 7 * @brief This file includes the driver for Liquid Crystal Display (LCD) module
agemio 0:14f16771fe40 8 * mounted on STM32746G-Discovery board.
agemio 0:14f16771fe40 9 @verbatim
agemio 0:14f16771fe40 10 1. How To use this driver:
agemio 0:14f16771fe40 11 --------------------------
agemio 0:14f16771fe40 12 - This driver is used to drive directly an LCD TFT using the LTDC controller.
agemio 0:14f16771fe40 13 - This driver uses timing and setting for RK043FN48H LCD.
agemio 0:14f16771fe40 14
agemio 0:14f16771fe40 15 2. Driver description:
agemio 0:14f16771fe40 16 ---------------------
agemio 0:14f16771fe40 17 + Initialization steps:
agemio 0:14f16771fe40 18 o Initialize the LCD using the BSP_LCD_Init() function.
agemio 0:14f16771fe40 19 o Apply the Layer configuration using the BSP_LCD_LayerDefaultInit() function.
agemio 0:14f16771fe40 20 o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.
agemio 0:14f16771fe40 21 o Enable the LCD display using the BSP_LCD_DisplayOn() function.
agemio 0:14f16771fe40 22
agemio 0:14f16771fe40 23 + Options
agemio 0:14f16771fe40 24 o Configure and enable the color keying functionality using the
agemio 0:14f16771fe40 25 BSP_LCD_SetColorKeying() function.
agemio 0:14f16771fe40 26 o Modify in the fly the transparency and/or the frame buffer address
agemio 0:14f16771fe40 27 using the following functions:
agemio 0:14f16771fe40 28 - BSP_LCD_SetTransparency()
agemio 0:14f16771fe40 29 - BSP_LCD_SetLayerAddress()
agemio 0:14f16771fe40 30
agemio 0:14f16771fe40 31 + Display on LCD
agemio 0:14f16771fe40 32 o Clear the hole LCD using BSP_LCD_Clear() function or only one specified string
agemio 0:14f16771fe40 33 line using the BSP_LCD_ClearStringLine() function.
agemio 0:14f16771fe40 34 o Display a character on the specified line and column using the BSP_LCD_DisplayChar()
agemio 0:14f16771fe40 35 function or a complete string line using the BSP_LCD_DisplayStringAtLine() function.
agemio 0:14f16771fe40 36 o Display a string line on the specified position (x,y in pixel) and align mode
agemio 0:14f16771fe40 37 using the BSP_LCD_DisplayStringAtLine() function.
agemio 0:14f16771fe40 38 o Draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
agemio 0:14f16771fe40 39 on LCD using the available set of functions.
agemio 0:14f16771fe40 40 @endverbatim
agemio 0:14f16771fe40 41 ******************************************************************************
agemio 0:14f16771fe40 42 * @attention
agemio 0:14f16771fe40 43 *
agemio 0:14f16771fe40 44 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
agemio 0:14f16771fe40 45 *
agemio 0:14f16771fe40 46 * Redistribution and use in source and binary forms, with or without modification,
agemio 0:14f16771fe40 47 * are permitted provided that the following conditions are met:
agemio 0:14f16771fe40 48 * 1. Redistributions of source code must retain the above copyright notice,
agemio 0:14f16771fe40 49 * this list of conditions and the following disclaimer.
agemio 0:14f16771fe40 50 * 2. Redistributions in binary form must reproduce the above copyright notice,
agemio 0:14f16771fe40 51 * this list of conditions and the following disclaimer in the documentation
agemio 0:14f16771fe40 52 * and/or other materials provided with the distribution.
agemio 0:14f16771fe40 53 * 3. Neither the name of STMicroelectronics nor the names of its contributors
agemio 0:14f16771fe40 54 * may be used to endorse or promote products derived from this software
agemio 0:14f16771fe40 55 * without specific prior written permission.
agemio 0:14f16771fe40 56 *
agemio 0:14f16771fe40 57 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
agemio 0:14f16771fe40 58 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
agemio 0:14f16771fe40 59 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
agemio 0:14f16771fe40 60 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
agemio 0:14f16771fe40 61 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
agemio 0:14f16771fe40 62 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
agemio 0:14f16771fe40 63 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
agemio 0:14f16771fe40 64 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
agemio 0:14f16771fe40 65 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
agemio 0:14f16771fe40 66 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
agemio 0:14f16771fe40 67 *
agemio 0:14f16771fe40 68 ******************************************************************************
agemio 0:14f16771fe40 69 */
agemio 0:14f16771fe40 70
agemio 0:14f16771fe40 71 /* Includes ------------------------------------------------------------------*/
agemio 0:14f16771fe40 72 #include "stm32746g_discovery_lcd.h"
agemio 0:14f16771fe40 73 #include "fonts.h"
agemio 0:14f16771fe40 74 /*
agemio 0:14f16771fe40 75 #include "font24.c"
agemio 0:14f16771fe40 76 #include "font20.c"
agemio 0:14f16771fe40 77 #include "font16.c"
agemio 0:14f16771fe40 78 #include "font12.c"
agemio 0:14f16771fe40 79 #include "font8.c"
agemio 0:14f16771fe40 80 */
agemio 0:14f16771fe40 81
agemio 0:14f16771fe40 82 /** @addtogroup BSP
agemio 0:14f16771fe40 83 * @{
agemio 0:14f16771fe40 84 */
agemio 0:14f16771fe40 85
agemio 0:14f16771fe40 86 /** @addtogroup STM32746G_DISCOVERY
agemio 0:14f16771fe40 87 * @{
agemio 0:14f16771fe40 88 */
agemio 0:14f16771fe40 89
agemio 0:14f16771fe40 90 /** @addtogroup STM32746G_DISCOVERY_LCD
agemio 0:14f16771fe40 91 * @{
agemio 0:14f16771fe40 92 */
agemio 0:14f16771fe40 93
agemio 0:14f16771fe40 94 /** @defgroup STM32746G_DISCOVERY_LCD_Private_TypesDefinitions STM32746G_DISCOVERY_LCD Private Types Definitions
agemio 0:14f16771fe40 95 * @{
agemio 0:14f16771fe40 96 */
agemio 0:14f16771fe40 97 /**
agemio 0:14f16771fe40 98 * @}
agemio 0:14f16771fe40 99 */
agemio 0:14f16771fe40 100
agemio 0:14f16771fe40 101 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Defines STM32746G_DISCOVERY LCD Private Defines
agemio 0:14f16771fe40 102 * @{
agemio 0:14f16771fe40 103 */
agemio 0:14f16771fe40 104 #define POLY_X(Z) ((int32_t)((Points + Z)->X))
agemio 0:14f16771fe40 105 #define POLY_Y(Z) ((int32_t)((Points + Z)->Y))
agemio 0:14f16771fe40 106 /**
agemio 0:14f16771fe40 107 * @}
agemio 0:14f16771fe40 108 */
agemio 0:14f16771fe40 109
agemio 0:14f16771fe40 110 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Macros STM32746G_DISCOVERY_LCD Private Macros
agemio 0:14f16771fe40 111 * @{
agemio 0:14f16771fe40 112 */
agemio 0:14f16771fe40 113 #define ABS(X) ((X) > 0 ? (X) : -(X))
agemio 0:14f16771fe40 114 /**
agemio 0:14f16771fe40 115 * @}
agemio 0:14f16771fe40 116 */
agemio 0:14f16771fe40 117
agemio 0:14f16771fe40 118 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Variables STM32746G_DISCOVERY_LCD Private Variables
agemio 0:14f16771fe40 119 * @{
agemio 0:14f16771fe40 120 */
agemio 0:14f16771fe40 121 static LTDC_HandleTypeDef hLtdcHandler;
agemio 0:14f16771fe40 122 static DMA2D_HandleTypeDef hDma2dHandler;
agemio 0:14f16771fe40 123
agemio 0:14f16771fe40 124 /* Default LCD configuration with LCD Layer 1 */
agemio 0:14f16771fe40 125 static uint32_t ActiveLayer = 0;
agemio 0:14f16771fe40 126 static LCD_DrawPropTypeDef DrawProp[MAX_LAYER_NUMBER];
agemio 0:14f16771fe40 127 /**
agemio 0:14f16771fe40 128 * @}
agemio 0:14f16771fe40 129 */
agemio 0:14f16771fe40 130
agemio 0:14f16771fe40 131 /** @defgroup STM32746G_DISCOVERY_LCD_Private_FunctionPrototypes STM32746G_DISCOVERY_LCD Private Function Prototypes
agemio 0:14f16771fe40 132 * @{
agemio 0:14f16771fe40 133 */
agemio 0:14f16771fe40 134 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c);
agemio 0:14f16771fe40 135 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);
agemio 0:14f16771fe40 136 static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex);
agemio 0:14f16771fe40 137 static void LL_ConvertLineToARGB8888(void * pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode);
agemio 0:14f16771fe40 138 /**
agemio 0:14f16771fe40 139 * @}
agemio 0:14f16771fe40 140 */
agemio 0:14f16771fe40 141
agemio 0:14f16771fe40 142 /** @defgroup STM32746G_DISCOVERY_LCD_Exported_Functions STM32746G_DISCOVERY_LCD Exported Functions
agemio 0:14f16771fe40 143 * @{
agemio 0:14f16771fe40 144 */
agemio 0:14f16771fe40 145
agemio 0:14f16771fe40 146 /**
agemio 0:14f16771fe40 147 * @brief Initializes the LCD.
agemio 0:14f16771fe40 148 * @retval LCD state
agemio 0:14f16771fe40 149 */
agemio 0:14f16771fe40 150 uint8_t BSP_LCD_Init(void)
agemio 0:14f16771fe40 151 {
agemio 0:14f16771fe40 152 /* Select the used LCD */
agemio 0:14f16771fe40 153
agemio 0:14f16771fe40 154 /* The RK043FN48H LCD 480x272 is selected */
agemio 0:14f16771fe40 155 /* Timing Configuration */
agemio 0:14f16771fe40 156 hLtdcHandler.Init.HorizontalSync = (RK043FN48H_HSYNC - 1);
agemio 0:14f16771fe40 157 hLtdcHandler.Init.VerticalSync = (RK043FN48H_VSYNC - 1);
agemio 0:14f16771fe40 158 hLtdcHandler.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1);
agemio 0:14f16771fe40 159 hLtdcHandler.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1);
agemio 0:14f16771fe40 160 hLtdcHandler.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1);
agemio 0:14f16771fe40 161 hLtdcHandler.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1);
agemio 0:14f16771fe40 162 hLtdcHandler.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1);
agemio 0:14f16771fe40 163 hLtdcHandler.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1);
agemio 0:14f16771fe40 164
agemio 0:14f16771fe40 165 /* LCD clock configuration */
agemio 0:14f16771fe40 166 BSP_LCD_ClockConfig(&hLtdcHandler, NULL);
agemio 0:14f16771fe40 167
agemio 0:14f16771fe40 168 /* Initialize the LCD pixel width and pixel height */
agemio 0:14f16771fe40 169 hLtdcHandler.LayerCfg->ImageWidth = RK043FN48H_WIDTH;
agemio 0:14f16771fe40 170 hLtdcHandler.LayerCfg->ImageHeight = RK043FN48H_HEIGHT;
agemio 0:14f16771fe40 171
agemio 0:14f16771fe40 172 /* Background value */
agemio 0:14f16771fe40 173 hLtdcHandler.Init.Backcolor.Blue = 0;
agemio 0:14f16771fe40 174 hLtdcHandler.Init.Backcolor.Green = 0;
agemio 0:14f16771fe40 175 hLtdcHandler.Init.Backcolor.Red = 0;
agemio 0:14f16771fe40 176
agemio 0:14f16771fe40 177 /* Polarity */
agemio 0:14f16771fe40 178 hLtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
agemio 0:14f16771fe40 179 hLtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
agemio 0:14f16771fe40 180 hLtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
agemio 0:14f16771fe40 181 hLtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
agemio 0:14f16771fe40 182 hLtdcHandler.Instance = LTDC;
agemio 0:14f16771fe40 183
agemio 0:14f16771fe40 184 if(HAL_LTDC_GetState(&hLtdcHandler) == HAL_LTDC_STATE_RESET)
agemio 0:14f16771fe40 185 {
agemio 0:14f16771fe40 186 /* Initialize the LCD Msp: this __weak function can be rewritten by the application */
agemio 0:14f16771fe40 187 BSP_LCD_MspInit(&hLtdcHandler, NULL);
agemio 0:14f16771fe40 188 }
agemio 0:14f16771fe40 189 HAL_LTDC_Init(&hLtdcHandler);
agemio 0:14f16771fe40 190
agemio 0:14f16771fe40 191 /* Assert display enable LCD_DISP pin */
agemio 0:14f16771fe40 192 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET);
agemio 0:14f16771fe40 193
agemio 0:14f16771fe40 194 /* Assert backlight LCD_BL_CTRL pin */
agemio 0:14f16771fe40 195 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET);
agemio 0:14f16771fe40 196
agemio 0:14f16771fe40 197 #if !defined(DATA_IN_ExtSDRAM)
agemio 0:14f16771fe40 198 /* Initialize the SDRAM */
agemio 0:14f16771fe40 199 BSP_SDRAM_Init();
agemio 0:14f16771fe40 200 #endif
agemio 0:14f16771fe40 201
agemio 0:14f16771fe40 202 /* Initialize the font */
agemio 0:14f16771fe40 203 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
agemio 0:14f16771fe40 204
agemio 0:14f16771fe40 205 return LCD_OK;
agemio 0:14f16771fe40 206 }
agemio 0:14f16771fe40 207
agemio 0:14f16771fe40 208 /**
agemio 0:14f16771fe40 209 * @brief DeInitializes the LCD.
agemio 0:14f16771fe40 210 * @retval LCD state
agemio 0:14f16771fe40 211 */
agemio 0:14f16771fe40 212 uint8_t BSP_LCD_DeInit(void)
agemio 0:14f16771fe40 213 {
agemio 0:14f16771fe40 214 /* Initialize the hLtdcHandler Instance parameter */
agemio 0:14f16771fe40 215 hLtdcHandler.Instance = LTDC;
agemio 0:14f16771fe40 216
agemio 0:14f16771fe40 217 /* Disable LTDC block */
agemio 0:14f16771fe40 218 __HAL_LTDC_DISABLE(&hLtdcHandler);
agemio 0:14f16771fe40 219
agemio 0:14f16771fe40 220 /* DeInit the LTDC */
agemio 0:14f16771fe40 221 HAL_LTDC_DeInit(&hLtdcHandler);
agemio 0:14f16771fe40 222
agemio 0:14f16771fe40 223 /* DeInit the LTDC MSP : this __weak function can be rewritten by the application */
agemio 0:14f16771fe40 224 BSP_LCD_MspDeInit(&hLtdcHandler, NULL);
agemio 0:14f16771fe40 225
agemio 0:14f16771fe40 226 return LCD_OK;
agemio 0:14f16771fe40 227 }
agemio 0:14f16771fe40 228
agemio 0:14f16771fe40 229 /**
agemio 0:14f16771fe40 230 * @brief Gets the LCD X size.
agemio 0:14f16771fe40 231 * @retval Used LCD X size
agemio 0:14f16771fe40 232 */
agemio 0:14f16771fe40 233 uint32_t BSP_LCD_GetXSize(void)
agemio 0:14f16771fe40 234 {
agemio 0:14f16771fe40 235 return hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth;
agemio 0:14f16771fe40 236 }
agemio 0:14f16771fe40 237
agemio 0:14f16771fe40 238 /**
agemio 0:14f16771fe40 239 * @brief Gets the LCD Y size.
agemio 0:14f16771fe40 240 * @retval Used LCD Y size
agemio 0:14f16771fe40 241 */
agemio 0:14f16771fe40 242 uint32_t BSP_LCD_GetYSize(void)
agemio 0:14f16771fe40 243 {
agemio 0:14f16771fe40 244 return hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight;
agemio 0:14f16771fe40 245 }
agemio 0:14f16771fe40 246
agemio 0:14f16771fe40 247 /**
agemio 0:14f16771fe40 248 * @brief Set the LCD X size.
agemio 0:14f16771fe40 249 * @param imageWidthPixels : image width in pixels unit
agemio 0:14f16771fe40 250 * @retval None
agemio 0:14f16771fe40 251 */
agemio 0:14f16771fe40 252 void BSP_LCD_SetXSize(uint32_t imageWidthPixels)
agemio 0:14f16771fe40 253 {
agemio 0:14f16771fe40 254 hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth = imageWidthPixels;
agemio 0:14f16771fe40 255 }
agemio 0:14f16771fe40 256
agemio 0:14f16771fe40 257 /**
agemio 0:14f16771fe40 258 * @brief Set the LCD Y size.
agemio 0:14f16771fe40 259 * @param imageHeightPixels : image height in lines unit
agemio 0:14f16771fe40 260 * @retval None
agemio 0:14f16771fe40 261 */
agemio 0:14f16771fe40 262 void BSP_LCD_SetYSize(uint32_t imageHeightPixels)
agemio 0:14f16771fe40 263 {
agemio 0:14f16771fe40 264 hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight = imageHeightPixels;
agemio 0:14f16771fe40 265 }
agemio 0:14f16771fe40 266
agemio 0:14f16771fe40 267 /**
agemio 0:14f16771fe40 268 * @brief Initializes the LCD layer in ARGB8888 format (32 bits per pixel).
agemio 0:14f16771fe40 269 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 270 * @param FB_Address: Layer frame buffer
agemio 0:14f16771fe40 271 * @retval None
agemio 0:14f16771fe40 272 */
agemio 0:14f16771fe40 273 void BSP_LCD_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address)
agemio 0:14f16771fe40 274 {
agemio 0:14f16771fe40 275 LCD_LayerCfgTypeDef layer_cfg;
agemio 0:14f16771fe40 276
agemio 0:14f16771fe40 277 /* Layer Init */
agemio 0:14f16771fe40 278 layer_cfg.WindowX0 = 0;
agemio 0:14f16771fe40 279 layer_cfg.WindowX1 = BSP_LCD_GetXSize();
agemio 0:14f16771fe40 280 layer_cfg.WindowY0 = 0;
agemio 0:14f16771fe40 281 layer_cfg.WindowY1 = BSP_LCD_GetYSize();
agemio 0:14f16771fe40 282 layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
agemio 0:14f16771fe40 283 layer_cfg.FBStartAdress = FB_Address;
agemio 0:14f16771fe40 284 layer_cfg.Alpha = 255;
agemio 0:14f16771fe40 285 layer_cfg.Alpha0 = 0;
agemio 0:14f16771fe40 286 layer_cfg.Backcolor.Blue = 0;
agemio 0:14f16771fe40 287 layer_cfg.Backcolor.Green = 0;
agemio 0:14f16771fe40 288 layer_cfg.Backcolor.Red = 0;
agemio 0:14f16771fe40 289 layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
agemio 0:14f16771fe40 290 layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
agemio 0:14f16771fe40 291 layer_cfg.ImageWidth = BSP_LCD_GetXSize();
agemio 0:14f16771fe40 292 layer_cfg.ImageHeight = BSP_LCD_GetYSize();
agemio 0:14f16771fe40 293
agemio 0:14f16771fe40 294 HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex);
agemio 0:14f16771fe40 295
agemio 0:14f16771fe40 296 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
agemio 0:14f16771fe40 297 DrawProp[LayerIndex].pFont = &Font24;
agemio 0:14f16771fe40 298 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK;
agemio 0:14f16771fe40 299 }
agemio 0:14f16771fe40 300
agemio 0:14f16771fe40 301 /**
agemio 0:14f16771fe40 302 * @brief Initializes the LCD layer in RGB565 format (16 bits per pixel).
agemio 0:14f16771fe40 303 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 304 * @param FB_Address: Layer frame buffer
agemio 0:14f16771fe40 305 * @retval None
agemio 0:14f16771fe40 306 */
agemio 0:14f16771fe40 307 void BSP_LCD_LayerRgb565Init(uint16_t LayerIndex, uint32_t FB_Address)
agemio 0:14f16771fe40 308 {
agemio 0:14f16771fe40 309 LCD_LayerCfgTypeDef layer_cfg;
agemio 0:14f16771fe40 310
agemio 0:14f16771fe40 311 /* Layer Init */
agemio 0:14f16771fe40 312 layer_cfg.WindowX0 = 0;
agemio 0:14f16771fe40 313 layer_cfg.WindowX1 = BSP_LCD_GetXSize();
agemio 0:14f16771fe40 314 layer_cfg.WindowY0 = 0;
agemio 0:14f16771fe40 315 layer_cfg.WindowY1 = BSP_LCD_GetYSize();
agemio 0:14f16771fe40 316 layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
agemio 0:14f16771fe40 317 layer_cfg.FBStartAdress = FB_Address;
agemio 0:14f16771fe40 318 layer_cfg.Alpha = 255;
agemio 0:14f16771fe40 319 layer_cfg.Alpha0 = 0;
agemio 0:14f16771fe40 320 layer_cfg.Backcolor.Blue = 0;
agemio 0:14f16771fe40 321 layer_cfg.Backcolor.Green = 0;
agemio 0:14f16771fe40 322 layer_cfg.Backcolor.Red = 0;
agemio 0:14f16771fe40 323 layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
agemio 0:14f16771fe40 324 layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
agemio 0:14f16771fe40 325 layer_cfg.ImageWidth = BSP_LCD_GetXSize();
agemio 0:14f16771fe40 326 layer_cfg.ImageHeight = BSP_LCD_GetYSize();
agemio 0:14f16771fe40 327
agemio 0:14f16771fe40 328 HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex);
agemio 0:14f16771fe40 329
agemio 0:14f16771fe40 330 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
agemio 0:14f16771fe40 331 DrawProp[LayerIndex].pFont = &Font24;
agemio 0:14f16771fe40 332 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK;
agemio 0:14f16771fe40 333 }
agemio 0:14f16771fe40 334
agemio 0:14f16771fe40 335 /**
agemio 0:14f16771fe40 336 * @brief Selects the LCD Layer.
agemio 0:14f16771fe40 337 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 338 * @retval None
agemio 0:14f16771fe40 339 */
agemio 0:14f16771fe40 340 void BSP_LCD_SelectLayer(uint32_t LayerIndex)
agemio 0:14f16771fe40 341 {
agemio 0:14f16771fe40 342 ActiveLayer = LayerIndex;
agemio 0:14f16771fe40 343 }
agemio 0:14f16771fe40 344
agemio 0:14f16771fe40 345 /**
agemio 0:14f16771fe40 346 * @brief Sets an LCD Layer visible
agemio 0:14f16771fe40 347 * @param LayerIndex: Visible Layer
agemio 0:14f16771fe40 348 * @param State: New state of the specified layer
agemio 0:14f16771fe40 349 * This parameter can be one of the following values:
agemio 0:14f16771fe40 350 * @arg ENABLE
agemio 0:14f16771fe40 351 * @arg DISABLE
agemio 0:14f16771fe40 352 * @retval None
agemio 0:14f16771fe40 353 */
agemio 0:14f16771fe40 354 void BSP_LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState State)
agemio 0:14f16771fe40 355 {
agemio 0:14f16771fe40 356 if(State == ENABLE)
agemio 0:14f16771fe40 357 {
agemio 0:14f16771fe40 358 __HAL_LTDC_LAYER_ENABLE(&hLtdcHandler, LayerIndex);
agemio 0:14f16771fe40 359 }
agemio 0:14f16771fe40 360 else
agemio 0:14f16771fe40 361 {
agemio 0:14f16771fe40 362 __HAL_LTDC_LAYER_DISABLE(&hLtdcHandler, LayerIndex);
agemio 0:14f16771fe40 363 }
agemio 0:14f16771fe40 364 __HAL_LTDC_RELOAD_CONFIG(&hLtdcHandler);
agemio 0:14f16771fe40 365 }
agemio 0:14f16771fe40 366
agemio 0:14f16771fe40 367 /**
agemio 0:14f16771fe40 368 * @brief Configures the transparency.
agemio 0:14f16771fe40 369 * @param LayerIndex: Layer foreground or background.
agemio 0:14f16771fe40 370 * @param Transparency: Transparency
agemio 0:14f16771fe40 371 * This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF
agemio 0:14f16771fe40 372 * @retval None
agemio 0:14f16771fe40 373 */
agemio 0:14f16771fe40 374 void BSP_LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency)
agemio 0:14f16771fe40 375 {
agemio 0:14f16771fe40 376 HAL_LTDC_SetAlpha(&hLtdcHandler, Transparency, LayerIndex);
agemio 0:14f16771fe40 377 }
agemio 0:14f16771fe40 378
agemio 0:14f16771fe40 379 /**
agemio 0:14f16771fe40 380 * @brief Sets an LCD layer frame buffer address.
agemio 0:14f16771fe40 381 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 382 * @param Address: New LCD frame buffer value
agemio 0:14f16771fe40 383 * @retval None
agemio 0:14f16771fe40 384 */
agemio 0:14f16771fe40 385 void BSP_LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address)
agemio 0:14f16771fe40 386 {
agemio 0:14f16771fe40 387 HAL_LTDC_SetAddress(&hLtdcHandler, Address, LayerIndex);
agemio 0:14f16771fe40 388 }
agemio 0:14f16771fe40 389
agemio 0:14f16771fe40 390 /**
agemio 0:14f16771fe40 391 * @brief Sets display window.
agemio 0:14f16771fe40 392 * @param LayerIndex: Layer index
agemio 0:14f16771fe40 393 * @param Xpos: LCD X position
agemio 0:14f16771fe40 394 * @param Ypos: LCD Y position
agemio 0:14f16771fe40 395 * @param Width: LCD window width
agemio 0:14f16771fe40 396 * @param Height: LCD window height
agemio 0:14f16771fe40 397 * @retval None
agemio 0:14f16771fe40 398 */
agemio 0:14f16771fe40 399 void BSP_LCD_SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
agemio 0:14f16771fe40 400 {
agemio 0:14f16771fe40 401 /* Reconfigure the layer size */
agemio 0:14f16771fe40 402 HAL_LTDC_SetWindowSize(&hLtdcHandler, Width, Height, LayerIndex);
agemio 0:14f16771fe40 403
agemio 0:14f16771fe40 404 /* Reconfigure the layer position */
agemio 0:14f16771fe40 405 HAL_LTDC_SetWindowPosition(&hLtdcHandler, Xpos, Ypos, LayerIndex);
agemio 0:14f16771fe40 406 }
agemio 0:14f16771fe40 407
agemio 0:14f16771fe40 408 /**
agemio 0:14f16771fe40 409 * @brief Configures and sets the color keying.
agemio 0:14f16771fe40 410 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 411 * @param RGBValue: Color reference
agemio 0:14f16771fe40 412 * @retval None
agemio 0:14f16771fe40 413 */
agemio 0:14f16771fe40 414 void BSP_LCD_SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue)
agemio 0:14f16771fe40 415 {
agemio 0:14f16771fe40 416 /* Configure and Enable the color Keying for LCD Layer */
agemio 0:14f16771fe40 417 HAL_LTDC_ConfigColorKeying(&hLtdcHandler, RGBValue, LayerIndex);
agemio 0:14f16771fe40 418 HAL_LTDC_EnableColorKeying(&hLtdcHandler, LayerIndex);
agemio 0:14f16771fe40 419 }
agemio 0:14f16771fe40 420
agemio 0:14f16771fe40 421 /**
agemio 0:14f16771fe40 422 * @brief Disables the color keying.
agemio 0:14f16771fe40 423 * @param LayerIndex: Layer foreground or background
agemio 0:14f16771fe40 424 * @retval None
agemio 0:14f16771fe40 425 */
agemio 0:14f16771fe40 426 void BSP_LCD_ResetColorKeying(uint32_t LayerIndex)
agemio 0:14f16771fe40 427 {
agemio 0:14f16771fe40 428 /* Disable the color Keying for LCD Layer */
agemio 0:14f16771fe40 429 HAL_LTDC_DisableColorKeying(&hLtdcHandler, LayerIndex);
agemio 0:14f16771fe40 430 }
agemio 0:14f16771fe40 431
agemio 0:14f16771fe40 432 /**
agemio 0:14f16771fe40 433 * @brief Sets the LCD text color.
agemio 0:14f16771fe40 434 * @param Color: Text color code ARGB(8-8-8-8)
agemio 0:14f16771fe40 435 * @retval None
agemio 0:14f16771fe40 436 */
agemio 0:14f16771fe40 437 void BSP_LCD_SetTextColor(uint32_t Color)
agemio 0:14f16771fe40 438 {
agemio 0:14f16771fe40 439 DrawProp[ActiveLayer].TextColor = Color;
agemio 0:14f16771fe40 440 }
agemio 0:14f16771fe40 441
agemio 0:14f16771fe40 442 /**
agemio 0:14f16771fe40 443 * @brief Gets the LCD text color.
agemio 0:14f16771fe40 444 * @retval Used text color.
agemio 0:14f16771fe40 445 */
agemio 0:14f16771fe40 446 uint32_t BSP_LCD_GetTextColor(void)
agemio 0:14f16771fe40 447 {
agemio 0:14f16771fe40 448 return DrawProp[ActiveLayer].TextColor;
agemio 0:14f16771fe40 449 }
agemio 0:14f16771fe40 450
agemio 0:14f16771fe40 451 /**
agemio 0:14f16771fe40 452 * @brief Sets the LCD background color.
agemio 0:14f16771fe40 453 * @param Color: Layer background color code ARGB(8-8-8-8)
agemio 0:14f16771fe40 454 * @retval None
agemio 0:14f16771fe40 455 */
agemio 0:14f16771fe40 456 void BSP_LCD_SetBackColor(uint32_t Color)
agemio 0:14f16771fe40 457 {
agemio 0:14f16771fe40 458 DrawProp[ActiveLayer].BackColor = Color;
agemio 0:14f16771fe40 459 }
agemio 0:14f16771fe40 460
agemio 0:14f16771fe40 461 /**
agemio 0:14f16771fe40 462 * @brief Gets the LCD background color.
agemio 0:14f16771fe40 463 * @retval Used background colour
agemio 0:14f16771fe40 464 */
agemio 0:14f16771fe40 465 uint32_t BSP_LCD_GetBackColor(void)
agemio 0:14f16771fe40 466 {
agemio 0:14f16771fe40 467 return DrawProp[ActiveLayer].BackColor;
agemio 0:14f16771fe40 468 }
agemio 0:14f16771fe40 469
agemio 0:14f16771fe40 470 /**
agemio 0:14f16771fe40 471 * @brief Sets the LCD text font.
agemio 0:14f16771fe40 472 * @param fonts: Layer font to be used
agemio 0:14f16771fe40 473 * @retval None
agemio 0:14f16771fe40 474 */
agemio 0:14f16771fe40 475 void BSP_LCD_SetFont(sFONT *fonts)
agemio 0:14f16771fe40 476 {
agemio 0:14f16771fe40 477 DrawProp[ActiveLayer].pFont = fonts;
agemio 0:14f16771fe40 478 }
agemio 0:14f16771fe40 479
agemio 0:14f16771fe40 480 /**
agemio 0:14f16771fe40 481 * @brief Gets the LCD text font.
agemio 0:14f16771fe40 482 * @retval Used layer font
agemio 0:14f16771fe40 483 */
agemio 0:14f16771fe40 484 sFONT *BSP_LCD_GetFont(void)
agemio 0:14f16771fe40 485 {
agemio 0:14f16771fe40 486 return DrawProp[ActiveLayer].pFont;
agemio 0:14f16771fe40 487 }
agemio 0:14f16771fe40 488
agemio 0:14f16771fe40 489 /**
agemio 0:14f16771fe40 490 * @brief Reads an LCD pixel.
agemio 0:14f16771fe40 491 * @param Xpos: X position
agemio 0:14f16771fe40 492 * @param Ypos: Y position
agemio 0:14f16771fe40 493 * @retval RGB pixel color
agemio 0:14f16771fe40 494 */
agemio 0:14f16771fe40 495 uint32_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos)
agemio 0:14f16771fe40 496 {
agemio 0:14f16771fe40 497 uint32_t ret = 0;
agemio 0:14f16771fe40 498
agemio 0:14f16771fe40 499 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
agemio 0:14f16771fe40 500 {
agemio 0:14f16771fe40 501 /* Read data value from SDRAM memory */
agemio 0:14f16771fe40 502 ret = *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
agemio 0:14f16771fe40 503 }
agemio 0:14f16771fe40 504 else if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
agemio 0:14f16771fe40 505 {
agemio 0:14f16771fe40 506 /* Read data value from SDRAM memory */
agemio 0:14f16771fe40 507 ret = (*(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))) & 0x00FFFFFF);
agemio 0:14f16771fe40 508 }
agemio 0:14f16771fe40 509 else if((hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
agemio 0:14f16771fe40 510 (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
agemio 0:14f16771fe40 511 (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
agemio 0:14f16771fe40 512 {
agemio 0:14f16771fe40 513 /* Read data value from SDRAM memory */
agemio 0:14f16771fe40 514 ret = *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
agemio 0:14f16771fe40 515 }
agemio 0:14f16771fe40 516 else
agemio 0:14f16771fe40 517 {
agemio 0:14f16771fe40 518 /* Read data value from SDRAM memory */
agemio 0:14f16771fe40 519 ret = *(__IO uint8_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
agemio 0:14f16771fe40 520 }
agemio 0:14f16771fe40 521
agemio 0:14f16771fe40 522 return ret;
agemio 0:14f16771fe40 523 }
agemio 0:14f16771fe40 524
agemio 0:14f16771fe40 525 /**
agemio 0:14f16771fe40 526 * @brief Clears the hole LCD.
agemio 0:14f16771fe40 527 * @param Color: Color of the background
agemio 0:14f16771fe40 528 * @retval None
agemio 0:14f16771fe40 529 */
agemio 0:14f16771fe40 530 void BSP_LCD_Clear(uint32_t Color)
agemio 0:14f16771fe40 531 {
agemio 0:14f16771fe40 532 /* Clear the LCD */
agemio 0:14f16771fe40 533 LL_FillBuffer(ActiveLayer, (uint32_t *)(hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress), BSP_LCD_GetXSize(), BSP_LCD_GetYSize(), 0, Color);
agemio 0:14f16771fe40 534 }
agemio 0:14f16771fe40 535
agemio 0:14f16771fe40 536 /**
agemio 0:14f16771fe40 537 * @brief Clears the selected line.
agemio 0:14f16771fe40 538 * @param Line: Line to be cleared
agemio 0:14f16771fe40 539 * @retval None
agemio 0:14f16771fe40 540 */
agemio 0:14f16771fe40 541 void BSP_LCD_ClearStringLine(uint32_t Line)
agemio 0:14f16771fe40 542 {
agemio 0:14f16771fe40 543 uint32_t color_backup = DrawProp[ActiveLayer].TextColor;
agemio 0:14f16771fe40 544 DrawProp[ActiveLayer].TextColor = DrawProp[ActiveLayer].BackColor;
agemio 0:14f16771fe40 545
agemio 0:14f16771fe40 546 /* Draw rectangle with background color */
agemio 0:14f16771fe40 547 BSP_LCD_FillRect(0, (Line * DrawProp[ActiveLayer].pFont->Height), BSP_LCD_GetXSize(), DrawProp[ActiveLayer].pFont->Height);
agemio 0:14f16771fe40 548
agemio 0:14f16771fe40 549 DrawProp[ActiveLayer].TextColor = color_backup;
agemio 0:14f16771fe40 550 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 551 }
agemio 0:14f16771fe40 552
agemio 0:14f16771fe40 553 /**
agemio 0:14f16771fe40 554 * @brief Displays one character.
agemio 0:14f16771fe40 555 * @param Xpos: Start column address
agemio 0:14f16771fe40 556 * @param Ypos: Line where to display the character shape.
agemio 0:14f16771fe40 557 * @param Ascii: Character ascii code
agemio 0:14f16771fe40 558 * This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
agemio 0:14f16771fe40 559 * @retval None
agemio 0:14f16771fe40 560 */
agemio 0:14f16771fe40 561 void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii)
agemio 0:14f16771fe40 562 {
agemio 0:14f16771fe40 563 DrawChar(Xpos, Ypos, &DrawProp[ActiveLayer].pFont->table[(Ascii-' ') *\
agemio 0:14f16771fe40 564 DrawProp[ActiveLayer].pFont->Height * ((DrawProp[ActiveLayer].pFont->Width + 7) / 8)]);
agemio 0:14f16771fe40 565 }
agemio 0:14f16771fe40 566
agemio 0:14f16771fe40 567 /**
agemio 0:14f16771fe40 568 * @brief Displays characters on the LCD.
agemio 0:14f16771fe40 569 * @param Xpos: X position (in pixel)
agemio 0:14f16771fe40 570 * @param Ypos: Y position (in pixel)
agemio 0:14f16771fe40 571 * @param Text: Pointer to string to display on LCD
agemio 0:14f16771fe40 572 * @param Mode: Display mode
agemio 0:14f16771fe40 573 * This parameter can be one of the following values:
agemio 0:14f16771fe40 574 * @arg CENTER_MODE
agemio 0:14f16771fe40 575 * @arg RIGHT_MODE
agemio 0:14f16771fe40 576 * @arg LEFT_MODE
agemio 0:14f16771fe40 577 * @retval None
agemio 0:14f16771fe40 578 */
agemio 0:14f16771fe40 579 void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode)
agemio 0:14f16771fe40 580 {
agemio 0:14f16771fe40 581 uint16_t ref_column = 1, i = 0;
agemio 0:14f16771fe40 582 uint32_t size = 0, xsize = 0;
agemio 0:14f16771fe40 583 uint8_t *ptr = Text;
agemio 0:14f16771fe40 584
agemio 0:14f16771fe40 585 /* Get the text size */
agemio 0:14f16771fe40 586 while (*ptr++) size ++ ;
agemio 0:14f16771fe40 587
agemio 0:14f16771fe40 588 /* Characters number per line */
agemio 0:14f16771fe40 589 xsize = (BSP_LCD_GetXSize()/DrawProp[ActiveLayer].pFont->Width);
agemio 0:14f16771fe40 590
agemio 0:14f16771fe40 591 switch (Mode)
agemio 0:14f16771fe40 592 {
agemio 0:14f16771fe40 593 case CENTER_MODE:
agemio 0:14f16771fe40 594 {
agemio 0:14f16771fe40 595 ref_column = Xpos + ((xsize - size)* DrawProp[ActiveLayer].pFont->Width) / 2;
agemio 0:14f16771fe40 596 break;
agemio 0:14f16771fe40 597 }
agemio 0:14f16771fe40 598 case LEFT_MODE:
agemio 0:14f16771fe40 599 {
agemio 0:14f16771fe40 600 ref_column = Xpos;
agemio 0:14f16771fe40 601 break;
agemio 0:14f16771fe40 602 }
agemio 0:14f16771fe40 603 case RIGHT_MODE:
agemio 0:14f16771fe40 604 {
agemio 0:14f16771fe40 605 ref_column = - Xpos + ((xsize - size)*DrawProp[ActiveLayer].pFont->Width);
agemio 0:14f16771fe40 606 break;
agemio 0:14f16771fe40 607 }
agemio 0:14f16771fe40 608 default:
agemio 0:14f16771fe40 609 {
agemio 0:14f16771fe40 610 ref_column = Xpos;
agemio 0:14f16771fe40 611 break;
agemio 0:14f16771fe40 612 }
agemio 0:14f16771fe40 613 }
agemio 0:14f16771fe40 614
agemio 0:14f16771fe40 615 /* Check that the Start column is located in the screen */
agemio 0:14f16771fe40 616 if ((ref_column < 1) || (ref_column >= 0x8000))
agemio 0:14f16771fe40 617 {
agemio 0:14f16771fe40 618 ref_column = 1;
agemio 0:14f16771fe40 619 }
agemio 0:14f16771fe40 620
agemio 0:14f16771fe40 621 /* Send the string character by character on LCD */
agemio 0:14f16771fe40 622 while ((*Text != 0) & (((BSP_LCD_GetXSize() - (i*DrawProp[ActiveLayer].pFont->Width)) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width))
agemio 0:14f16771fe40 623 {
agemio 0:14f16771fe40 624 /* Display one character on LCD */
agemio 0:14f16771fe40 625 BSP_LCD_DisplayChar(ref_column, Ypos, *Text);
agemio 0:14f16771fe40 626 /* Decrement the column position by 16 */
agemio 0:14f16771fe40 627 ref_column += DrawProp[ActiveLayer].pFont->Width;
agemio 0:14f16771fe40 628 /* Point on the next character */
agemio 0:14f16771fe40 629 Text++;
agemio 0:14f16771fe40 630 i++;
agemio 0:14f16771fe40 631 }
agemio 0:14f16771fe40 632 }
agemio 0:14f16771fe40 633
agemio 0:14f16771fe40 634 /**
agemio 0:14f16771fe40 635 * @brief Displays a maximum of 60 characters on the LCD.
agemio 0:14f16771fe40 636 * @param Line: Line where to display the character shape
agemio 0:14f16771fe40 637 * @param ptr: Pointer to string to display on LCD
agemio 0:14f16771fe40 638 * @retval None
agemio 0:14f16771fe40 639 */
agemio 0:14f16771fe40 640 void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr)
agemio 0:14f16771fe40 641 {
agemio 0:14f16771fe40 642 BSP_LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE);
agemio 0:14f16771fe40 643 }
agemio 0:14f16771fe40 644
agemio 0:14f16771fe40 645 /**
agemio 0:14f16771fe40 646 * @brief Draws an horizontal line.
agemio 0:14f16771fe40 647 * @param Xpos: X position
agemio 0:14f16771fe40 648 * @param Ypos: Y position
agemio 0:14f16771fe40 649 * @param Length: Line length
agemio 0:14f16771fe40 650 * @retval None
agemio 0:14f16771fe40 651 */
agemio 0:14f16771fe40 652 void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
agemio 0:14f16771fe40 653 {
agemio 0:14f16771fe40 654 uint32_t Xaddress = 0;
agemio 0:14f16771fe40 655
agemio 0:14f16771fe40 656 /* Get the line address */
agemio 0:14f16771fe40 657 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
agemio 0:14f16771fe40 658 { /* RGB565 format */
agemio 0:14f16771fe40 659 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 660 }
agemio 0:14f16771fe40 661 else
agemio 0:14f16771fe40 662 { /* ARGB8888 format */
agemio 0:14f16771fe40 663 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 664 }
agemio 0:14f16771fe40 665
agemio 0:14f16771fe40 666 /* Write line */
agemio 0:14f16771fe40 667 LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, Length, 1, 0, DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 668 }
agemio 0:14f16771fe40 669
agemio 0:14f16771fe40 670 /**
agemio 0:14f16771fe40 671 * @brief Draws a vertical line.
agemio 0:14f16771fe40 672 * @param Xpos: X position
agemio 0:14f16771fe40 673 * @param Ypos: Y position
agemio 0:14f16771fe40 674 * @param Length: Line length
agemio 0:14f16771fe40 675 * @retval None
agemio 0:14f16771fe40 676 */
agemio 0:14f16771fe40 677 void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
agemio 0:14f16771fe40 678 {
agemio 0:14f16771fe40 679 uint32_t Xaddress = 0;
agemio 0:14f16771fe40 680
agemio 0:14f16771fe40 681 /* Get the line address */
agemio 0:14f16771fe40 682 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
agemio 0:14f16771fe40 683 { /* RGB565 format */
agemio 0:14f16771fe40 684 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 685 }
agemio 0:14f16771fe40 686 else
agemio 0:14f16771fe40 687 { /* ARGB8888 format */
agemio 0:14f16771fe40 688 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 689 }
agemio 0:14f16771fe40 690
agemio 0:14f16771fe40 691 /* Write line */
agemio 0:14f16771fe40 692 LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, 1, Length, (BSP_LCD_GetXSize() - 1), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 693 }
agemio 0:14f16771fe40 694
agemio 0:14f16771fe40 695 /**
agemio 0:14f16771fe40 696 * @brief Draws an uni-line (between two points).
agemio 0:14f16771fe40 697 * @param x1: Point 1 X position
agemio 0:14f16771fe40 698 * @param y1: Point 1 Y position
agemio 0:14f16771fe40 699 * @param x2: Point 2 X position
agemio 0:14f16771fe40 700 * @param y2: Point 2 Y position
agemio 0:14f16771fe40 701 * @retval None
agemio 0:14f16771fe40 702 */
agemio 0:14f16771fe40 703 void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
agemio 0:14f16771fe40 704 {
agemio 0:14f16771fe40 705 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
agemio 0:14f16771fe40 706 yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
agemio 0:14f16771fe40 707 curpixel = 0;
agemio 0:14f16771fe40 708
agemio 0:14f16771fe40 709 deltax = ABS(x2 - x1); /* The difference between the x's */
agemio 0:14f16771fe40 710 deltay = ABS(y2 - y1); /* The difference between the y's */
agemio 0:14f16771fe40 711 x = x1; /* Start x off at the first pixel */
agemio 0:14f16771fe40 712 y = y1; /* Start y off at the first pixel */
agemio 0:14f16771fe40 713
agemio 0:14f16771fe40 714 if (x2 >= x1) /* The x-values are increasing */
agemio 0:14f16771fe40 715 {
agemio 0:14f16771fe40 716 xinc1 = 1;
agemio 0:14f16771fe40 717 xinc2 = 1;
agemio 0:14f16771fe40 718 }
agemio 0:14f16771fe40 719 else /* The x-values are decreasing */
agemio 0:14f16771fe40 720 {
agemio 0:14f16771fe40 721 xinc1 = -1;
agemio 0:14f16771fe40 722 xinc2 = -1;
agemio 0:14f16771fe40 723 }
agemio 0:14f16771fe40 724
agemio 0:14f16771fe40 725 if (y2 >= y1) /* The y-values are increasing */
agemio 0:14f16771fe40 726 {
agemio 0:14f16771fe40 727 yinc1 = 1;
agemio 0:14f16771fe40 728 yinc2 = 1;
agemio 0:14f16771fe40 729 }
agemio 0:14f16771fe40 730 else /* The y-values are decreasing */
agemio 0:14f16771fe40 731 {
agemio 0:14f16771fe40 732 yinc1 = -1;
agemio 0:14f16771fe40 733 yinc2 = -1;
agemio 0:14f16771fe40 734 }
agemio 0:14f16771fe40 735
agemio 0:14f16771fe40 736 if (deltax >= deltay) /* There is at least one x-value for every y-value */
agemio 0:14f16771fe40 737 {
agemio 0:14f16771fe40 738 xinc1 = 0; /* Don't change the x when numerator >= denominator */
agemio 0:14f16771fe40 739 yinc2 = 0; /* Don't change the y for every iteration */
agemio 0:14f16771fe40 740 den = deltax;
agemio 0:14f16771fe40 741 num = deltax / 2;
agemio 0:14f16771fe40 742 num_add = deltay;
agemio 0:14f16771fe40 743 num_pixels = deltax; /* There are more x-values than y-values */
agemio 0:14f16771fe40 744 }
agemio 0:14f16771fe40 745 else /* There is at least one y-value for every x-value */
agemio 0:14f16771fe40 746 {
agemio 0:14f16771fe40 747 xinc2 = 0; /* Don't change the x for every iteration */
agemio 0:14f16771fe40 748 yinc1 = 0; /* Don't change the y when numerator >= denominator */
agemio 0:14f16771fe40 749 den = deltay;
agemio 0:14f16771fe40 750 num = deltay / 2;
agemio 0:14f16771fe40 751 num_add = deltax;
agemio 0:14f16771fe40 752 num_pixels = deltay; /* There are more y-values than x-values */
agemio 0:14f16771fe40 753 }
agemio 0:14f16771fe40 754
agemio 0:14f16771fe40 755 for (curpixel = 0; curpixel <= num_pixels; curpixel++)
agemio 0:14f16771fe40 756 {
agemio 0:14f16771fe40 757 BSP_LCD_DrawPixel(x, y, DrawProp[ActiveLayer].TextColor); /* Draw the current pixel */
agemio 0:14f16771fe40 758 num += num_add; /* Increase the numerator by the top of the fraction */
agemio 0:14f16771fe40 759 if (num >= den) /* Check if numerator >= denominator */
agemio 0:14f16771fe40 760 {
agemio 0:14f16771fe40 761 num -= den; /* Calculate the new numerator value */
agemio 0:14f16771fe40 762 x += xinc1; /* Change the x as appropriate */
agemio 0:14f16771fe40 763 y += yinc1; /* Change the y as appropriate */
agemio 0:14f16771fe40 764 }
agemio 0:14f16771fe40 765 x += xinc2; /* Change the x as appropriate */
agemio 0:14f16771fe40 766 y += yinc2; /* Change the y as appropriate */
agemio 0:14f16771fe40 767 }
agemio 0:14f16771fe40 768 }
agemio 0:14f16771fe40 769
agemio 0:14f16771fe40 770 /**
agemio 0:14f16771fe40 771 * @brief Draws a rectangle.
agemio 0:14f16771fe40 772 * @param Xpos: X position
agemio 0:14f16771fe40 773 * @param Ypos: Y position
agemio 0:14f16771fe40 774 * @param Width: Rectangle width
agemio 0:14f16771fe40 775 * @param Height: Rectangle height
agemio 0:14f16771fe40 776 * @retval None
agemio 0:14f16771fe40 777 */
agemio 0:14f16771fe40 778 void BSP_LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
agemio 0:14f16771fe40 779 {
agemio 0:14f16771fe40 780 /* Draw horizontal lines */
agemio 0:14f16771fe40 781 BSP_LCD_DrawHLine(Xpos, Ypos, Width);
agemio 0:14f16771fe40 782 BSP_LCD_DrawHLine(Xpos, (Ypos+ Height), Width);
agemio 0:14f16771fe40 783
agemio 0:14f16771fe40 784 /* Draw vertical lines */
agemio 0:14f16771fe40 785 BSP_LCD_DrawVLine(Xpos, Ypos, Height);
agemio 0:14f16771fe40 786 BSP_LCD_DrawVLine((Xpos + Width), Ypos, Height);
agemio 0:14f16771fe40 787 }
agemio 0:14f16771fe40 788
agemio 0:14f16771fe40 789 /**
agemio 0:14f16771fe40 790 * @brief Draws a circle.
agemio 0:14f16771fe40 791 * @param Xpos: X position
agemio 0:14f16771fe40 792 * @param Ypos: Y position
agemio 0:14f16771fe40 793 * @param Radius: Circle radius
agemio 0:14f16771fe40 794 * @retval None
agemio 0:14f16771fe40 795 */
agemio 0:14f16771fe40 796 void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
agemio 0:14f16771fe40 797 {
agemio 0:14f16771fe40 798 int32_t decision; /* Decision Variable */
agemio 0:14f16771fe40 799 uint32_t current_x; /* Current X Value */
agemio 0:14f16771fe40 800 uint32_t current_y; /* Current Y Value */
agemio 0:14f16771fe40 801
agemio 0:14f16771fe40 802 decision = 3 - (Radius << 1);
agemio 0:14f16771fe40 803 current_x = 0;
agemio 0:14f16771fe40 804 current_y = Radius;
agemio 0:14f16771fe40 805
agemio 0:14f16771fe40 806 while (current_x <= current_y)
agemio 0:14f16771fe40 807 {
agemio 0:14f16771fe40 808 BSP_LCD_DrawPixel((Xpos + current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 809
agemio 0:14f16771fe40 810 BSP_LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 811
agemio 0:14f16771fe40 812 BSP_LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 813
agemio 0:14f16771fe40 814 BSP_LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 815
agemio 0:14f16771fe40 816 BSP_LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 817
agemio 0:14f16771fe40 818 BSP_LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 819
agemio 0:14f16771fe40 820 BSP_LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 821
agemio 0:14f16771fe40 822 BSP_LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 823
agemio 0:14f16771fe40 824 if (decision < 0)
agemio 0:14f16771fe40 825 {
agemio 0:14f16771fe40 826 decision += (current_x << 2) + 6;
agemio 0:14f16771fe40 827 }
agemio 0:14f16771fe40 828 else
agemio 0:14f16771fe40 829 {
agemio 0:14f16771fe40 830 decision += ((current_x - current_y) << 2) + 10;
agemio 0:14f16771fe40 831 current_y--;
agemio 0:14f16771fe40 832 }
agemio 0:14f16771fe40 833 current_x++;
agemio 0:14f16771fe40 834 }
agemio 0:14f16771fe40 835 }
agemio 0:14f16771fe40 836
agemio 0:14f16771fe40 837 /**
agemio 0:14f16771fe40 838 * @brief Draws an poly-line (between many points).
agemio 0:14f16771fe40 839 * @param Points: Pointer to the points array
agemio 0:14f16771fe40 840 * @param PointCount: Number of points
agemio 0:14f16771fe40 841 * @retval None
agemio 0:14f16771fe40 842 */
agemio 0:14f16771fe40 843 void BSP_LCD_DrawPolygon(pPoint Points, uint16_t PointCount)
agemio 0:14f16771fe40 844 {
agemio 0:14f16771fe40 845 int16_t x = 0, y = 0;
agemio 0:14f16771fe40 846
agemio 0:14f16771fe40 847 if(PointCount < 2)
agemio 0:14f16771fe40 848 {
agemio 0:14f16771fe40 849 return;
agemio 0:14f16771fe40 850 }
agemio 0:14f16771fe40 851
agemio 0:14f16771fe40 852 BSP_LCD_DrawLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);
agemio 0:14f16771fe40 853
agemio 0:14f16771fe40 854 while(--PointCount)
agemio 0:14f16771fe40 855 {
agemio 0:14f16771fe40 856 x = Points->X;
agemio 0:14f16771fe40 857 y = Points->Y;
agemio 0:14f16771fe40 858 Points++;
agemio 0:14f16771fe40 859 BSP_LCD_DrawLine(x, y, Points->X, Points->Y);
agemio 0:14f16771fe40 860 }
agemio 0:14f16771fe40 861 }
agemio 0:14f16771fe40 862
agemio 0:14f16771fe40 863 /**
agemio 0:14f16771fe40 864 * @brief Draws an ellipse on LCD.
agemio 0:14f16771fe40 865 * @param Xpos: X position
agemio 0:14f16771fe40 866 * @param Ypos: Y position
agemio 0:14f16771fe40 867 * @param XRadius: Ellipse X radius
agemio 0:14f16771fe40 868 * @param YRadius: Ellipse Y radius
agemio 0:14f16771fe40 869 * @retval None
agemio 0:14f16771fe40 870 */
agemio 0:14f16771fe40 871 void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
agemio 0:14f16771fe40 872 {
agemio 0:14f16771fe40 873 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
agemio 0:14f16771fe40 874 float k = 0, rad1 = 0, rad2 = 0;
agemio 0:14f16771fe40 875
agemio 0:14f16771fe40 876 rad1 = XRadius;
agemio 0:14f16771fe40 877 rad2 = YRadius;
agemio 0:14f16771fe40 878
agemio 0:14f16771fe40 879 k = (float)(rad2/rad1);
agemio 0:14f16771fe40 880
agemio 0:14f16771fe40 881 do {
agemio 0:14f16771fe40 882 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 883 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 884 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 885 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 886
agemio 0:14f16771fe40 887 e2 = err;
agemio 0:14f16771fe40 888 if (e2 <= x) {
agemio 0:14f16771fe40 889 err += ++x*2+1;
agemio 0:14f16771fe40 890 if (-y == x && e2 <= y) e2 = 0;
agemio 0:14f16771fe40 891 }
agemio 0:14f16771fe40 892 if (e2 > y) err += ++y*2+1;
agemio 0:14f16771fe40 893 }
agemio 0:14f16771fe40 894 while (y <= 0);
agemio 0:14f16771fe40 895 }
agemio 0:14f16771fe40 896
agemio 0:14f16771fe40 897 /**
agemio 0:14f16771fe40 898 * @brief Draws a pixel on LCD.
agemio 0:14f16771fe40 899 * @param Xpos: X position
agemio 0:14f16771fe40 900 * @param Ypos: Y position
agemio 0:14f16771fe40 901 * @param RGB_Code: Pixel color in ARGB mode (8-8-8-8)
agemio 0:14f16771fe40 902 * @retval None
agemio 0:14f16771fe40 903 */
agemio 0:14f16771fe40 904 void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code)
agemio 0:14f16771fe40 905 {
agemio 0:14f16771fe40 906 /* Write data value to all SDRAM memory */
agemio 0:14f16771fe40 907 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
agemio 0:14f16771fe40 908 { /* RGB565 format */
agemio 0:14f16771fe40 909 *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
agemio 0:14f16771fe40 910 }
agemio 0:14f16771fe40 911 else
agemio 0:14f16771fe40 912 { /* ARGB8888 format */
agemio 0:14f16771fe40 913 *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))) = RGB_Code;
agemio 0:14f16771fe40 914 }
agemio 0:14f16771fe40 915 }
agemio 0:14f16771fe40 916
agemio 0:14f16771fe40 917 /**
agemio 0:14f16771fe40 918 * @brief Draws a bitmap picture loaded in the internal Flash in ARGB888 format (32 bits per pixel).
agemio 0:14f16771fe40 919 * @param Xpos: Bmp X position in the LCD
agemio 0:14f16771fe40 920 * @param Ypos: Bmp Y position in the LCD
agemio 0:14f16771fe40 921 * @param pbmp: Pointer to Bmp picture address in the internal Flash
agemio 0:14f16771fe40 922 * @retval None
agemio 0:14f16771fe40 923 */
agemio 0:14f16771fe40 924 void BSP_LCD_DrawBitmap(uint32_t Xpos, uint32_t Ypos, uint8_t *pbmp)
agemio 0:14f16771fe40 925 {
agemio 0:14f16771fe40 926 uint32_t index = 0, width = 0, height = 0, bit_pixel = 0;
agemio 0:14f16771fe40 927 uint32_t address;
agemio 0:14f16771fe40 928 uint32_t input_color_mode = 0;
agemio 0:14f16771fe40 929
agemio 0:14f16771fe40 930 /* Get bitmap data address offset */
agemio 0:14f16771fe40 931 index = *(__IO uint16_t *) (pbmp + 10);
agemio 0:14f16771fe40 932 index |= (*(__IO uint16_t *) (pbmp + 12)) << 16;
agemio 0:14f16771fe40 933
agemio 0:14f16771fe40 934 /* Read bitmap width */
agemio 0:14f16771fe40 935 width = *(uint16_t *) (pbmp + 18);
agemio 0:14f16771fe40 936 width |= (*(uint16_t *) (pbmp + 20)) << 16;
agemio 0:14f16771fe40 937
agemio 0:14f16771fe40 938 /* Read bitmap height */
agemio 0:14f16771fe40 939 height = *(uint16_t *) (pbmp + 22);
agemio 0:14f16771fe40 940 height |= (*(uint16_t *) (pbmp + 24)) << 16;
agemio 0:14f16771fe40 941
agemio 0:14f16771fe40 942 /* Read bit/pixel */
agemio 0:14f16771fe40 943 bit_pixel = *(uint16_t *) (pbmp + 28);
agemio 0:14f16771fe40 944
agemio 0:14f16771fe40 945 /* Set the address */
agemio 0:14f16771fe40 946 address = hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Ypos) + Xpos)*(4));
agemio 0:14f16771fe40 947
agemio 0:14f16771fe40 948 /* Get the layer pixel format */
agemio 0:14f16771fe40 949 if ((bit_pixel/8) == 4)
agemio 0:14f16771fe40 950 {
agemio 0:14f16771fe40 951 input_color_mode = CM_ARGB8888;
agemio 0:14f16771fe40 952 }
agemio 0:14f16771fe40 953 else if ((bit_pixel/8) == 2)
agemio 0:14f16771fe40 954 {
agemio 0:14f16771fe40 955 input_color_mode = CM_RGB565;
agemio 0:14f16771fe40 956 }
agemio 0:14f16771fe40 957 else
agemio 0:14f16771fe40 958 {
agemio 0:14f16771fe40 959 input_color_mode = CM_RGB888;
agemio 0:14f16771fe40 960 }
agemio 0:14f16771fe40 961
agemio 0:14f16771fe40 962 /* Bypass the bitmap header */
agemio 0:14f16771fe40 963 pbmp += (index + (width * (height - 1) * (bit_pixel/8)));
agemio 0:14f16771fe40 964
agemio 0:14f16771fe40 965 /* Convert picture to ARGB8888 pixel format */
agemio 0:14f16771fe40 966 for(index=0; index < height; index++)
agemio 0:14f16771fe40 967 {
agemio 0:14f16771fe40 968 /* Pixel format conversion */
agemio 0:14f16771fe40 969 LL_ConvertLineToARGB8888((uint32_t *)pbmp, (uint32_t *)address, width, input_color_mode);
agemio 0:14f16771fe40 970
agemio 0:14f16771fe40 971 /* Increment the source and destination buffers */
agemio 0:14f16771fe40 972 address+= (BSP_LCD_GetXSize()*4);
agemio 0:14f16771fe40 973 pbmp -= width*(bit_pixel/8);
agemio 0:14f16771fe40 974 }
agemio 0:14f16771fe40 975 }
agemio 0:14f16771fe40 976
agemio 0:14f16771fe40 977 /**
agemio 0:14f16771fe40 978 * @brief Draws a full rectangle.
agemio 0:14f16771fe40 979 * @param Xpos: X position
agemio 0:14f16771fe40 980 * @param Ypos: Y position
agemio 0:14f16771fe40 981 * @param Width: Rectangle width
agemio 0:14f16771fe40 982 * @param Height: Rectangle height
agemio 0:14f16771fe40 983 * @retval None
agemio 0:14f16771fe40 984 */
agemio 0:14f16771fe40 985 void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
agemio 0:14f16771fe40 986 {
agemio 0:14f16771fe40 987 uint32_t x_address = 0;
agemio 0:14f16771fe40 988
agemio 0:14f16771fe40 989 /* Set the text color */
agemio 0:14f16771fe40 990 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 991
agemio 0:14f16771fe40 992 /* Get the rectangle start address */
agemio 0:14f16771fe40 993 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
agemio 0:14f16771fe40 994 { /* RGB565 format */
agemio 0:14f16771fe40 995 x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 996 }
agemio 0:14f16771fe40 997 else
agemio 0:14f16771fe40 998 { /* ARGB8888 format */
agemio 0:14f16771fe40 999 x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
agemio 0:14f16771fe40 1000 }
agemio 0:14f16771fe40 1001 /* Fill the rectangle */
agemio 0:14f16771fe40 1002 LL_FillBuffer(ActiveLayer, (uint32_t *)x_address, Width, Height, (BSP_LCD_GetXSize() - Width), DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 1003 }
agemio 0:14f16771fe40 1004
agemio 0:14f16771fe40 1005 /**
agemio 0:14f16771fe40 1006 * @brief Draws a full circle.
agemio 0:14f16771fe40 1007 * @param Xpos: X position
agemio 0:14f16771fe40 1008 * @param Ypos: Y position
agemio 0:14f16771fe40 1009 * @param Radius: Circle radius
agemio 0:14f16771fe40 1010 * @retval None
agemio 0:14f16771fe40 1011 */
agemio 0:14f16771fe40 1012 void BSP_LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
agemio 0:14f16771fe40 1013 {
agemio 0:14f16771fe40 1014 int32_t decision; /* Decision Variable */
agemio 0:14f16771fe40 1015 uint32_t current_x; /* Current X Value */
agemio 0:14f16771fe40 1016 uint32_t current_y; /* Current Y Value */
agemio 0:14f16771fe40 1017
agemio 0:14f16771fe40 1018 decision = 3 - (Radius << 1);
agemio 0:14f16771fe40 1019
agemio 0:14f16771fe40 1020 current_x = 0;
agemio 0:14f16771fe40 1021 current_y = Radius;
agemio 0:14f16771fe40 1022
agemio 0:14f16771fe40 1023 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 1024
agemio 0:14f16771fe40 1025 while (current_x <= current_y)
agemio 0:14f16771fe40 1026 {
agemio 0:14f16771fe40 1027 if(current_y > 0)
agemio 0:14f16771fe40 1028 {
agemio 0:14f16771fe40 1029 BSP_LCD_DrawHLine(Xpos - current_y, Ypos + current_x, 2*current_y);
agemio 0:14f16771fe40 1030 BSP_LCD_DrawHLine(Xpos - current_y, Ypos - current_x, 2*current_y);
agemio 0:14f16771fe40 1031 }
agemio 0:14f16771fe40 1032
agemio 0:14f16771fe40 1033 if(current_x > 0)
agemio 0:14f16771fe40 1034 {
agemio 0:14f16771fe40 1035 BSP_LCD_DrawHLine(Xpos - current_x, Ypos - current_y, 2*current_x);
agemio 0:14f16771fe40 1036 BSP_LCD_DrawHLine(Xpos - current_x, Ypos + current_y, 2*current_x);
agemio 0:14f16771fe40 1037 }
agemio 0:14f16771fe40 1038 if (decision < 0)
agemio 0:14f16771fe40 1039 {
agemio 0:14f16771fe40 1040 decision += (current_x << 2) + 6;
agemio 0:14f16771fe40 1041 }
agemio 0:14f16771fe40 1042 else
agemio 0:14f16771fe40 1043 {
agemio 0:14f16771fe40 1044 decision += ((current_x - current_y) << 2) + 10;
agemio 0:14f16771fe40 1045 current_y--;
agemio 0:14f16771fe40 1046 }
agemio 0:14f16771fe40 1047 current_x++;
agemio 0:14f16771fe40 1048 }
agemio 0:14f16771fe40 1049
agemio 0:14f16771fe40 1050 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 1051 BSP_LCD_DrawCircle(Xpos, Ypos, Radius);
agemio 0:14f16771fe40 1052 }
agemio 0:14f16771fe40 1053
agemio 0:14f16771fe40 1054 /**
agemio 0:14f16771fe40 1055 * @brief Draws a full poly-line (between many points).
agemio 0:14f16771fe40 1056 * @param Points: Pointer to the points array
agemio 0:14f16771fe40 1057 * @param PointCount: Number of points
agemio 0:14f16771fe40 1058 * @retval None
agemio 0:14f16771fe40 1059 */
agemio 0:14f16771fe40 1060 void BSP_LCD_FillPolygon(pPoint Points, uint16_t PointCount)
agemio 0:14f16771fe40 1061 {
agemio 0:14f16771fe40 1062 int16_t X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0;
agemio 0:14f16771fe40 1063 uint16_t image_left = 0, image_right = 0, image_top = 0, image_bottom = 0;
agemio 0:14f16771fe40 1064
agemio 0:14f16771fe40 1065 image_left = image_right = Points->X;
agemio 0:14f16771fe40 1066 image_top= image_bottom = Points->Y;
agemio 0:14f16771fe40 1067
agemio 0:14f16771fe40 1068 for(counter = 1; counter < PointCount; counter++)
agemio 0:14f16771fe40 1069 {
agemio 0:14f16771fe40 1070 pixelX = POLY_X(counter);
agemio 0:14f16771fe40 1071 if(pixelX < image_left)
agemio 0:14f16771fe40 1072 {
agemio 0:14f16771fe40 1073 image_left = pixelX;
agemio 0:14f16771fe40 1074 }
agemio 0:14f16771fe40 1075 if(pixelX > image_right)
agemio 0:14f16771fe40 1076 {
agemio 0:14f16771fe40 1077 image_right = pixelX;
agemio 0:14f16771fe40 1078 }
agemio 0:14f16771fe40 1079
agemio 0:14f16771fe40 1080 pixelY = POLY_Y(counter);
agemio 0:14f16771fe40 1081 if(pixelY < image_top)
agemio 0:14f16771fe40 1082 {
agemio 0:14f16771fe40 1083 image_top = pixelY;
agemio 0:14f16771fe40 1084 }
agemio 0:14f16771fe40 1085 if(pixelY > image_bottom)
agemio 0:14f16771fe40 1086 {
agemio 0:14f16771fe40 1087 image_bottom = pixelY;
agemio 0:14f16771fe40 1088 }
agemio 0:14f16771fe40 1089 }
agemio 0:14f16771fe40 1090
agemio 0:14f16771fe40 1091 if(PointCount < 2)
agemio 0:14f16771fe40 1092 {
agemio 0:14f16771fe40 1093 return;
agemio 0:14f16771fe40 1094 }
agemio 0:14f16771fe40 1095
agemio 0:14f16771fe40 1096 X_center = (image_left + image_right)/2;
agemio 0:14f16771fe40 1097 Y_center = (image_bottom + image_top)/2;
agemio 0:14f16771fe40 1098
agemio 0:14f16771fe40 1099 X_first = Points->X;
agemio 0:14f16771fe40 1100 Y_first = Points->Y;
agemio 0:14f16771fe40 1101
agemio 0:14f16771fe40 1102 while(--PointCount)
agemio 0:14f16771fe40 1103 {
agemio 0:14f16771fe40 1104 X = Points->X;
agemio 0:14f16771fe40 1105 Y = Points->Y;
agemio 0:14f16771fe40 1106 Points++;
agemio 0:14f16771fe40 1107 X2 = Points->X;
agemio 0:14f16771fe40 1108 Y2 = Points->Y;
agemio 0:14f16771fe40 1109
agemio 0:14f16771fe40 1110 FillTriangle(X, X2, X_center, Y, Y2, Y_center);
agemio 0:14f16771fe40 1111 FillTriangle(X, X_center, X2, Y, Y_center, Y2);
agemio 0:14f16771fe40 1112 FillTriangle(X_center, X2, X, Y_center, Y2, Y);
agemio 0:14f16771fe40 1113 }
agemio 0:14f16771fe40 1114
agemio 0:14f16771fe40 1115 FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);
agemio 0:14f16771fe40 1116 FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);
agemio 0:14f16771fe40 1117 FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);
agemio 0:14f16771fe40 1118 }
agemio 0:14f16771fe40 1119
agemio 0:14f16771fe40 1120 /**
agemio 0:14f16771fe40 1121 * @brief Draws a full ellipse.
agemio 0:14f16771fe40 1122 * @param Xpos: X position
agemio 0:14f16771fe40 1123 * @param Ypos: Y position
agemio 0:14f16771fe40 1124 * @param XRadius: Ellipse X radius
agemio 0:14f16771fe40 1125 * @param YRadius: Ellipse Y radius
agemio 0:14f16771fe40 1126 * @retval None
agemio 0:14f16771fe40 1127 */
agemio 0:14f16771fe40 1128 void BSP_LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
agemio 0:14f16771fe40 1129 {
agemio 0:14f16771fe40 1130 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
agemio 0:14f16771fe40 1131 float k = 0, rad1 = 0, rad2 = 0;
agemio 0:14f16771fe40 1132
agemio 0:14f16771fe40 1133 rad1 = XRadius;
agemio 0:14f16771fe40 1134 rad2 = YRadius;
agemio 0:14f16771fe40 1135
agemio 0:14f16771fe40 1136 k = (float)(rad2/rad1);
agemio 0:14f16771fe40 1137
agemio 0:14f16771fe40 1138 do
agemio 0:14f16771fe40 1139 {
agemio 0:14f16771fe40 1140 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos+y), (2*(uint16_t)(x/k) + 1));
agemio 0:14f16771fe40 1141 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos-y), (2*(uint16_t)(x/k) + 1));
agemio 0:14f16771fe40 1142
agemio 0:14f16771fe40 1143 e2 = err;
agemio 0:14f16771fe40 1144 if (e2 <= x)
agemio 0:14f16771fe40 1145 {
agemio 0:14f16771fe40 1146 err += ++x*2+1;
agemio 0:14f16771fe40 1147 if (-y == x && e2 <= y) e2 = 0;
agemio 0:14f16771fe40 1148 }
agemio 0:14f16771fe40 1149 if (e2 > y) err += ++y*2+1;
agemio 0:14f16771fe40 1150 }
agemio 0:14f16771fe40 1151 while (y <= 0);
agemio 0:14f16771fe40 1152 }
agemio 0:14f16771fe40 1153
agemio 0:14f16771fe40 1154 /**
agemio 0:14f16771fe40 1155 * @brief Enables the display.
agemio 0:14f16771fe40 1156 * @retval None
agemio 0:14f16771fe40 1157 */
agemio 0:14f16771fe40 1158 void BSP_LCD_DisplayOn(void)
agemio 0:14f16771fe40 1159 {
agemio 0:14f16771fe40 1160 /* Display On */
agemio 0:14f16771fe40 1161 __HAL_LTDC_ENABLE(&hLtdcHandler);
agemio 0:14f16771fe40 1162 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); /* Assert LCD_DISP pin */
agemio 0:14f16771fe40 1163 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); /* Assert LCD_BL_CTRL pin */
agemio 0:14f16771fe40 1164 }
agemio 0:14f16771fe40 1165
agemio 0:14f16771fe40 1166 /**
agemio 0:14f16771fe40 1167 * @brief Disables the display.
agemio 0:14f16771fe40 1168 * @retval None
agemio 0:14f16771fe40 1169 */
agemio 0:14f16771fe40 1170 void BSP_LCD_DisplayOff(void)
agemio 0:14f16771fe40 1171 {
agemio 0:14f16771fe40 1172 /* Display Off */
agemio 0:14f16771fe40 1173 __HAL_LTDC_DISABLE(&hLtdcHandler);
agemio 0:14f16771fe40 1174 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_RESET); /* De-assert LCD_DISP pin */
agemio 0:14f16771fe40 1175 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_RESET);/* De-assert LCD_BL_CTRL pin */
agemio 0:14f16771fe40 1176 }
agemio 0:14f16771fe40 1177
agemio 0:14f16771fe40 1178 /**
agemio 0:14f16771fe40 1179 * @brief Initializes the LTDC MSP.
agemio 0:14f16771fe40 1180 * @param hltdc: LTDC handle
agemio 0:14f16771fe40 1181 * @param Params
agemio 0:14f16771fe40 1182 * @retval None
agemio 0:14f16771fe40 1183 */
agemio 0:14f16771fe40 1184 __weak void BSP_LCD_MspInit(LTDC_HandleTypeDef *hltdc, void *Params)
agemio 0:14f16771fe40 1185 {
agemio 0:14f16771fe40 1186 GPIO_InitTypeDef gpio_init_structure;
agemio 0:14f16771fe40 1187
agemio 0:14f16771fe40 1188 /* Enable the LTDC and DMA2D clocks */
agemio 0:14f16771fe40 1189 __HAL_RCC_LTDC_CLK_ENABLE();
agemio 0:14f16771fe40 1190 __HAL_RCC_DMA2D_CLK_ENABLE();
agemio 0:14f16771fe40 1191
agemio 0:14f16771fe40 1192 /* Enable GPIOs clock */
agemio 0:14f16771fe40 1193 __HAL_RCC_GPIOE_CLK_ENABLE();
agemio 0:14f16771fe40 1194 __HAL_RCC_GPIOG_CLK_ENABLE();
agemio 0:14f16771fe40 1195 __HAL_RCC_GPIOI_CLK_ENABLE();
agemio 0:14f16771fe40 1196 __HAL_RCC_GPIOJ_CLK_ENABLE();
agemio 0:14f16771fe40 1197 __HAL_RCC_GPIOK_CLK_ENABLE();
agemio 0:14f16771fe40 1198 LCD_DISP_GPIO_CLK_ENABLE();
agemio 0:14f16771fe40 1199 LCD_BL_CTRL_GPIO_CLK_ENABLE();
agemio 0:14f16771fe40 1200
agemio 0:14f16771fe40 1201 /*** LTDC Pins configuration ***/
agemio 0:14f16771fe40 1202 /* GPIOE configuration */
agemio 0:14f16771fe40 1203 gpio_init_structure.Pin = GPIO_PIN_4;
agemio 0:14f16771fe40 1204 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
agemio 0:14f16771fe40 1205 gpio_init_structure.Pull = GPIO_NOPULL;
agemio 0:14f16771fe40 1206 gpio_init_structure.Speed = GPIO_SPEED_FAST;
agemio 0:14f16771fe40 1207 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
agemio 0:14f16771fe40 1208 HAL_GPIO_Init(GPIOE, &gpio_init_structure);
agemio 0:14f16771fe40 1209
agemio 0:14f16771fe40 1210 /* GPIOG configuration */
agemio 0:14f16771fe40 1211 gpio_init_structure.Pin = GPIO_PIN_12;
agemio 0:14f16771fe40 1212 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
agemio 0:14f16771fe40 1213 gpio_init_structure.Alternate = GPIO_AF9_LTDC;
agemio 0:14f16771fe40 1214 HAL_GPIO_Init(GPIOG, &gpio_init_structure);
agemio 0:14f16771fe40 1215
agemio 0:14f16771fe40 1216 /* GPIOI LTDC alternate configuration */
agemio 0:14f16771fe40 1217 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | \
agemio 0:14f16771fe40 1218 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
agemio 0:14f16771fe40 1219 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
agemio 0:14f16771fe40 1220 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
agemio 0:14f16771fe40 1221 HAL_GPIO_Init(GPIOI, &gpio_init_structure);
agemio 0:14f16771fe40 1222
agemio 0:14f16771fe40 1223 /* GPIOJ configuration */
agemio 0:14f16771fe40 1224 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
agemio 0:14f16771fe40 1225 GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \
agemio 0:14f16771fe40 1226 GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \
agemio 0:14f16771fe40 1227 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
agemio 0:14f16771fe40 1228 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
agemio 0:14f16771fe40 1229 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
agemio 0:14f16771fe40 1230 HAL_GPIO_Init(GPIOJ, &gpio_init_structure);
agemio 0:14f16771fe40 1231
agemio 0:14f16771fe40 1232 /* GPIOK configuration */
agemio 0:14f16771fe40 1233 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \
agemio 0:14f16771fe40 1234 GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
agemio 0:14f16771fe40 1235 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
agemio 0:14f16771fe40 1236 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
agemio 0:14f16771fe40 1237 HAL_GPIO_Init(GPIOK, &gpio_init_structure);
agemio 0:14f16771fe40 1238
agemio 0:14f16771fe40 1239 /* LCD_DISP GPIO configuration */
agemio 0:14f16771fe40 1240 gpio_init_structure.Pin = LCD_DISP_PIN; /* LCD_DISP pin has to be manually controlled */
agemio 0:14f16771fe40 1241 gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
agemio 0:14f16771fe40 1242 HAL_GPIO_Init(LCD_DISP_GPIO_PORT, &gpio_init_structure);
agemio 0:14f16771fe40 1243
agemio 0:14f16771fe40 1244 /* LCD_BL_CTRL GPIO configuration */
agemio 0:14f16771fe40 1245 gpio_init_structure.Pin = LCD_BL_CTRL_PIN; /* LCD_BL_CTRL pin has to be manually controlled */
agemio 0:14f16771fe40 1246 gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
agemio 0:14f16771fe40 1247 HAL_GPIO_Init(LCD_BL_CTRL_GPIO_PORT, &gpio_init_structure);
agemio 0:14f16771fe40 1248 }
agemio 0:14f16771fe40 1249
agemio 0:14f16771fe40 1250 /**
agemio 0:14f16771fe40 1251 * @brief DeInitializes BSP_LCD MSP.
agemio 0:14f16771fe40 1252 * @param hltdc: LTDC handle
agemio 0:14f16771fe40 1253 * @param Params
agemio 0:14f16771fe40 1254 * @retval None
agemio 0:14f16771fe40 1255 */
agemio 0:14f16771fe40 1256 __weak void BSP_LCD_MspDeInit(LTDC_HandleTypeDef *hltdc, void *Params)
agemio 0:14f16771fe40 1257 {
agemio 0:14f16771fe40 1258 GPIO_InitTypeDef gpio_init_structure;
agemio 0:14f16771fe40 1259
agemio 0:14f16771fe40 1260 /* Disable LTDC block */
agemio 0:14f16771fe40 1261 __HAL_LTDC_DISABLE(hltdc);
agemio 0:14f16771fe40 1262
agemio 0:14f16771fe40 1263 /* LTDC Pins deactivation */
agemio 0:14f16771fe40 1264
agemio 0:14f16771fe40 1265 /* GPIOE deactivation */
agemio 0:14f16771fe40 1266 gpio_init_structure.Pin = GPIO_PIN_4;
agemio 0:14f16771fe40 1267 HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
agemio 0:14f16771fe40 1268
agemio 0:14f16771fe40 1269 /* GPIOG deactivation */
agemio 0:14f16771fe40 1270 gpio_init_structure.Pin = GPIO_PIN_12;
agemio 0:14f16771fe40 1271 HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
agemio 0:14f16771fe40 1272
agemio 0:14f16771fe40 1273 /* GPIOI deactivation */
agemio 0:14f16771fe40 1274 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_12 | \
agemio 0:14f16771fe40 1275 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
agemio 0:14f16771fe40 1276 HAL_GPIO_DeInit(GPIOI, gpio_init_structure.Pin);
agemio 0:14f16771fe40 1277
agemio 0:14f16771fe40 1278 /* GPIOJ deactivation */
agemio 0:14f16771fe40 1279 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
agemio 0:14f16771fe40 1280 GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \
agemio 0:14f16771fe40 1281 GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \
agemio 0:14f16771fe40 1282 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
agemio 0:14f16771fe40 1283 HAL_GPIO_DeInit(GPIOJ, gpio_init_structure.Pin);
agemio 0:14f16771fe40 1284
agemio 0:14f16771fe40 1285 /* GPIOK deactivation */
agemio 0:14f16771fe40 1286 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \
agemio 0:14f16771fe40 1287 GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
agemio 0:14f16771fe40 1288 HAL_GPIO_DeInit(GPIOK, gpio_init_structure.Pin);
agemio 0:14f16771fe40 1289
agemio 0:14f16771fe40 1290 /* Disable LTDC clock */
agemio 0:14f16771fe40 1291 __HAL_RCC_LTDC_CLK_DISABLE();
agemio 0:14f16771fe40 1292
agemio 0:14f16771fe40 1293 /* GPIO pins clock can be shut down in the application
agemio 0:14f16771fe40 1294 by surcharging this __weak function */
agemio 0:14f16771fe40 1295 }
agemio 0:14f16771fe40 1296
agemio 0:14f16771fe40 1297 /**
agemio 0:14f16771fe40 1298 * @brief Clock Config.
agemio 0:14f16771fe40 1299 * @param hltdc: LTDC handle
agemio 0:14f16771fe40 1300 * @param Params
agemio 0:14f16771fe40 1301 * @note This API is called by BSP_LCD_Init()
agemio 0:14f16771fe40 1302 * Being __weak it can be overwritten by the application
agemio 0:14f16771fe40 1303 * @retval None
agemio 0:14f16771fe40 1304 */
agemio 0:14f16771fe40 1305 __weak void BSP_LCD_ClockConfig(LTDC_HandleTypeDef *hltdc, void *Params)
agemio 0:14f16771fe40 1306 {
agemio 0:14f16771fe40 1307 static RCC_PeriphCLKInitTypeDef periph_clk_init_struct;
agemio 0:14f16771fe40 1308
agemio 0:14f16771fe40 1309 /* RK043FN48H LCD clock configuration */
agemio 0:14f16771fe40 1310 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
agemio 0:14f16771fe40 1311 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */
agemio 0:14f16771fe40 1312 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz */
agemio 0:14f16771fe40 1313 /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6Mhz */
agemio 0:14f16771fe40 1314 periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
agemio 0:14f16771fe40 1315 periph_clk_init_struct.PLLSAI.PLLSAIN = 192;
agemio 0:14f16771fe40 1316 periph_clk_init_struct.PLLSAI.PLLSAIR = RK043FN48H_FREQUENCY_DIVIDER;
agemio 0:14f16771fe40 1317 periph_clk_init_struct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
agemio 0:14f16771fe40 1318 HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct);
agemio 0:14f16771fe40 1319 }
agemio 0:14f16771fe40 1320
agemio 0:14f16771fe40 1321
agemio 0:14f16771fe40 1322 /*******************************************************************************
agemio 0:14f16771fe40 1323 Static Functions
agemio 0:14f16771fe40 1324 *******************************************************************************/
agemio 0:14f16771fe40 1325
agemio 0:14f16771fe40 1326 /**
agemio 0:14f16771fe40 1327 * @brief Draws a character on LCD.
agemio 0:14f16771fe40 1328 * @param Xpos: Line where to display the character shape
agemio 0:14f16771fe40 1329 * @param Ypos: Start column address
agemio 0:14f16771fe40 1330 * @param c: Pointer to the character data
agemio 0:14f16771fe40 1331 * @retval None
agemio 0:14f16771fe40 1332 */
agemio 0:14f16771fe40 1333 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c)
agemio 0:14f16771fe40 1334 {
agemio 0:14f16771fe40 1335 uint32_t i = 0, j = 0;
agemio 0:14f16771fe40 1336 uint16_t height, width;
agemio 0:14f16771fe40 1337 uint8_t offset;
agemio 0:14f16771fe40 1338 uint8_t *pchar;
agemio 0:14f16771fe40 1339 uint32_t line;
agemio 0:14f16771fe40 1340
agemio 0:14f16771fe40 1341 height = DrawProp[ActiveLayer].pFont->Height;
agemio 0:14f16771fe40 1342 width = DrawProp[ActiveLayer].pFont->Width;
agemio 0:14f16771fe40 1343
agemio 0:14f16771fe40 1344 offset = 8 *((width + 7)/8) - width ;
agemio 0:14f16771fe40 1345
agemio 0:14f16771fe40 1346 for(i = 0; i < height; i++)
agemio 0:14f16771fe40 1347 {
agemio 0:14f16771fe40 1348 pchar = ((uint8_t *)c + (width + 7)/8 * i);
agemio 0:14f16771fe40 1349
agemio 0:14f16771fe40 1350 switch(((width + 7)/8))
agemio 0:14f16771fe40 1351 {
agemio 0:14f16771fe40 1352
agemio 0:14f16771fe40 1353 case 1:
agemio 0:14f16771fe40 1354 line = pchar[0];
agemio 0:14f16771fe40 1355 break;
agemio 0:14f16771fe40 1356
agemio 0:14f16771fe40 1357 case 2:
agemio 0:14f16771fe40 1358 line = (pchar[0]<< 8) | pchar[1];
agemio 0:14f16771fe40 1359 break;
agemio 0:14f16771fe40 1360
agemio 0:14f16771fe40 1361 case 3:
agemio 0:14f16771fe40 1362 default:
agemio 0:14f16771fe40 1363 line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
agemio 0:14f16771fe40 1364 break;
agemio 0:14f16771fe40 1365 }
agemio 0:14f16771fe40 1366
agemio 0:14f16771fe40 1367 for (j = 0; j < width; j++)
agemio 0:14f16771fe40 1368 {
agemio 0:14f16771fe40 1369 if(line & (1 << (width- j + offset- 1)))
agemio 0:14f16771fe40 1370 {
agemio 0:14f16771fe40 1371 BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor);
agemio 0:14f16771fe40 1372 }
agemio 0:14f16771fe40 1373 else
agemio 0:14f16771fe40 1374 {
agemio 0:14f16771fe40 1375 BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor);
agemio 0:14f16771fe40 1376 }
agemio 0:14f16771fe40 1377 }
agemio 0:14f16771fe40 1378 Ypos++;
agemio 0:14f16771fe40 1379 }
agemio 0:14f16771fe40 1380 }
agemio 0:14f16771fe40 1381
agemio 0:14f16771fe40 1382 /**
agemio 0:14f16771fe40 1383 * @brief Fills a triangle (between 3 points).
agemio 0:14f16771fe40 1384 * @param x1: Point 1 X position
agemio 0:14f16771fe40 1385 * @param y1: Point 1 Y position
agemio 0:14f16771fe40 1386 * @param x2: Point 2 X position
agemio 0:14f16771fe40 1387 * @param y2: Point 2 Y position
agemio 0:14f16771fe40 1388 * @param x3: Point 3 X position
agemio 0:14f16771fe40 1389 * @param y3: Point 3 Y position
agemio 0:14f16771fe40 1390 * @retval None
agemio 0:14f16771fe40 1391 */
agemio 0:14f16771fe40 1392 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)
agemio 0:14f16771fe40 1393 {
agemio 0:14f16771fe40 1394 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
agemio 0:14f16771fe40 1395 yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
agemio 0:14f16771fe40 1396 curpixel = 0;
agemio 0:14f16771fe40 1397
agemio 0:14f16771fe40 1398 deltax = ABS(x2 - x1); /* The difference between the x's */
agemio 0:14f16771fe40 1399 deltay = ABS(y2 - y1); /* The difference between the y's */
agemio 0:14f16771fe40 1400 x = x1; /* Start x off at the first pixel */
agemio 0:14f16771fe40 1401 y = y1; /* Start y off at the first pixel */
agemio 0:14f16771fe40 1402
agemio 0:14f16771fe40 1403 if (x2 >= x1) /* The x-values are increasing */
agemio 0:14f16771fe40 1404 {
agemio 0:14f16771fe40 1405 xinc1 = 1;
agemio 0:14f16771fe40 1406 xinc2 = 1;
agemio 0:14f16771fe40 1407 }
agemio 0:14f16771fe40 1408 else /* The x-values are decreasing */
agemio 0:14f16771fe40 1409 {
agemio 0:14f16771fe40 1410 xinc1 = -1;
agemio 0:14f16771fe40 1411 xinc2 = -1;
agemio 0:14f16771fe40 1412 }
agemio 0:14f16771fe40 1413
agemio 0:14f16771fe40 1414 if (y2 >= y1) /* The y-values are increasing */
agemio 0:14f16771fe40 1415 {
agemio 0:14f16771fe40 1416 yinc1 = 1;
agemio 0:14f16771fe40 1417 yinc2 = 1;
agemio 0:14f16771fe40 1418 }
agemio 0:14f16771fe40 1419 else /* The y-values are decreasing */
agemio 0:14f16771fe40 1420 {
agemio 0:14f16771fe40 1421 yinc1 = -1;
agemio 0:14f16771fe40 1422 yinc2 = -1;
agemio 0:14f16771fe40 1423 }
agemio 0:14f16771fe40 1424
agemio 0:14f16771fe40 1425 if (deltax >= deltay) /* There is at least one x-value for every y-value */
agemio 0:14f16771fe40 1426 {
agemio 0:14f16771fe40 1427 xinc1 = 0; /* Don't change the x when numerator >= denominator */
agemio 0:14f16771fe40 1428 yinc2 = 0; /* Don't change the y for every iteration */
agemio 0:14f16771fe40 1429 den = deltax;
agemio 0:14f16771fe40 1430 num = deltax / 2;
agemio 0:14f16771fe40 1431 num_add = deltay;
agemio 0:14f16771fe40 1432 num_pixels = deltax; /* There are more x-values than y-values */
agemio 0:14f16771fe40 1433 }
agemio 0:14f16771fe40 1434 else /* There is at least one y-value for every x-value */
agemio 0:14f16771fe40 1435 {
agemio 0:14f16771fe40 1436 xinc2 = 0; /* Don't change the x for every iteration */
agemio 0:14f16771fe40 1437 yinc1 = 0; /* Don't change the y when numerator >= denominator */
agemio 0:14f16771fe40 1438 den = deltay;
agemio 0:14f16771fe40 1439 num = deltay / 2;
agemio 0:14f16771fe40 1440 num_add = deltax;
agemio 0:14f16771fe40 1441 num_pixels = deltay; /* There are more y-values than x-values */
agemio 0:14f16771fe40 1442 }
agemio 0:14f16771fe40 1443
agemio 0:14f16771fe40 1444 for (curpixel = 0; curpixel <= num_pixels; curpixel++)
agemio 0:14f16771fe40 1445 {
agemio 0:14f16771fe40 1446 BSP_LCD_DrawLine(x, y, x3, y3);
agemio 0:14f16771fe40 1447
agemio 0:14f16771fe40 1448 num += num_add; /* Increase the numerator by the top of the fraction */
agemio 0:14f16771fe40 1449 if (num >= den) /* Check if numerator >= denominator */
agemio 0:14f16771fe40 1450 {
agemio 0:14f16771fe40 1451 num -= den; /* Calculate the new numerator value */
agemio 0:14f16771fe40 1452 x += xinc1; /* Change the x as appropriate */
agemio 0:14f16771fe40 1453 y += yinc1; /* Change the y as appropriate */
agemio 0:14f16771fe40 1454 }
agemio 0:14f16771fe40 1455 x += xinc2; /* Change the x as appropriate */
agemio 0:14f16771fe40 1456 y += yinc2; /* Change the y as appropriate */
agemio 0:14f16771fe40 1457 }
agemio 0:14f16771fe40 1458 }
agemio 0:14f16771fe40 1459
agemio 0:14f16771fe40 1460 /**
agemio 0:14f16771fe40 1461 * @brief Fills a buffer.
agemio 0:14f16771fe40 1462 * @param LayerIndex: Layer index
agemio 0:14f16771fe40 1463 * @param pDst: Pointer to destination buffer
agemio 0:14f16771fe40 1464 * @param xSize: Buffer width
agemio 0:14f16771fe40 1465 * @param ySize: Buffer height
agemio 0:14f16771fe40 1466 * @param OffLine: Offset
agemio 0:14f16771fe40 1467 * @param ColorIndex: Color index
agemio 0:14f16771fe40 1468 * @retval None
agemio 0:14f16771fe40 1469 */
agemio 0:14f16771fe40 1470 static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex)
agemio 0:14f16771fe40 1471 {
agemio 0:14f16771fe40 1472 /* Register to memory mode with ARGB8888 as color Mode */
agemio 0:14f16771fe40 1473 hDma2dHandler.Init.Mode = DMA2D_R2M;
agemio 0:14f16771fe40 1474 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
agemio 0:14f16771fe40 1475 { /* RGB565 format */
agemio 0:14f16771fe40 1476 hDma2dHandler.Init.ColorMode = DMA2D_RGB565;
agemio 0:14f16771fe40 1477 }
agemio 0:14f16771fe40 1478 else
agemio 0:14f16771fe40 1479 { /* ARGB8888 format */
agemio 0:14f16771fe40 1480 hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888;
agemio 0:14f16771fe40 1481 }
agemio 0:14f16771fe40 1482 hDma2dHandler.Init.OutputOffset = OffLine;
agemio 0:14f16771fe40 1483
agemio 0:14f16771fe40 1484 hDma2dHandler.Instance = DMA2D;
agemio 0:14f16771fe40 1485
agemio 0:14f16771fe40 1486 /* DMA2D Initialization */
agemio 0:14f16771fe40 1487 if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK)
agemio 0:14f16771fe40 1488 {
agemio 0:14f16771fe40 1489 if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, LayerIndex) == HAL_OK)
agemio 0:14f16771fe40 1490 {
agemio 0:14f16771fe40 1491 if (HAL_DMA2D_Start(&hDma2dHandler, ColorIndex, (uint32_t)pDst, xSize, ySize) == HAL_OK)
agemio 0:14f16771fe40 1492 {
agemio 0:14f16771fe40 1493 /* Polling For DMA transfer */
agemio 0:14f16771fe40 1494 HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10);
agemio 0:14f16771fe40 1495 }
agemio 0:14f16771fe40 1496 }
agemio 0:14f16771fe40 1497 }
agemio 0:14f16771fe40 1498 }
agemio 0:14f16771fe40 1499
agemio 0:14f16771fe40 1500 /**
agemio 0:14f16771fe40 1501 * @brief Converts a line to an ARGB8888 pixel format.
agemio 0:14f16771fe40 1502 * @param pSrc: Pointer to source buffer
agemio 0:14f16771fe40 1503 * @param pDst: Output color
agemio 0:14f16771fe40 1504 * @param xSize: Buffer width
agemio 0:14f16771fe40 1505 * @param ColorMode: Input color mode
agemio 0:14f16771fe40 1506 * @retval None
agemio 0:14f16771fe40 1507 */
agemio 0:14f16771fe40 1508 static void LL_ConvertLineToARGB8888(void *pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode)
agemio 0:14f16771fe40 1509 {
agemio 0:14f16771fe40 1510 /* Configure the DMA2D Mode, Color Mode and output offset */
agemio 0:14f16771fe40 1511 hDma2dHandler.Init.Mode = DMA2D_M2M_PFC;
agemio 0:14f16771fe40 1512 hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888;
agemio 0:14f16771fe40 1513 hDma2dHandler.Init.OutputOffset = 0;
agemio 0:14f16771fe40 1514
agemio 0:14f16771fe40 1515 /* Foreground Configuration */
agemio 0:14f16771fe40 1516 hDma2dHandler.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
agemio 0:14f16771fe40 1517 hDma2dHandler.LayerCfg[1].InputAlpha = 0xFF;
agemio 0:14f16771fe40 1518 hDma2dHandler.LayerCfg[1].InputColorMode = ColorMode;
agemio 0:14f16771fe40 1519 hDma2dHandler.LayerCfg[1].InputOffset = 0;
agemio 0:14f16771fe40 1520
agemio 0:14f16771fe40 1521 hDma2dHandler.Instance = DMA2D;
agemio 0:14f16771fe40 1522
agemio 0:14f16771fe40 1523 /* DMA2D Initialization */
agemio 0:14f16771fe40 1524 if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK)
agemio 0:14f16771fe40 1525 {
agemio 0:14f16771fe40 1526 if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, 1) == HAL_OK)
agemio 0:14f16771fe40 1527 {
agemio 0:14f16771fe40 1528 if (HAL_DMA2D_Start(&hDma2dHandler, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
agemio 0:14f16771fe40 1529 {
agemio 0:14f16771fe40 1530 /* Polling For DMA transfer */
agemio 0:14f16771fe40 1531 HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10);
agemio 0:14f16771fe40 1532 }
agemio 0:14f16771fe40 1533 }
agemio 0:14f16771fe40 1534 }
agemio 0:14f16771fe40 1535 }
agemio 0:14f16771fe40 1536
agemio 0:14f16771fe40 1537 /**
agemio 0:14f16771fe40 1538 * @}
agemio 0:14f16771fe40 1539 */
agemio 0:14f16771fe40 1540
agemio 0:14f16771fe40 1541 /**
agemio 0:14f16771fe40 1542 * @}
agemio 0:14f16771fe40 1543 */
agemio 0:14f16771fe40 1544
agemio 0:14f16771fe40 1545 /**
agemio 0:14f16771fe40 1546 * @}
agemio 0:14f16771fe40 1547 */
agemio 0:14f16771fe40 1548
agemio 0:14f16771fe40 1549 /**
agemio 0:14f16771fe40 1550 * @}
agemio 0:14f16771fe40 1551 */
agemio 0:14f16771fe40 1552
agemio 0:14f16771fe40 1553 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/