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();
}