MIPI-DSI Video Mode
이 섹션에서는 비디오 모드용 MIPI DSI 인터페이스를 구성하는 방법과 TouchGFX Generator에서 이 구성을 사용하는 방법에 대해 설명합니다. 이 문서에서 사용되는 예제는 24비트/RGB888 프레임 버퍼 형식에 대한 것으로, 일반적으로 STM32CubeMX에서는 다음과 같은 구성을 거쳐서 생성된 코드로 예시가 됩니다.
- LTDC IP
- DSI-HOST IP
- TouchGFX Generator
STM32CubeMX - 하드웨어 구성
LTDC
- 모드- Display Type을 RGB888(24 bits) - DSI Mode로 설정
 
- Layer Settings- Number of layers를 1 layer로 설정
- Layer 0 - Pixel Format을 RGB888로 설정
- Layer 0 - Alpha constant for blending을 255로 설정
 
- NVIC 설정- LCD-TFT 전역 인터럽트 활성화
 
DSIHOST 구성
- 모드- DSIHost를 _*Video Mode**로 설정
 
- 디스플레이 인터페이스- Color Coding을 RGB888 (24 bits) - DSI mode로 설정
- 나머지 구성은 선택한 LCD HW에 따라 다릅니다.
 
- NVIC 설정- DSIHOST 전역 인터럽트는 필요하지 않기 때문에 비활성화되어야 합니다.
 
STM32CubeMX - TouchGFX Generator
- 모드- Graphics Application 활성화
 
- TouchGFX Generator- Display / Interface를 Parallel RGB (LTDC)로 설정(여전히 애플리케이션이 통신해야 하는 컨트롤러이기 때문)
- Application Tick Source를 LTDC로 설정
 
DSIHOST / LTDC 초기화 시퀀스
- MX_DSIHOST_DSI_Init()에 대한 호출은- MX_LTDC_Init()보다 먼저 이루어져야 합니다. 이 호출은 CubeMX에서 처리해야 합니다.
- 사용자 코드 섹션의 - MX_DSIHOST_DSI_Init()끝에서- HAL_DSI_Start()를 호출합니다.
- HAL_DSI_Start()를 호출한 후, DSIHOST 클록을- DSIPHY소스로 전환합니다.- /**
 * @brief DSIHOST Initialization Function
 * @param None
 * @retval None
 */
 static void MX_DSIHOST_DSI_Init(void)
 {
 ...
 /* USER CODE BEGIN DSIHOST_Init 2 */
 // Start DSI
 if (HAL_DSI_Start(&hdsi) != HAL_OK)
 {
 Error_Handler();
 }
 /* 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 */
 ...
 }
- 사용자는 - MX_LTDC_Init()함수의 끝에 사용된 LCD 컨트롤러에 필요한 초기화 코드를 추가해야 합니다.- 해당 코드는 DSI HAL API HAL_DSI_ShortWrite()및HAL_DSI_LongWrite()를 기반으로 합니다.
 - /**
 * @brief LTDC Initialization Function
 * @param None
 * @retval None
 */
 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 HAL API 
DSI 비디오 모드에서 TouchGFXHAL 클래스 업데이트
LTDC 인터럽트를 위한 코드는 병렬 RGB 디스플레이 인터페이스를 사용할 때 생성되는 코드와 동일합니다.
이 애플리케이션의 첫 번째 프레임을 렌더링할 때까지 MIPI DSI 디스플레이가 켜지지 않게 할 수 있는 한 가지 방법은 TouchGFX에서 첫 번째 프레임을 렌더링할 때까지 디스플레이를 꺼진 상태로 유지하도록 TouchGFXHAL::endFrame 함수를 보호하는 것입니다. 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();
}




