跳轉到主要內容

MIPI-DSI指令模式

This scenario describes how to configure MIPI DSI interface in Command Mode and TouchGFX Generator when using a display with a Display Serial Interface (DSI) and GRAM. The example used in this article will be for 16-bit RGB565 frame buffer format and goes through configurations in STM32CubeMX.

Note
This scenario assumes that a working display driver has been developed during the Board Bringup phase. The driver must be able to transfer pixels to the display, and to control the memory writing position of the display. Check the datasheet for your display for further details.

Configuration

LTDC設定

  • 模式
    • Display Type (顯示類型)設定為RGB565 (16 bits) - DSI Mode (RGB565 (16位元) - DSI模式)
  • 層設定
    • Number of layers (層數)設定為1 layer (1層)
    • Windows Position (視窗位置)、Frame Buffer Line Length (影像緩衝區行長度)及Frame Buffer Number of Lines (影像緩衝區行數)設定螢幕解析度
    • Layer 0 - Pixel Format (第0層 - 像素格式)設定為RGB565
    • Layer 0 - Alpha constant for blending (第0層 - 用於混合的Alpha常數)設定為255

      LTDC設定

  • NVIC設定
    • LTDC global interrupt (LTDC全域中斷)及LTDC global error interrupt (LTDC全域錯誤中斷)都不需要且應停用。

      LTDC NVIC設定

DSIHOST設定

  • 模式
    • DSIHost設定為_*Adapted Command Mode with TE Pin**(適性指令模式搭配TE腳位)
  • 顯示介面
    • Color Coding (色彩編碼)設定為RGB565 (16 bits) - DSI mode (RGB565 (16位元) - DSI模式)
    • Maximum Command Size (最大指令大小)設定為顯示寬度順序的數字
    • The Refresh of the Display Frame Buffer is Triggered (觸發顯示影像緩衝區的刷新頻率)設定為manually by Enabling the LTDC (啟用LTDC手動進行)
    • 剩餘設定需視選取的LCD硬體而定

      DSIHOST設定

  • NVIC設定
    • 啟用DSI global interrupt (DSI全域中斷)

      DSIHOST NVIC設定

TouchGFX Generator

  • 模式
    • 啟用Graphics Application (圖形應用程式)
  • TouchGFX Generator
    • Display / Interface (顯示/介面)設定為Parallel RGB (LTDC)(平行RGB (LTDC)),因為這仍是應用程式需要通訊的控制器。
    • Application Tick Source (應用時標源)設定為Custom (客製)

      TouchGFX Generator設定

User Code

The TouchGFX Generator can only generate a partial TouchGFX AL that configures the LTDC to transfer pixels through the DSI Host controller from the framebuffer memory to the display and synchronize the display with the TouchGFX Engine. However, all necessary handles to accomplish this are generated by the TouchGFX Generator.

Generally, for displays with embedded GRAM, the implementation of the generated TouchGFX HAL handles in TouchGFXHAL.cpp should perform the following steps to transfer pixels to the display and synchronize the display with the TouchGFX Engine:

  1. Wait for "VSYNC" (sometimes called Tearing Effect (TE) signal) to signal the TouchGFX Engine.
  2. Based on the area of the framebuffer to be redrawn, move the "display cursor" and "active window" (the region of the display being updated) to a place in GRAM that matches this area.
  3. Prepare to write incoming pixel data to GRAM. Depending on the framebuffer strategy and display interface used, this could be swapping framebuffer pointers, signaling TouchGFX Engine, or waiting for previous transfers to complete.
  4. Send pixel data.

Depending on the display used and the framebuffer strategy, the implementation of the above steps will vary.

Some of the adjustments that may be needed specifcally for DSI Command Mode interfaces are described below.

DSIHOST / LTDC初始化順序

MX_DSIHOST_DSI_Init()的呼叫必須在MX_LTDC_Init()之前完成, This should be handled by STM32CubeMX. If this is not correct, take care to fix the order in a user code section.

After calling HAL_DSI_Start(), switch DSIHOST clock to the DSIPHY source:

static void MX_DSIHOST_DSI_Init(void)
{
...
/* Switch to DSI PHY PLL clock */
RCC_PeriphCLKInitTypeDef PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_DSI;
PeriphClkInit.DsiClockSelection = RCC_DSICLKSOURCE_DSIPHY;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/* USER CODE END DSIHOST_Init 2 */
...
}

User has to add the required initialization code specific to the used LCD controller at the end of the MX_LTDC_Init() function. That code will be based on the DSI HAL APIs HAL_DSI_ShortWrite() and HAL_DSI_LongWrite():

  static void MX_LTDC_Init(void)
{
...
/* USER CODE BEGIN LTDC_Init 2 */
// Specific LCD controller's initialization code
...

// Exit Sleep Mode
if (HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, DSI_EXIT_SLEEP_MODE, 0x00) != HAL_OK)
{
Error_Handler();
}

HAL_Delay(120);
/* USER CODE END LTDC_Init 2 */
...
}

已更新DSI指令模式的TouchGFXHAL類別

防止MIPI DSI顯示在應用程式中渲染第一幀之前開啟的一種方法是保護TouchGFXHAL::endFrame函數,以便在TouchGFX渲染第一幀之前關閉顯示。 TouchGFXHAL::endFrame()可像下面這樣更新,透過設定為PWM輸出的HW計時器啟用LCD及其背光。

void TouchGFXHAL::endFrame()
{
if (!display_on)
{
display_on = true;
/* Enable the LCD, Send Display on DCS command to display */
HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, DSI_SET_DISPLAY_ON, 0x00);
/* Start PWM Timer channel */
(void)HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
/* Enable Backlight by setting Brightness to 100% */
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 2U * 100);
}

TouchGFXGeneratedHAL::endFrame();
}

Supported Framebuffer Strategies

  • Single
  • Double
  • Partial - GRAM display
Further reading
See article Framebuffer Strategies for a general introduction to framebuffer strategies in TouchGFX.

DSI Command Mode usually has a high enough bandwidth to transfer pixels to GRAM fast than the display scans the pixels. This is very similar to to the FMC Parallel display interface. Therefore, the implementation steps for a working TouchGFX AL for DSI Command Mode is very similar to the FMC Parallel display interface.

Further reading
See article FMC Display Interface for more information about the TouchGFX AL implementation.

Single

Currently, no TouchGFX Board Support have a reference implementation for Single buffering with DSI Command Mode. The setup would be similar to FMC Single buffer setup, but using DSI Command Mode driver functions instead of FMC.

Double

Currently, no TouchGFX Board Support have a reference implementation for Double buffering with DSI Command Mode. The setup would be similar to FMC Double buffer setup, but using DSI Command Mode driver functions instead of FMC.

Partial - GRAM display

Currently, no TouchGFX Board Support have a reference implementation for Partial - GRAM display with DSI Command Mode. The setup would be similar to FMC Partial - GRAM display setup, but using DSI Command Mode driver functions instead of FMC.