インテルのみ表示可能 — GUID: dvq1618909696414
Ixiasoft
インテルのみ表示可能 — GUID: dvq1618909696414
Ixiasoft
33.5. TMO IPのソフトウェアAPI
ソフトウェア・ドライバーの例
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 で定義されます。
名前 | 説明 |
---|---|
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