Library to control Silicon Labs SI570 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO.

Dependencies:   mbed

Fork of SI570 by Gerrit Polder

Committer:
DL3LD
Date:
Sun Mar 27 06:55:59 2016 +0000
Revision:
1:1556bcaaf759
STM32F746NG SI570 VFO Test

Who changed what in which revision?

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