cancel
Showing results for 
Search instead for 
Did you mean: 

DMA2D needs RGB888 input color but is configured as RGB565

Jack3
Senior II

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.

1 REPLY 1
Saket_Om
ST Employee

Hello @Jack3 

>> DMA2D needs RGB888 input color but I configured as RGB565. (I think)

Please ensure that you are certain about the settings you report.

Could you please share your project with us so that we can assist you more effectively?

 

If your question is answered, please close this topic by clicking "Accept as Solution".

Thanks
Omar