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
Configuration
LTDCの設定
- モード
Display Type
をRGB565(16 bits)- DSI Modeに設定
- レイヤの設定
Number of layers
を1 layerに設定- スクリーン解像度を
Windows Position
、Frame Buffer Line Length
、およびFrame Buffer Number of Lines
に設定 Layer 0 - Pixel Format
をRGB565に設定Layer 0 - Alpha constant for blending
を255に設定
- NVICの設定
LTDC global interrupt
とLTDC global error interrupt
は両方とも不要なため、無効にする必要があります。
DSIHOSTの設定
- モード
DSIHost
をAdapted Command Mode with TE Pinに設定
- ディスプレイ・インタフェース
Color Coding
をRGB565(16 bits)- DSI modeに設定Maximum Command Size
をディスプレイ幅相当の数値に設定The Refresh of the Display Frame Buffer is Triggered
をmanually by Enabling the LTDCに設定- 残りの設定は選択したLCD HWに応じて異なる
- NVICの設定
DSI global interrupt
を有効にする
TouchGFX Generator
- モード
- Graphics Applicationを有効にする
- TouchGFX Generator
Display / Interface
をParallel RGB(LTDC)に設定(これはアプリケーションが通信する必要があるコントローラであるため)Application Tick Source
をCustomに設定
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:
- Wait for "VSYNC" (sometimes called Tearing Effect (TE) signal) to signal the TouchGFX Engine.
- 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.
- 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.
- 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ディスプレイがオンになるのを防ぐ1つの方法は、関数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
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
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.