2024-02-12 04:17 AM - edited 2024-02-12 04:18 AM
Hello community,
I am using NUCELOH7A3 and a 800x320 display. I could fill the screen, display lines and texts using RGB565 and ARGB8888. Now I wanted to use the L8 forrmat with a LUT.
Using the the DMA2D mode Memory to Memory works fine (array)! But using the mode Register to Memory does not.
BSP_LCD_WritePixel() works fine with the L8 format. But the BSP_LCD_FillRect() that uses DMA2D has some problems.
It displays verticle lines, displaying 1 line and skipping 1 line after. So it writes the pixel and skips the one after.
Here is the code.
int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
{
uint32_t Xaddress;
/* Get the rectangle start address */
Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
/* Fill the rectangle */
LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
return BSP_ERROR_NONE;
}
static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
{
uint32_t output_color_mode, input_color = Color;
switch(Lcd_Ctx[Instance].PixelFormat)
{
case LCD_PIXEL_FORMAT_RGB565:
output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
input_color = CONVERTRGB5652ARGB8888(Color);
break;
case LCD_PIXEL_FORMAT_L8:
output_color_mode = DMA2D_OUTPUT_ARGB8888; /* RGB565 */
hlcd_dma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_L8;
break;
case LCD_PIXEL_FORMAT_RGB888:
default:
output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
break;
}
/* Register to memory mode with ARGB8888 as color Mode */
hlcd_dma2d.Init.Mode = DMA2D_R2M;
hlcd_dma2d.Init.ColorMode = output_color_mode;//DMA2D_OUTPUT_ARGB8888;
hlcd_dma2d.Init.OutputOffset = OffLine;
hlcd_dma2d.Instance = DMA2D;
/* DMA2D Initialization */
if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
{
if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
{
if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)
{
/* Polling For DMA transfer */
(void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 100);
}
}
}
}
Am I missing something? Thanks for your help!