DMA2D needs RGB888 input color but is configured as RGB565
Hi, I stumbled on a little issue regarding DMA2D and a NUCLEO-F767ZI.
I used STM32CubeMX 6.13.0, STM32CubeIDE 1.17.0, firmware FW_F7 1.17.2.
DMA2D needs RGB888 input color but I configured as RGB565. (I think)
The outputs also is RGB565 and seems fine.
/**
* @brief Fill rectangle
* [in] x
* [in] y
* [in] width
* [in] height
* [in] color
* [in] frameBufferPtr
* @return None
*/
uint8_t Display_Fill_Rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint32_t Color, uint32_t *frameBufferPtr)
{
HAL_StatusTypeDef hal_status = HAL_OK;
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_R2M; /* Mode Register to Memory */
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565; /* DMA2D Output color format */
hdma2d.Init.OutputOffset = (uint32_t)(DISPLAY_SIZE_X - width); /* Offset in output */
/* Foreground Configuration */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputAlpha = 0x00; /* 0xFF = Fully opaque */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputColorMode = DMA2D_INPUT_RGB565; /* DMA2D Input color format */
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputOffset = 0; /* skip 70 pixels on left when reading addrSrc : the left margin */
hal_status = HAL_DMA2D_Init(&hdma2d);
if (hal_status != HAL_OK)
{
return 1;
}
hal_status = HAL_DMA2D_ConfigLayer(&hdma2d, DMA2D_FOREGROUND_LAYER);
if (hal_status != HAL_OK)
{
return 1;
}
hal_status = HAL_DMA2D_Start(
&hdma2d,
(uint32_t)Color, /* Color value in Register to Memory DMA2D mode */
(uint32_t)frameBufferPtr + (uint32_t)(x + y * DISPLAY_SIZE_X) * 2, /* DMA2D output buffer */
(uint32_t)width, /* width of buffer in pixels */
(uint32_t)height); /* height of buffer in lines */
if (hal_status != HAL_OK)
{
return 1;
}
/* Polling For DMA transfer */
hal_status = HAL_DMA2D_PollForTransfer(&hdma2d, 100);
if (hal_status != HAL_OK)
{
return 1;
}
return 0;
}
/* DMA2D init function */
void MX_DMA2D_Init(void)
{
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_M2M;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
hdma2d.Init.OutputOffset = 0;
hdma2d.LayerCfg[1].InputOffset = 0;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[1].InputAlpha = 0;
hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
{
Error_Handler();
}
}
This line doesn't care what value is assigned to InputColorMode, and even can be left out.
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputColorMode = DMA2D_INPUT_RGB565;
I think there's something wrong.
Or what else did I overlook? Thanks for bearing with me.
