MIPI-DSIビデオ・モード
このセクションでは、ビデオ・モード用のMIPI DSIインタフェースの設定方法と、TouchGFX Generatorでこの設定を使用する方法について説明します。 この記事で使用する例は、24ビットRGB888のフレームバッファ・フォーマットに対応するもので、STM32CubeMXでは一般的に以下の設定で実行されます。また、生成済みのコード例を示します。
- LTDC IP
- DSI-HOST IP
- TouchGFX Generator
STM32CubeMX - ハードウェア設定
LTDC
- モード
Display Type
をRGB888 (24 bits) - DSI Modeに設定
- レイヤーの設定
Number of layers
を1 layerに設定Layer 0 - Pixel Format
をRGB888に設定Layer 0 - Alpha constant for blending
を255に設定
- NVICの設定
- LCD-TFT global interruptを有効にする
DSIHOSTの設定
- モード
DSIHost
をVideo Modeに設定
- ディスプレイ・インタフェース
Color Coding
をRGB888 (24 bits) - DSI modeに設定- 残りの設定は選択したLCD HWに応じて異なる
- NVICの設定
- DSIHOST global interruptは必要ないので、無効にすること
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で処理します。User Codeセクションで、
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ディスプレイがオンになるのを防ぐ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();
}