FX3のI2Cを使ってADV7511の設定をしよう~ADV7511設定編~【2014/02/10】
前回の「FX3のI2Cを使ってADV7511の設定をしよう~I2C設定編~」ではFX3でI2C通信をするための仕組みを組み込みましたので、今回はその仕組みを使用してADV7511の初期設定をしたいと思います。
まず初めに、前回I2C通信を組み込んだSDKのサンプルにadv7511_initとadv7511_Setup_16bitYuv422toYuv422_registersを追加していきます。
void
adv7511_init(void)
{
<blockquote> // adv7511_Setup_16bitYuv422toYuv422の初期化実施
adv7511_Setup_16bitYuv422toYuv422_registers();</blockquote>
}
void adv7511_Setup_16bitYuv422toYuv422_registers(void)
{
<blockquote> uint16_t wSubAddr;
uint16_t i, t1;
// ADV7511その他初期化処理
<blockquote> for(i=0;;i++){
<blockquote>if(ADV7511_Setup_16bitYuv422toYuv422[i][0] == 0x0 ) break; /* terminate*/
wSubAddr = (uint16_t)ADV7511_Setup_16bitYuv422toYuv422[i][1];
CyFxUsbI2cTransfer (wSubAddr, 0x7a, 1, (uint8_t *)&ADV7511_Setup_16bitYuv422toYuv422[i][2], CyFalse);
}
}
adv7511_init(void)はadv7511_Setup_16bitYuv422toYuv422_registers()を呼び出すための関数になっています。
ADV7511_Setup_16bitYuv422toYuv422という配列に格納された設定値を1要素ずつ、ADV7511のレジスタに設定していきます(1バイトずつI2Cによりレジスタ設定を行います)。
では、次ににADV7511の設定値を記載した配列を準備します。
const uint8_t nv_adv7511_start[][3] = {
/*slv, sub, data*/
{0x39, 0x41, 0x10}, // Main Power Up
{0x39, 0x98, 0x03}, // Must be set to0x03 for proper operation
{0x39, 0x9a, 0xe0}, // Must be set to 0b1110000
{0x39, 0x9c, 0x30}, // Must be set to 0x30 for proper operation
{0x39, 0x9d, 0x61}, // Must be set to 0b01[1:0] for proper operation
{0x39, 0xa2, 0xa4}, // Must be set to 0xA4 for proper operation
{0x39, 0xa3, 0xa4}, // Must be set to 0xA4 for proper operation
{0x39, 0xe0, 0xd0}, // Must be set to 0xD0 for proper operation
{0x39, 0xf9, 0x00}, // This should be set to a non-conflicting I2C address (set to 0x00)
{0x39, 0x43, 0x7e}, //EDID Memory Address
{0x39, 0x45, 0x70}, //Packet Memory I2C Map Address
{0x39, 0xe1, 0x78}, //CEC Map Address
{0x39, 0x40, 0x00}, // packet update Disable
{0x39, 0x44, 0x01}, // packet update Disable
{0x39, 0xe2, 0x01}, // CEC(周辺機器と通信できる機能) power down
// link config
{0x39, 0x15, 0x01}, // I2S sampling freq. 44.1KHz, Input format 16b, 4:2:2, YCrCb
{0x39, 0x16, 0xb9}, // Output format 4:2:2, 8-bit, style 2, DDR falling, Output color space = YCrCb
{0x39, 0x17, 0x02}, // 16:9 Aspect Ratio
{0x39, 0x18, 0x46}, // Color Space Conversion(CSC) disable
{0x39, 0x40, 0x80}, // Enable GC Packet
{0x39, 0x48, 0x00}, // Video Input Bus Reverse= Normal Bus Order,Video Input Justification is Evenly Distributed
{0x39, 0xd0, 0x3c}, // Disable DDR Negative Edge CLK Delay, DDR Negative Edge CLK Delay=Nodelay,
// Sync Pulse Select=no sync pulse,sync adjustment then DE generation
{0x39, 0xba, 0x00}, // External HDCP EEPROM,Clock Delay=-1.2ns,Don’t Show AKSV,HDCP Ri standard
{0x39, 0xde, 0x10}, // Normal TMDS Clock
// SetConfig
{0x39, 0xaf, 0x06}, // HDCP disabled, HDMI mode
// avi infoFrame Setting
{0x39, 0x55, 0x20}, // Y1Y0 (AVI InfoFrame) = YCbCr 422
{0x39, 0x56, 0x28}, // Picture Aspect Ratio = 16:9 Active Format Aspect Ratio = Same as Aspect Ratio
{0x39, 0x44, 0x78}, // avi infoFrame Packet Enable
{0x00, 0x00, 0x00} // I2C終了フラグ
};
※ここで紹介しているADV7511の設定はLinuxドライバ等の設定を参考に弊社で作成したものです。弊社環境での動作確認はしております。また、SVM-03ではこの設定を利用していません。
1080p、60fpsのYUV形式でのカラーバー画像をFPGAからADV7511に送っていますのでその設定になります。
まず初めに、Main Power UpフラグをOnにします。
その後ADV7511は決まりとして、パワーアップ後にいくつかのレジスタを設定する必要があります。
それが、{0x39, 0x98, 0x03}から{0x39, 0xf9, 0x00}の値になります。
それ以降は出力の設定や仕様に合わせてレジスタ値を設定します。
詳細はADV7511のハードウェアユーザーガイドおよびプログラミングガイドをご確認ください。
またレジスタ設定についてはFPGAの部屋の下記の記事が参考になります。
(弊社でも参考にさせていただきました。ありがとうございます!)併せてご覧ください。
・
ZedBoardでHDMI出力10(ADV7511のピクセル入力レジスタ設定)
またFPGAの部屋のブログ内検索で「ADV7511」で検索すると関連記事が表示されます。
最後に今追加した設定をFX3起動時に行えるようにAppThread_Entry関数にadv7511_init関数を追記します。
このように設定して、USBケーブルでPCとボードを接続すると、HDMIモニターにカラーバーが表示されます。
(USBケーブル接続時にFX3の電源がONとなります。)
※注意:ADV7511の設定は接続先モニターやADV7511に入力する信号等により変更する必要があります。
この設定を適用しても動作しない場合がありますのでご了承ください。
ADV7511を設定しカラーバーが表示されました。これでADV7511の初期設定まで完了しました。
次回は、cypress社から提供されているcontrol centerアプリを使用して、I2C通信を行ってみたいと思います。