メイン・コンテンツまでスキップ

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に設定

      LTDCの設定

  • NVICの設定
    • LCD-TFT global interruptを有効にする

      LTDC NVICの設定

DSIHOSTの設定

  • モード
    • DSIHostをVideo Modeに設定
  • ディスプレイ・インタフェース
    • Color CodingをRGB888 (24 bits) - DSI modeに設定
    • 残りの設定は選択したLCD HWに応じて異なる

      DSIHOSTの設定

  • NVICの設定
    • DSIHOST global interruptは必要ないので、無効にすること

      DSIHOST NVICの設定

STM32CubeMX - TouchGFX Generator

  • モード
    • Graphics Applicationを有効にする
  • TouchGFX Generator
    • Display / InterfaceをParallel RGB (LTDC)に設定(これはコントローラであり、アプリケーションとの通信の必要があるため)
    • Application Tick SourceをLTDCに設定

      TouchGFX Generatorの設定

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ビデオ・モード用に更新された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();
}