Video and Vision Processing Suite Intel® FPGA IPユーザーガイド

ID 683329
日付 6/26/2023
Public
ドキュメント目次
1. Video and Vision Processing Suiteについて 2. Video and Vision Processing IPのスタートガイド 3. Video and Vision Processing IPの機能の説明 4. Video and Vision Processing IPインターフェイス 5. Video and Vision Processing IPレジスター 6. Video and Vision Processing IPのソフトウェア・プログラミング・モデル 7. Protocol Converter Intel® FPGA IP 8. 3D LUT Intel® FPGA IP 9. AXI-Stream Broadcaster Intel® FPGA IP 10. Bits per Color Sample Adapter Intel FPGA IP 11. Chroma Key Intel® FPGA IP 12. Chroma Resampler Intel® FPGA IP 13. Clipper Intel® FPGA IP 14. Clocked Video Input Intel® FPGA IP 15. Clocked Video to Full-Raster Converter Intel® FPGA IP 16. Clocked Video Output Intel® FPGA IP 17. Color Space Converter Intel® FPGA IP 18. Deinterlacer Intel® FPGA IP 19. FIR Filter Intel® FPGA IP 20. Frame Cleaner Intel® FPGA IP 21. Full-Raster to Clocked Video Converter Intel® FPGA IP 22. Full-Raster to Streaming Converter Intel® FPGA IP 23. Genlock Controller Intel® FPGA IP 24. Generic Crosspoint Intel® FPGA IP 25. Genlock Signal Router Intel® FPGA IP 26. Guard Bands Intel® FPGA IP 27. Interlacer Intel® FPGA IP 28. Mixer Intel® FPGA IP 29. Parallel Converter Intel® FPGA IPのピクセル 30. Scaler Intel® FPGA IP 31. Stream Cleaner Intel® FPGA IP 32. Switch Intel® FPGA IP 33. Tone Mapping Operator Intel® FPGA IP 34. Test Pattern Generator Intel® FPGA IP 35. Video and Vision Monitor Intel FPGA IP 36. Video Frame Buffer Intel® FPGA IP 37. Video Frame Reader Intel FPGA IP 38. Video Frame Writer Intel FPGA IP 39. Video Streaming FIFO Intel® FPGA IP 40. Video Timing Generator Intel® FPGA IP 41. Warp Intel® FPGA IP 42. デザイン・セキュリティー 43. Video and Vision Processing Suiteユーザーガイドの文書改訂履歴

33.5. TMO IPのソフトウェアAPI

IPには、すべてのIPパラメーターをコンフィグレーションおよび制御するソフトウェア・ドライバーが含まれています。

ソフトウェア・ドライバーの例

int main()
{
  int ret = -1;

  /* Initialize datapath Video Timing Generator instance
  /* This API function is not part of the TMO driver. */ 
  /* Hence, it is up to the user to implement it, to provide VIDEO_WIDTH, VIDEO_HEIGHT values */
  datapath_vtiming_config(VTIMING_TMO_BASE, 1);

  /* Initialize TMO IP instance*/
  intel_vvp_base_t base = INTEL_VVP_TMO_BASE;
  intel_vvp_tmo_instance_t intel_vvp_tmo_instance;

  /*Query TMO IP instance, to know whether is has been initialized correctly. */
  /* A value == '0' indicates TMO IP has been initialized correctly  */
  ret = intel_vvp_tmo_init_instance(&intel_vvp_tmo_instance, base);

  if (ret == 0)
  {
    /* TMO IP Bypass control */
    uint32_t bypass = 0;

    intel_vvp_tmo_set_bypass(&intel_vvp_tmo_instance, bypass);
    printf("Intel VVP TMO Bypass %s\n\n", bypass ? "ENABLED" : "DISABLED");

    /* Initialize TMO IP to specific video resolution */
    intel_vvp_tmo_set_resolution(&intel_vvp_tmo_instance, VIDEO_WIDTH, VIDEO_HEIGHT);

    /* Update TMO IP volume control values */
    intel_vvp_tmo_set_volume(&intel_vvp_tmo_instance, VOLUME_CTL_USER);
    intel_vvp_tmo_set_threshold(&intel_vvp_tmo_instance, INT_THR_USER);

    printf("TMO initialization done\n");
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);

    while (1)
    {
      /* This function checks if TMO IP bypass mode and/or volume control values need to be updated */
      /* but it is not part of the TMO IP SW driver package. Hence, customers are expected */
      /* to implement their own function according to their specific needs */   
      process_user_input(&intel_vvp_tmo_instance);

      /* This part of the code is for debug purpose only */
      /* Two conditions are checked: */
            
      /* Condition #1: Missing data collection per tile */
      static const uint32_t num_rows = 4;
      static const uint32_t row_mask = ~(~0u << num_rows);

    





      /* Read TMO IP debug register to check for error conditions */
      uint32_t reg_val = intel_vvp_tmo_get_debug(&intel_vvp_tmo_instance;

      if (reg_val & row_mask)
      {
        printf ("Timeout rows: ";

        for (uint32_t i = 0; i < num_rows; ++ i)
        {
          if (reg_val & (0x1 << i))
            printf("%"PRIu32" ", i);
        }

        printf("\n";
      }

      /* Condition #2: Missing entire video frame */
      if (reg_val & 0x100)
      {
        printf ("FSYNC toggle error\n";
      }

      /* Set TMO IP debug register to capture new error conditions */
      intel_vvp_tmo_set_debug(&intel_vvp_tmo_instance, reg_val);
    }
  }
  else
  {
    printf("Error initializing intel_vvp_tmo instance: %d\n", ret);
  }

  return ret;
}

TMO IPソフトウェア・ドライバーには、process_user_input(&intel_vvp_tmo_instance) 関数は含まれていません。これは、その実装がシステム要件と仕様に依存するためです。さまざまな方法でTMO強度ボリューム値をクエリーおよび更新できます。例えば、次の方法で process_user_input(&intel_vvp_tmo_instance) を実装できます。

void process_user_input(intel_vvp_tmo_instance* instance)
{
  int c = getchar();
  static const int32_t VOL_STEP = 5;
  static const int32_t TS_STEP = 1000;
  int vol_delta = 0;
  int ts_delta = 0;

  if(c != EOF)
  {
    switch(c)
    {
      case 'w':
      case 'W':
        vol_delta = VOL_STEP;
        break;
      case 's':
      case 'S':
        vol_delta = -VOL_STEP;
        break;
      case 'd':
      case 'D':
        ts_delta = TS_STEP;
        break;
      case 'a':
      case 'A':
        ts_delta = - TS_STEP;
        break;
      case 'b':
      case 'B':
      {
        uint32_t bypass = intel_vvp_tmo_get_bypass(instance);
        bypass ^= 0x1;
        intel_vvp_tmo_set_bypass(instance, bypass);
        printf("TMO Bypass %s\n\n", bypass ? "ENABLED" : "DISABLED");
      }
        break;
      default:
        break;
    }

    if(vol_delta || ts_delta)
    {
      int32_t vol = (int32_t)(intel_vvp_tmo_get_volume(instance));
      int32_t ts = (int32_t)(intel_vvp_tmo_get_threshold(instance));

      vol += vol_delta;
      ts += ts_delta;

      if(vol > 100)
      vol = 100;

      if(vol < 0)
      vol = 0;

      if(ts > 9000)
      ts = 9000;

      if(ts < 0)
      ts = 0;

      printf("VOL: %"PRIi32"\n", vol);
      printf("TS: %"PRIi32"\n", ts);

      intel_vvp_tmo_set_volume(instance, (uint32_t)(vol));
      intel_vvp_tmo_set_threshold(instance, (uint32_t)(ts));
    }
  }
}

すべてのAPI関数には、最初のパラメーターとして intel_vvp_tmo_instance_t 構造体へのポインターが必要です。この構造はTMO IPの個々のインスタンスを表し、次のように定義されます。

typedef struct intel_vvp_tmo_instance {
intel_vvp_tmo_base_t base;
} intel_vvp_tmo_instance_t;

この式において、

intel_vvp_tmo_base_t base は、ドライバーがIPのコンフィグレーションおよびコントロール・レジスターにアクセスするために使用するプラットフォーム固有のアクセスハンドラーです。ベアメタル環境のデフォルトの定義は、外部CPUバス上のTMO IPのベースアドレスを表す32ビットの符号なし整数です。

内部ドライバーは、次のマクロを使用して、IPの個々のレジスターにアクセスします。

  • tmoss_read_reg(x) – 読み出しレジスター
  • tmoss_write_reg(x,y) – 書き込みレジスター

ここでは、

xは、IPコアのベースアドレスからのレジスターのバイトオフセットです。

yは、書き込みを行うための32ビットのレジスター値です。

ファイル intel_vvp_tmo_io.h で提供されるIPレジスターアクセスのデフォルトのベアメタル実装。intel_vvp_tmo_io.h から条件付きで組み込まれる個別のヘッダーファイルを通じて代替実装を提供します。

すべてのTMO IPレジスターのバイトオフセットは、ファイル intel_vvp_tmo_regs.h で定義されます。

表 595.   ソフトウェア・ドライバーのAPIリファレンス TMO IPのソフトウェア・ドライバーは、さまざまなAPI機能を提供します。
名前 説明
intel_vvp_tmo_init_instance TMO IPドライバー・インスタンスを初期化します。
intel_vvp_tmo_set_bypass TMO IPをバイパスモードに設定します。
intel_vvp_tmo_get_bypass バイパスモードの現在の設定を返します。
intel_vvp_tmo_set_resolution TMO IPの入力ビデオ解像度を設定します。
intel_vvp_tmo_set_volume 微調整レベルのTMOボリュームをパーセンテージで調整することで、TMO強度値を設定する際により細かく設定できます。
intel_vvp_tmo_get_volume TMO強度の現在のレベルを返します。
intel_vvp_tmo_set_threshold 粗いレベルのTMOボリュームを調整し、TMO強度値を設定できます。
intel_vvp_tmo_get_threshold 微調整レベルのTMOボリュームの現在の値を返します。
intel_vvp_tmo_set_roi_en 関心領域モードをイネーブルまたはディスエーブルします。
intel_vvp_tmo_set_roi_swap 関心領域モードでスワップ領域をイネーブルまたはディスエーブルします。
intel_vvp_tmo_set_roi_horizontal_x0x1 関心領域の水平方向の開始位置と終了位置を設定し、関心領域モードを暗示的にイネーブルします。
intel_vvp_tmo_set_roi_vertical_y0y1 関心領域の垂直開始位置と終了位置を設定し、関心領域モードを暗示的にイネーブルします。
intel_vvp_tmo_get_roi_en 関心領域イネーブルビットの現在の値を返します。
intel_vvp_tmo_get_roi_swap 関心領域スワップビットの現在の値を返します。
intel_vvp_tmo_get_roi_horizontal_x0 関心領域の水平開始位置の現在の値を返します。
intel_vvp_tmo_get_roi_horizontal_x1 関心領域の水平終了位置の現在の値を返します。
intel_vvp_tmo_get_roi_vertical_y0 関心領域の垂直開始位置の現在の値を返します。
intel_vvp_tmo_get_roi_vertical_y1 関心領域の垂直終了位置の現在の値を返します。
intel_vvp_tmo_get_pip 並列ピクセル数の現在の設定値を返します。
intel_vvp_tmo_get_resolution_width 現在のビデオ解像度の幅をピクセル数で返します。
intel_vvp_tmo_get_resolution_height 現在のビデオ解像度の高さを行数で返します。
intel_vvp_tmo_get_debug デバッグ情報レジスターの現在の値を返します。
intel_vvp_tmo_set_debug デバッグ情報レジスターの個々のビットをクリアします。

intel_vvp_tmo_init_instance

int intel_vvp_tmo_init_instance(intel_vvp_tmo_instance_t* instance, intel_vvp_tmo_base_t base)
説明
TMOソフトウェア・ドライバー・インスタンスを初期化します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
ベース – プラットフォーム固有のIPアクセスハンドル。ベアメタル環境では、通常、外部CPUバス上のIPのベースアドレスを表す32ビットの符号なし整数として定義されます。
戻り値
成功した場合はゼロ、それ以外の場合は負の整数

intel_vvp_tmo_set_bypass

void intel_vvp_tmo_set_bypass(intel_vvp_tmo_instance_t* instance, uint32_t bypass)
説明
TMOバイパスモードをイネーブル/ディスエーブルします。バイパスモードでは、TMO IPは受信ビデオストリームを処理せず、そのまま渡します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
バイパス - 1 – バイパスモードがイネーブル、0 – バイパスモードがディスエーブル
戻り値
void

intel_vvp_tmo_get_bypass

uint32_t intel_vvp_tmo_get_bypass(intel_vvp_tmo_instance_t* instance)
説明
バイパスモードの現在の設定を取得します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
1 – バイパスモードがイネーブル、0 – バイパスモードがディスエーブル

intel_vvp_tmo_set_resolution

void intel_vvp_tmo_set_resolution(intel_vvp_tmo_instance_t* instance, const uint32_t width, const uint32_t height)
説明
必要なビデオ解像度に合わせてTMO IPを設定します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
幅 - ピクセル単位のビデオ幅 (例: 1920)
高さ - 行数でのビデオの高さ (例: 1080)
戻り値
void

intel_vvp_tmo_set_volume

void intel_vvp_tmo_set_volume(intel_vvp_tmo_instance_t* instance, const uint32_t volume)
説明
希望するトーン強調の強度を設定します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
ボリューム - 範囲 [0..100] のトーン強調の強度
戻り値
void

intel_vvp_tmo_get_volume

uint32_t intel_vvp_tmo_get_volume(intel_vvp_tmo_instance_t* instance)
説明
現在コンフィグレーションされているトーン強調の強度を取得します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
範囲 [0..100] の現在のトーン強調の強度

intel_vvp_tmo_set_threshold

void intel_vvp_tmo_set_threshold(intel_vvp_tmo_instance_t* instance, const uint32_t threshold)
説明
微調整レベルのトーン強調の強度を設定します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
しきい値 – [0..10000] の範囲における微細レベルのトーン強調の強度
戻り値
void

intel_vvp_tmo_get_threshold

uint32_t intel_vvp_tmo_get_threshold(intel_vvp_tmo_instance_t* instance)
説明
現在コンフィグレーションされている微調整レベルのトーン強調の強度を取得します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
[0..10000] の範囲における現在の微調整レベルのトーン強調の強度

intel_vvp_tmo_set_roi_en

void intel_vvp_tmo_set_roi_en(intel_vvp_tmo_instance_t* instance, uint32_t roi_en)
説明
関心領域モードをイネーブルまたはディスエーブルします。
引数

インスタンス - TMOソフトウェア・ドライバー・インスタンスへのポインター

関心領域イネーブル – 1 – 関心領域モードをイネーブルする、0 – 関心領域モードをディスエーブルしない

戻り値
void

intel_vvp_tmo_set_roi_swap

void intel_vvp_tmo_set_roi_swap(intel_vvp_tmo_instance_t* instance, uint32_t roi_swap)
説明
関心領域モードでスワップ領域をイネーブルまたはディスエーブルします。
引数

インスタンス - TMOソフトウェア・ドライバー・インスタンスへのポインター

関心領域のスワップ – 1 – 関心領域をスワップする、0 – 関心領域をスワップしない

戻り値
void

intel_vvp_tmo_set_roi_horizontal_x0x1

void intel_vvp_tmo_set_roi_horizontal_x0x1(intel_vvp_tmo_instance_t* instance, const uint32_t
          pos_x0, const uint32_t pos_x1)
説明
関心領域の水平方向の開始位置と終了位置を設定し、暗示的に関心領域モードをイネーブルします。
引数

インスタンス - TMOソフトウェア・ドライバー・インスタンスへのポインター

水平方向の関心領域の開始位置 – 幅方向の関心領域の開始ピクセル位置を並列ピクセルで割った値

水平方向の関心領域の終了位置 – 幅方向の関心領域の終了ピクセル位置を並列ピクセルで割った値

戻り値
void

intel_vvp_tmo_set_roi_vertical_y0y1

void intel_vvp_tmo_set_roi_vertical_y0y1(intel_vvp_tmo_instance_t* instance, const uint32_t
          pos_y0, const uint32_t pos_y1)
説明
関心領域の垂直方向の開始位置と終了位置を設定し、暗示的に関心領域モードをイネーブルします。
引数

インスタンス - TMOソフトウェア・ドライバー・インスタンスへのポインター

垂直方向の関心領域の開始位置 – 高さ寸法における関心領域の開始ライン位置

垂直方向の関心領域の終了位置 – 高さ寸法における関心領域の終了ライン位置

戻り値
void

intel_vvp_tmo_get_roi_en

uint32_t
intel_vvp_tmo_get_roi_en(intel_vvp_tmo_instance_t* instance)
説明
関心領域イネーブルビットの現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
1 – 関心領域モードがイネーブル、0 – 関心領域モードがディスエーブル

intel_vvp_tmo_get_roi_swap

uint32_t
intel_vvp_tmo_get_roi_swap(intel_vvp_tmo_instance_t* instance)
説明
関心領域スワップビットの現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
1 – 関心領域がスワップ、0 – 関心領域のスワップなし

intel_vvp_tmo_get_roi_horizontal_x0

uint32_t
intel_vvp_tmo_get_roi_horizontal_x0(intel_vvp_tmo_instance_t*
instance)
説明
関心領域の水平方向の開始位置の現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
関心領域の水平方向の開始ピクセル位置の現在の値を並列ピクセルで割った値

intel_vvp_tmo_get_roi_horizontal_x1

uint32_t
intel_vvp_tmo_get_roi_horizontal_x1(intel_vvp_tmo_instance_t*
instance)
説明
関心領域の水平方向の終了位置の現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
関心領域の水平方向の終了ピクセル位置の現在の値を並列ピクセルで割った値

intel_vvp_tmo_get_roi_vertical_y0

uint32_t
intel_vvp_tmo_get_roi_vertical_y0(intel_vvp_tmo_instance_t*
instance)
説明
関心領域の垂直開始位置の現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
関心領域の垂直開始線位置の現在の値

intel_vvp_tmo_get_roi_vertical_y1

uint32_t
intel_vvp_tmo_get_roi_vertical_y1(intel_vvp_tmo_instance_t*
instance)
説明
関心領域の垂直終了位置の現在の値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
関心領域の垂直終了ライン位置の現在の値

intel_vvp_tmo_get_pip

uint32_t
intel_vvp_tmo_get_pip(intel_vvp_tmo_instance_t*
instance)
説明
並列ピクセル数の現在のコンフィグレーション値を返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
並列ピクセル数のコンフィグレーション値

intel_vvp_tmo_get_resolution_width

uint32_t
intel_vvp_tmo_get_resolution_width(intel_vvp_tmo_instance_t*
instance)
説明
現在のビデオ解像度の幅をピクセル数で返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
ビデオ解像度幅の現在の値 (ピクセル数)

intel_vvp_tmo_get_resolution_height

uint32_t
intel_vvp_tmo_get_resolution_height(intel_vvp_tmo_instance_t*
instance)
説明
現在のビデオ解像度の高さを行数で返します。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
ビデオ解像度の高さの現在の値 (行数)

intel_vvp_tmo_get_debug

uint32_t intel_vvp_tmo_get_debug(intel_vvp_tmo_instance_t* instance)
説明
デバッグ情報レジスター、Ext_Reg_0xA0の現在値を取得
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
戻り値
32ビット符号なし整数としてのExt_Reg_0xA0の現在値

intel_vvp_tmo_set_debug

void intel_vvp_tmo_set_debug(intel_vvp_tmo_instance_t* instance, uint32_t val)
説明
デバッグ情報レジスター、Ext_Reg_0xA0の個々のビットをクリアします。
引数
インスタンス - TMOソフトウェア・ドライバー・インスタンス構造体へのポインター
val - クリアするデバッグレジスター内のビットのビットマスク
戻り値
void