Skip to main content
AJans.3
Associate II
October 13, 2026
Question

STM32U5G9 – 90° rotated display without a second framebuffer (LTDC / GFXMMU / GPU2D)

Hi,

We’re using an STM32U5G9 with a MIPI DSI panel (driven by the LTDC through the DSI host). The panel is 800×600 and scans in landscape, but it’s mounted rotated, so the user sees a 600×800 portrait image. The panel controller can’t swap its scan direction; the manufacturer confirmed that only X/Y flips are supported.

Current pipeline: JPEG frames arrive over the network. The hardware JPEG codec decodes them in bands of about 32 lines, and DMA2D converts each band (YCbCr → RGB888) straight into a single framebuffer that the LTDC scans. There’s no double buffering, because of RAM: the framebuffer alone is about 1.4 MB. Today the server sends frames already rotated to panel orientation.

Goal: a framebuffer in the logical (portrait, 600×800) orientation. We could then implement scrolling by remapping lines with the GFXMMU (a ring buffer), and only decode the newly exposed lines.

Questions:

  1. Can the LTDC or the GFXMMU present a 90°-rotated view of a framebuffer to the panel, without any intermediate buffer? As we read the GFXMMU, each LUT entry maps a virtual line to one contiguous run of physical blocks, so it can’t transpose. Is that correct?
  2. Can the GPU2D (NeoChrom) rotate on the fly between memory and the LTDC, i.e. without writing the rotated image to a separate panel-oriented framebuffer? Or is the GPU2D strictly memory-to-memory, so that rotation always needs a destination buffer?
  3. If a destination buffer is required, what’s the recommended architecture for minimal RAM? Specifically:
    • Is it supported (and is there an example) for the GPU2D to rotate into a small strip buffer just ahead of the LTDC scan, paced by the LTDC line interrupt?
    • Can GFXMMU LUT entries alias the same physical lines, so that a strip buffer of e.g. 64 lines appears to the LTDC as a full 600-line framebuffer?
  4. What’s the expected GPU2D throughput for a 90° rotated blit of a full 800×600 frame, in RGB565 and in RGB888, from internal SRAM? Is that realistic at 60 fps?
  5. Can libnemagfx be used standalone (bare metal or FreeRTOS, without TouchGFX)? Where is it distributed, and under what license? We already use LVGL, which has a NemaGFX draw unit.
  6. Can the JPEG codec or DMA2D produce rotated output in any mode? For example, is a DMA2D transfer with 1-pixel-wide lines (pixels per line = 1, number of lines = 600, output offset = pitch − 1) a supported way to transpose a row into a column?

Thanks!

1 reply

ST Technical Moderator
October 15, 2026

Hi,

In general, I think what you are trying to achive would be much easier if you could fit two full framebuffers, e.g. by reducing the color format to RGB565. But let me try to answer all your questions:

  1. No, neihter the LTDC nor the GFXMMU can rotate the framebuffer data.
  2. No, NeoChrom operations are memory to memory so you need a destination buffer
  3. It is possible to do what you describe here. The TouchGFX framework actually implements a framebuffer strategy based on this concept. You can find more information about this here:

    https://support.touchgfx.com/docs/basic-concepts/framebuffer#display-without-gram-partial-buffering

     

  4. I think that this should be possible. When you do a clean 90 degree rotation, you should be able to use the fast “nearest-neighbor” algorithm without any loss of quality.
  5. Our NeoChromSDK library can be used for NeoChrom without TouchGFX. You can contact Jorgen.mygind@st.com to get more information about this.
  6. I am not familiar with any ways to do rotation using JPEC codec or DMA2D. The DMA2Dv3 (available in STM32H5F) can hardware accelerate rotation in 90, 180 and 270 degrees.

Best regards,

Peter