FC2カウンター FPGAの部屋 2023年05月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

KR260 の Ubuntu 22.04 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる1

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる”と同じことを Ubuntu 22.04 上でやってみたい。

今回は、cmake, make を使用して、cam_dp_ov5642 実行ファイルを生成したのだが、kr260_lap2 をロードして、/sys/class/uio を見ると、Petalinux とは uio の数が違っていたので、cam_dp_ov5642.cpp を書き換える必要があるようだ。

cmake、make でコンパイルする環境を用意する。
~/examples/kr260_lap2/cam_dp ディレクトリを生成して、移動した。
mkdir ~/examples/kr260_lap2/cam_dp
cd ~/examples/kr260_lap2/cam_dp


CMakeLists.txt を作成した。
CMakeLists.txt のソースコードは”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する4 ”を参照のこと。
kr260_cam_disp_264_230529.png

kr260_cam_disp_265_230529.png

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる”のソースコードをコピーして cam_dp_ov5642.cpp を作成した。
kr260_cam_disp_266_230529.png

cam_dp ディレクトリの下に build ディレクトリを作成した。
mkdir build

build ディレクトリに行って cmake を実行した。
cd build
cmake ..

kr260_cam_disp_267_230529.png

cmake が成功した。

make を行った。
make
kr260_cam_disp_268_230529.png

make が成功して、cam_dp_ov5642 実行ファイルが生成された。

せっかく、cam_dp_ov5642 実行ファイルを生成したところだったが、uio のエントリが違っていかも知れないので、kr260_lap2 をロードして、/sys/class/uio を見てみよう。

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2


/sys/class/uio を見ると uio11 まで生成されていた。
kr260_cam_disp_273_230529.png

uio5 〜 uio11 が kr260_lap2 をロードした時に生成された uio の様だ。
各 uio の name を見た結果を下に示す。

uio5 - gpio
uio6 - i2c
uio7 - mt9d111_inf_axis
uio8 - vflip_dma_write2
uio9 - gpio
uio10 - disp_dmar_axis
uio11 - lap_filter_axim


もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4”での uio の対応を下に示す。

uio4 - gpio
uio5 - interrupt-controller
uio6 - i2c
uio7 - mt9d111_inf_axis
uio8 - vflip_dma_write2
uio9 - gpio
uio10 - disp_dmar_axis
uio11 - lap_filter_axim


1 個の uio が多いが、interrupt-controller が異なるようだ。とりあえずは interrupt-controller は使用しないので、デバイス・ツリーはこのままとする。
gpio が以前は uio4 だったが uio5 に変更になっているので、ここのソースコードを変更する必要がある。
他の uio は同じだ。
  1. 2023年05月30日 04:49 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Ubuntu 22.04 上で memread, memwrite を生成した

KR260 の Petalinux 2022.1 上で memread と memwrite を生成した”を参考に、KR260 の Ubuntu 22.04 上で memread, memwrite を生成した。

KR260 の Ubuntu 22.04 上で examples ディレクトリの下に mem ディレクトリを新規作成した。
cd examples
mkdir mem
cd mem


mem ディレクトリに C ソースコードを作成した。
kr260_cam_disp_269_230529.png

memread.c と memwrite.c のソースコードは”KR260 の Petalinux 2022.1 上で memread と memwrite を生成した”を参照のこと。

memread.c と memwrite.c を gcc でコンパイルした。
成功した。
gcc -o memread memread.c
gcc -o memwrite memwrite.c

memread と memwrite 実行ファイルが生成された。
kr260_cam_disp_270_230529.png

memread と memwrite 実行ファイルを実行してみた。
問題ないようだ。
ubuntu@kria:~/examples/mem$ sudo ./memread fd4ab070
[sudo] password for ubuntu: 
00000033
ubuntu@kria:~/examples/mem$ sudo ./memwrite fd4ab070 54
ubuntu@kria:~/examples/mem$ sudo ./memread fd4ab070
00000054
ubuntu@kria:~/examples/mem$ sudo ./memwrite fd4ab070 33
ubuntu@kria:~/examples/mem$ sudo ./memread fd4ab070
00000033
kr260_cam_disp_271_230529.png

  1. 2023年05月30日 03:54 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Ubuntu 22.04 で Vitis アクセラレーション・アプリケーションの laplacian_filter1 を動作させる

Vitis アクセラレーション・アプリケーションの laplacian_filter1 を KR260 の Ubuntu 22.04 で動作させてみたが、”Segmentation fault (core dumped)”だった。

KR260 で Ubuntu 22.04 を起動した。

KR260 の Ubuntu 22.04 にログインして、~/examples ディレクトリに kr260_lap2 ディレクトリを作成した。

KR260 に転送するファイルを KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/file_transfer/lap2_file_transfer から KR260 の Ubuntu 22.04 の ~/examples/kr260_lap2 ディレクトリに転送した。
KR260 の Ubuntu 22.04 の ~/examples/kr260_lap2 ディレクトリの様子を示す。
kr260_cam_disp_257_230528.png

/lib/firmware/xilinx/kr260_lap2 ディレクトリを作成した。
sudo mkdir /lib/firmware/xilinx/kr260_lap2

binary_container_1.xclbin の名前を binary_container_1.bin に変更する。こうしないと、XRT は FPGA ビットストリームを抽出して Kria のプログラマブル ロジックをコンフィグレーションすることができないそうだ。
mv binary_container_1.xclbin binary_container_1.bin

pl.dtbo binary_container_1.bin shell.json ファイルを /lib/firmware/xilinx/kr260_lap2 ディレクトリにコピーした。
sudo cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/kr260_lap2

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2


laplacian_filer1 を実行した。
./laplacian_filter1 binary_container_1.bin
kr260_cam_disp_258_230528.png

エラーが発生した。

./laplacian_filter1: error while loading shared libraries: libcrypt.so.2: cannot open shared object file: No such file or directory


このエラーの対処方法は、”ZynqMP-FPGA-Linux で Vitis 2020.1 でビルドした vadd を動作させる5(libcrypt.so.2 のコピーと vadd の実行)”で経験済みだ。
libcrypt.so.2 は ホストパソコンの KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/sysroots/cortexa72-cortexa53-xilinx-linux/usr/lib ディレクトリにあるので、それを KR260 の Ubuntu 22.04 の /usr/lib にコピーすれば良い。
kr260_cam_disp_259_230528.png

ホストパソコンの KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/sysroots/cortexa72-cortexa53-xilinx-linux/usr/lib/libcrypt.so.2 を KR260 の Ubuntu 22.04 のホーム・ディレクトリに転送して、/usr/lib に移動した。
kr260_cam_disp_260_230528.png

もう一度、laplacian_filer1 を実行した。
./laplacian_filter1 binary_container_1.bin
laplacian_filter1 実行ファイルは実行できたが、ハードウェアは動作していなようだし、”Segmentation fault (core dumped)”になってしまった。
kr260_cam_disp_261_230528.png

laplacian_filter1 IP も pl.dtbo に入っている kr260_lap2 がいけなのか? と思って、kr260_lap をやってみることにした。

~/examples ディレクトリに kr260_lap ディレクトリを作成した。

KR260 に転送するファイルを KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/file_transfer/lap_file_transfer から KR260 の Ubuntu 22.04 の ~/examples/kr260_lap ディレクトリに転送した。

/lib/firmware/xilinx/kr260_lap ディレクトリを作成した。
sudo mkdir /lib/firmware/xilinx/kr260_lap

binary_container_1.xclbin の名前を binary_container_1.bin に変更する。
mv binary_container_1.xclbin binary_container_1.bin

pl.dtbo binary_container_1.bin shell.json ファイルを /lib/firmware/xilinx/kr260_lap ディレクトリにコピーした。
sudo cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/kr260_lap

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap


laplacian_filer1 を実行した。
./laplacian_filter1 binary_container_1.bin
kr260_cam_disp_262_230528.png

kr260_lap2 と同様に laplacian_filter1 実行ファイルは実行できたが、ハードウェアは動作していなようだし、”Segmentation fault (core dumped)”になってしまった。
kr260_cam_disp_263_230528.png
  1. 2023年05月29日 04:26 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

Clocking Wizard の Dynamic Reconfiguration mode を使ってみよう2

Clocking Wizard の Dynamic Reconfiguration mode を使ってみよう1”の続き。

PLL の出力周波数をソフトウェアで動的に変更する機能の Clocking Wizard の Dynamic Reconfiguration mode を使ってみようということで、Adom Taylor さんの”MicroZed Chronicles: Dynamic Clocking”を参照して、やってみたが、ブロック・デザインに手を加えて、カウンタのカウント数で周波数をカウントしている。ただし、出力周波数は設定とは少し異なっていた。今回は、clk_wiz_0 の s_axi_lite に System ILA を挿入して、XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10); のアクセスを調べて、設定周波数ピッタリになるように設定を行ってみよう。

ブロック・デザインの clk_wiz_0 の s_axi_lite の配線を右クリックし、右クリックメニューから Debug を選択して、System ILA を挿入した。
Dynamic_Clocking_10_230526.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。
ハードウェアをエクスポートした。

Vitis で DC_wrapper プラットフォームを右クリックし、Update Hardware Specification を選択して、ハードウェアの仕様をアップデートした。
Vitis の Explorer の Dynamic_Clocking_system をクリックし、トンカチボタンをクリックして、ビルドを行って成功した。
Vitis の Explorer の Dynamic_Clocking_system を右クリックし、右クリックメニューから Dubug As -> 1 Launch Hardware を選択してデバック・モードで起動した。
Dynamic_Clocking_11_230526.png

Vivado で Flow Navigator で PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックし、Auto Connect を選択した。
ILA ダッシュボードが表示された。
Trigger Setup で AWVALID を選択して、Value を R にして、トリガをかけた。
Dynamic_Clocking_12_230526.png

Vitis で Step Over 実行していって、XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10); でトリガがかかった。(実際はその前の行でもトリガがかかったが、もう一度かけなおした)
Dynamic_Clocking_13_230526.png

ILA ダッシュボードの波形を示す。
Dynamic_Clocking_14_230526.png

最初に 0x200 番地に 0x801 を書いて、次に、0x208 番地に 0x49 を書いている。
Clocking Wizard LogiCORE IP Product Guide (PG065)”によると

0x200 番地 ― Clock Configuration Register 0
Bit[25:16] = CLKFBOUT_FRAC Multiply = 0
Bit[15:8] = CLKFBOUT_MULT = 8
Bit[7:0] = DIVCLK_DIVIDE = 1

0x208 番地 - Clock Configuration Register 2
Bit[7:0] = CLKOUT0_DIVIDE = 0x49 (10進で 73)
 Integer part of clkout0 divide value
 For example, for 2.250, this value is 2 = 0x2
Bit[17:8] = CLKOUT0_FRAC Divide = 0
 Fractional part of clkout0 divide value
 For example, for 2.250, this value is 250 = 0xFA


Dynamic Reconfiguration mode における VCO Frequency は以下の式で表せるということだ。(”Clocking Wizard LogiCORE IP Product Guide (PG065)”を参照)
VCO Frequency = (Input Clock Frequency) * (CLKFBOUT_MULT)/DIVCLK_DIVIDE
よって
VCO Frequency = 100 MHz * 8 *1 = 800 MHz
出力周波数 = VCO Frequency / CLKOUT0_DIVIDE.CLKOUT0_FRAC Divide
出力周波数 = 800 MHz / 73.0 ≒ 10.959 MHz となって、この数値はおおむね正しい。

次に、10 MHz にしようとすると CLKOUT0_DIVIDE.CLKOUT0_FRAC Divide = 80.0 とすれば良いので、
CLKOUT0_DIVIDE = 0x50 (10進数で 80)、CLKOUT0_FRAC Divide = 0 とすればよい。つまり、

XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x50);


とすれば良いはずだ。

25 MHz は

XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x20);


20 MHz は

XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x28);


と書き換えて、実行すると、その周波数にほとんど一致した。
Dynamic_Clocking_16_230526.png

XClk_Wiz_SetRate() は周波数がぴったりとは行かないので、その場合は、自分で値を設定した方が良いようだ。

最後に現在の Dynamic_Clocking.c を貼っておく。

// Dynamic_Clocking.c
// 2023/05/18 by marsee
// Referred to "MicroZed Chronicles: Dynamic Clocking"
// https://www.adiuvoengineering.com/post/microzed-chronicles-dynamic-clocking
// 2023/05/27 : Modified by marsee

#include <stdio.h>
#include "xclk_wiz.h"
#include "xgpio.h"
#include "xparameters.h"

XClk_Wiz ClkWiz_Dynamic;
XClk_Wiz_Config *CfgPtr_Dynamic;
XGpio gpio_0, gpio_1;

#define XCLK_WIZARD_DEVICE_ID       XPAR_CLK_WIZ_0_DEVICE_ID
#define XCLK_US_WIZ_RECONFIG_OFFSET 0x0000025C
#define CLK_LOCK            1

int main(){
    u32 count, locked;
    int Status;

    CfgPtr_Dynamic = XClk_Wiz_LookupConfig(XCLK_WIZARD_DEVICE_ID);
    XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic, CfgPtr_Dynamic, CfgPtr_Dynamic->BaseAddr);
    XGpio_Initialize(&gpio_0, XPAR_AXI_GPIO_0_DEVICE_ID);
    XGpio_Initialize(&gpio_1, XPAR_AXI_GPIO_1_DEVICE_ID);

    printf("freq = 40 MHz\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    //XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x50);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 10 MHz, XClk_Wiz_SetRate\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    //XClk_Wiz_SetRate(&ClkWiz_Dynamic, 25);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x20);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 25 MHz\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    //XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x200, 0x0801);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 0x208, 0x28);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 20 MHz, XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    return(0);
}

  1. 2023年05月27日 21:07 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

Clocking Wizard の Dynamic Reconfiguration mode を使ってみよう1

Clocking Wizard の Dynamic Reconfiguration mode を使ってみよう。つまり PLL の出力周波数をソフトウェアで動的に変更する機能だ。

なお、この記事は、Adom Taylor さんの”MicroZed Chronicles: Dynamic Clocking”を参照している。

ZYBO Z7-10 用の Dynamic_Clocking プロジェクトを Vivado 2022.2 で作成した。
Dynamic_Clocking_1_230526.png

MicroZed Chronicles: Dynamic Clocking”を参考にしてブロック・デザインを作成し、それにカウンタを追加してカウント値から Clocking Wizard のクロック出力の周波数を推定する。
なお、CDC は考えていない。簡易的な用途だということでお目こぼし願いたい。
Dynamic Clocking ブロック・デザインを示す。
Dynamic_Clocking_2_230526.png

processing_system7_0 の FCLK_CLK0 の動作周波数は 100 MHz に設定した。
Dynamic_Clocking_3_230526.png

Clocking Wizard の設定を示す。
Clocing Options タブでは Dynamic Reconfig にチェックを入れてある。
Dynamic_Clocking_4_230526.png

Output Clocks タブでは、clk_out1 を 40 MHz に設定した。
Dynamic_Clocking_5_230526.png

Address Editor 画面を示す。
Dynamic_Clocking_6_230526.png

HDL Wrapper を作成して、論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
Dynamic_Clocking_7_230526.png

ハードウェアをエクスポートして、Vitis 2022.2 を起動した。
DC_wrapper プラットフォームと Dynamic_Clocking アプリケーション・プロジェクトを作成した。
Dynamic_Clocking アプリケーション・プロジェクトをビルドして、成功した。
Dynamic_Clocking_8_230526.png

Dynamic_Clocking アプリケーション・プロジェクトを実行したところ、Tera Term に結果が表示された。
Dynamic_Clocking_9_230526.png

最初の 1 秒間のカウントは 40000019 だった。この時は、40 MHz の出力周波数だった。

次に XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10); で 10 MHz にしたときの 1 秒間のカウントは 10958909 だった。10.96 MHz 位とすると、結構ずれている気がする。

3 番目に XClk_Wiz_SetRate(&ClkWiz_Dynamic, 25); で 25 MHz にしたときの 1 秒間のカウントは 25806462 だった。25.81 MHz 位とすると、こちらも結構ずれている気がする。

4 番目に細かい周波数の設定がしたくて XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000); で 20 MHz に設定したつもりだったが、1 秒間のカウントは 25806465 だった。3 番目の設定値から変更されていないようだ。

アプリケーション・ソフトウェアの Dynamic_Clocking.c を貼っておく。

// Dynamic_Clocking.c
// 2023/05/18 by marsee
// Referred to "MicroZed Chronicles: Dynamic Clocking"
// https://www.adiuvoengineering.com/post/microzed-chronicles-dynamic-clocking

#include <stdio.h>
#include "xclk_wiz.h"
#include "xgpio.h"
#include "xparameters.h"

XClk_Wiz ClkWiz_Dynamic;
XClk_Wiz_Config *CfgPtr_Dynamic;
XGpio gpio_0, gpio_1;

#define XCLK_WIZARD_DEVICE_ID       XPAR_CLK_WIZ_0_DEVICE_ID
#define XCLK_US_WIZ_RECONFIG_OFFSET 0x0000025C
#define CLK_LOCK            1

int main(){
    u32 count, locked;
    int Status;

    CfgPtr_Dynamic = XClk_Wiz_LookupConfig(XCLK_WIZARD_DEVICE_ID);
    XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic, CfgPtr_Dynamic, CfgPtr_Dynamic->BaseAddr);
    XGpio_Initialize(&gpio_0, XPAR_AXI_GPIO_0_DEVICE_ID);
    XGpio_Initialize(&gpio_1, XPAR_AXI_GPIO_1_DEVICE_ID);

    printf("freq = 40 MHz\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 10 MHz, XClk_Wiz_SetRate\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    XClk_Wiz_SetRate(&ClkWiz_Dynamic, 25);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 25 MHz\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET, 0);
    XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);
    XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr,
                       XCLK_US_WIZ_RECONFIG_OFFSET,
                       (XCLK_WIZ_RECONFIG_LOAD | XCLK_WIZ_RECONFIG_SADDR));
    Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
    printf("freq = 20 MHz, XClk_Wiz_SetRateHz(&ClkWiz_Dynamic, 20000000);\n");
    XGpio_DiscreteWrite(&gpio_1, 1, 1); // counter SCLR = 1, CE = 0
    usleep(1000);
    XGpio_DiscreteWrite(&gpio_1, 1, 2); // counter SCLR = 0, CE = 1
    sleep(1);
    XGpio_DiscreteWrite(&gpio_1, 1, 0); // counter SCLR = 0, CE = 0
    count = XGpio_DiscreteRead(&gpio_0, 1);
    locked = XGpio_DiscreteRead(&gpio_0, 2);
    printf("count = %d, locked = %d\n\n", count, locked);

    return(0);
}

  1. 2023年05月26日 04:32 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

”実践的!FPGA開発セミナー vol.22”のスライドを公開します

”実践的!FPGA開発セミナー vol.22”のスライドを公開します。

スライドには該当するFPGAの部屋のブログ記事へのリンクが張ってあるので、リンクをクリックしてより詳しい説明をご覧ください。

本日はよろしくお願いいたします。
  1. 2023年05月24日 16:33 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”実践的!FPGA開発セミナー vol.22”で発表します

実践的!FPGA開発セミナー vol.22”で”Vitisのアクセラレーション・アプリケーション開発をエッジで思う存分活用したい。。。2”というタイトルで発表します。

皆さん、よろしくお願いいたします。

なお、午後 5 時ころに今日の発表スライド PDF を公開します。
  1. 2023年05月24日 04:09 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Petalinux を起動している時に KR260 のファンの音を静かにしたい2

KR260 のファンの音を静かにしたい”の続き。

Ubuntu を起動している場合は、今でもファンの音は静かなので、改題した。

前回は、KR260 の Petalinux が起動した後で Petalinux の設定を確認したところ、”CONFIG_SENSORS_PWM_FAN=y”だったので、pwm_fan0 のエントリを pl.dtsi に追加して、コンパイルし、できた pl.dtbo を使用したが、ファンの音は静かにならなかった。今回は、デバイスツリーの system-user.dtsi に ttc0 のエントリを追加して、Petalinuxをビルドした。再生成された dtb ファイルを KR260 の Petalinux ブート用 MicroSD カードの boot パーティションの dtb と入れ替えたら、ファンが静かになった。成功だ。

まずは、デバイス・ツリーで ttc0: timer@ff110000 のエントリを調べると、linux_os/components/plnx_workspace/device-tree/device-tree/zynqmp.dtsi にあった。
KR260_FAN_8_230523.png

status = "disabled"; だったので、okay にしたい。

linux_os/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi を編集して ttc0 のエントリを追加した。
KR260_FAN_9_230523.png

現在の system-user.dtsi を貼っておく。

/include/ "system-conf.dtsi"
/ {
    chosen {
                bootargs = "earlycon console=ttyPS1,115200 clk_ignore_unused xilinx_tsn_ep.st_pcp=4 init_fatal_sh=1 cma=900M uio_pdrv_genirq.of_id=generic-uio";
                stdout-path = "serial1:115200n8";
        };
};

&ttc0 {
    status = "okay";
    #pwm-cells = <3>;
};



ビルドを行って成功した。
petalinux-build
KR260_FAN_10_230523.png

ビルドの結果のデバイス・ツリーを見てみよう。
linux_os/images/linux ディレクトリに行く。
cd images/linux
KR260_FAN_11_230523.png

system-zynqmp-sck-kr-g-revB.dtb が再生成されていたので、これを dts に戻してみてみよう。
dtc -@ -O dts -o system.dts system-zynqmp-sck-kr-g-revB.dtb
KR260_FAN_12_230523.png

system.dts が生成された。
KR260_FAN_13_230523.png

system.dts を見ると、timer@ff110000 が status = "okay"; になっている。
KR260_FAN_14_230523.png

今まで KR260 で Petalinux 2022.1 を起動していた MicroSD カードを持ってきて、boot パーティションを見ると、system.dtb と system-zynqmp-sck-kr-g-revB.dtb があった。
この 2 個の dtb ファイルはちょうど大きさが同じで同じもののようだ。
KR260_FAN_15_230523.png

org ディレクトリを新規作成して、この 2 個の dtb ファイルを org ディレクトリに移した。
linux_os/images/linux/system-zynqmp-sck-kr-g-revB.dtb を MicroSD カードの boot パーティションにコピーした。
その system-zynqmp-sck-kr-g-revB.dtb をコピーして、名前を system.dtb に変更した。
KR260_FAN_16_230523.png

MicroSD カードを KR260 に挿入して、Petalinux をブートするとファンが静かになった。成功だ。。。

/sys/class/hwmon ディレクトリを見ると、hwmon2 ディレクトリができていた。
KR260_FAN_17_230523.png

name ファイルは pwmfan だった。
KR260_FAN_18_230523.png

pwm1 ファイルには、15 と書いてあった。

ファンは時々止まったり動いたりしてるので、温度は?と不安になり温度を見るソフトウェアを探したが、見つからなかった。
そこで、Vivado の SysMon を開いたが、温度は 31 度程度だったので、問題無さそうだ。
KR260_FAN_19_230523.png

さて、自分のアプリケーション・ソフトウェアを起動する時もファンが静かになっているのか?を調べる。
現在、ロードされているアクセラレーション・アプリケーションをアンロードすると、ファンが全力で回り始めた。
cd ~/examples/kr260_lap2
sudo xmutil unloadapp


kr260_lap2 をロードすると、ファンが静かになった。
sudo xmutil loadapp kr260_lap2
KR260_FAN_20_230523.png

fancontrol
コマンドを実行した。
エラーが出ているが、このファイルは確認したはずなんだけど。。。
KR260_FAN_21_230523.png

ファンの回転数が上がることもあったので、たぶん負荷がかかるとファンの回転数が上がると思う。
いろいろと教えていただいた ikwzm さんに感謝いたします。
  1. 2023年05月23日 04:31 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 のファンの音を静かにしたい

KR260 のファンの音がうるさいので、静かにしたいと思っていた。ikwzm さんにやり方を教えてもらったので、やってみたがうまく行かなかった。

なお、Vivado の kr260_cam_disp プロジェクトでは ttc0 の設定を行って、fan_enb_b 出力を設けてある。”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する1”、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する2”参照。

kr260_cam_disp プラットフォーム用の Petalinux のディレクトリ linux_os ディレクトリでカーネルの設定を確認した。
petalinux-config -c kernel

Device Driver > Hardware Monitoring support > PWM fan に * が付いているのを確認した。
KR260_FAN_1_230521.png

KR260 の Petalinux が起動した後で、
zcat /proc/config.gz > config.txt
で、カーネルの設定を確認したところ

CONFIG_SENSORS_PWM_FAN=y

があったので、これで良いと思う。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtsi を編集して、pwm-fan のエントリを追加した。
KR260_FAN_6_230521.png

            pwm_fan0: pwm-fan {
                compatible = "pwm-fan";
                status = "okay";
                pwms = <&ttc0 2 40000 0>;
            };


pl.dtsi をコンパイルして pl.dtbo を生成した。
dtc -@ -O dtb -o pl.dtbo pl.dtsi

pl.dtbo を KR260 の Petalinux の ~/examples/kr260_lap2 に転送した。
KR260_FAN_4_230521.png

pl.dtbo を /lib/firmware/xilinx/kr260_lap2 にコピーした。
sudo cp pl.dtbo /lib/firmware/xilinx/kr260_lap2

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2

KR260_FAN_5_230521.png

pwm_fan0 はロードされているようだが、ファンは静かにならない。。。orz
KR260_FAN_7_230521.png
  1. 2023年05月22日 05:03 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋のまとめサイトの更新(2023年5月21日)

FPGAの部屋のまとめ サイト”を更新しました。
ZUBoard 1CG”のエントリを追加して、2023 年 5 月 21 日までの記事をまとめました。
  1. 2023年05月21日 05:34 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Vivado 2023.1 がでました

昨日、Vivado 2023.1 がでました。
まだ本格的に使っていないので、分かりませんが、ロゴがAMD Viavdo に変更になっていました。
Vivado_2023_1_230519.png

時代の流れですね。思えば、Altera も Intel になっていますね。

さて、Vivado 2023.1 の 新機能です。
Power Design Manager (PDM) が統合インストーラーに含まれる”そうです。

シミュレーションでは、コード カバレッジ サポートだそうです。

インプリメンテーション & 合成では、配置配線中の柔軟な MARK_DEBUG 処理が追加になっています。
  1. 2023年05月19日 04:26 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用してラプラシアン・フィルタを動作させる

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する5”の続き。

前回で、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを使用した Vitis のラプラシアン・フィルタ・プロジェクトのビットストリームを使用して、カメラ画像を KR260 の DisplayPort に出力することができた。今回は、ラプラシアン・フィルタ結果も表示する様にアプリケーション・ソフトウェアの cam_dp_ov5642.cpp を変更して、コンパイルし、カメラ画像だけでなく、ラプラシアン・フィルタ処理画像も表示できるようにした。

cam_dp_ov5642.cpp をラプラシアン・フィルタ結果も表示する様に変更した。

~/examples/kr260_lap2/cam_dp/build ディレクトリに行って、cmake を実行した。
cd ~/examples/kr260_lap2/cam_dp/build/
cmake ..


make を実行した。
make
cam_dp_ov5642 実行ファイルが生成された。

u-dma-buf をロードした。
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2
sudo chmod 666 /dev/uio*


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01

cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
kr260_cam_disp_255_230517.png

カメラ画像が正常に表示された。
w コマンドで bmp 画像を取得したので、貼っておく。
kr260_cam_disp_257_230517.jpg

f コマンドでカメラ画像のラプラシアン・フィルタ処理画像に切り替えたら、ラプラシアン・フィルタ処理画像が表示された・
w コマンドで取得した bmp 画像を貼っておく。
kr260_cam_disp_258_230517.jpg

c コマンドでカメラ画像が表示された。
ソフトウェアは問題なく動作している。

これで、”Vitis のアクセラレーション・プラットフォームを使用して、お手軽?に回路を作成する”ことができるようになった。

最後に cam_disp_ov5642.cpp を貼っておく。

// cam_dp_ov5642.cpp (for KR260)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform
// 2023/05/15 : bug fix
// 2023/05/16 : Added support for lap_filter_axim

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  4

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11, fd_lap;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *active_frame_gpio, *lap_filter_axim;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    bool filter_on = false;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio7 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio6 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio10", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio10 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio8 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio9 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // active_frame_gpio-uio IP (active_frame input)
    fd6 = open("/dev/uio4", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio4 (active_frame_gpio) open error\n");
        exit(-1);
    }
    active_frame_gpio = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "active_frame_gpio mmap error\n");
        exit(-1);
    }
    
    // laplacian_fliter-uio IP (active_frame input)
    fd_lap = open("/dev/uio11", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd_lap < 1){
        fprintf(stderr, "/dev/uio11 (lap_filter_axim) open error\n");
        exit(-1);
    }
    lap_filter_axim = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_lap, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "lap_filter_axim mmap error\n");
        exit(-1);
    }
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // lap_filer_axm initialize
    lap_filter_axim[5] = 0 ; // bit 31~0 - cam_fb[63:32] (Read/Write)
    lap_filter_axim[7] = phys_addr+3*all_disp_addr; // bit 31~0 - lap_fb[31:0] (Read/Write)
    lap_filter_axim[8] = 0; // bit 31~0 - lap_fb[63:32] (Read/Write)
    switch (resolution){
        case 0 : // SVGA
            lap_filter_axim[10] = SVGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = SVGA_VERTICAL_LINES;
            break;
        case 1 : // XGA
            lap_filter_axim[10] = XGA_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = XGA_VERTICAL_LINES;
            break;
        default : // HD
            lap_filter_axim[10] = HD_HORIZONTAL_PIXELS;
            lap_filter_axim[12] = HD_VERTICAL_LINES;
            break;
    }

    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution, filter_on);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'f' : // laplacian_filter on
                filter_on = true;
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                int read_frame;
                if (active_frame == 0)
                    read_frame = 2;
                else if (active_frame == 1)
                    read_frame = 0;
                else // active_frame == 2
                    read_frame = 1;
                lap_filter_axim[4] = phys_addr+read_frame*all_disp_addr;
                lap_filter_axim[0] = 0x81; // ap_start + auto_restart

                disp_dmar_axis[4] = phys_addr+3*all_disp_addr; // fb0
                disp_dmar_axis[6] = phys_addr+3*all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+3*all_disp_addr; // fb2
                break;
            case 'c' : // Display camera image
                filter_on = false;
                lap_filter_axim[0] = 1; // ap_start
                disp_dmar_axis[4] = phys_addr; // fb0
                disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
                disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
                break; 
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)active_frame_gpio, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution, bool filter_on){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr;
    if (filter_on == false){
        offset_addr = read_frame * img_width * img_height;
    }else{
        offset_addr = 3 * img_width * img_height;
    }

    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年05月18日 04:22 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する5

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4”の続き。

Vivado 2022.1 で KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを作成していて、kr260_cam_disp プロジェクトのバグが分かったので、もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、file_transfer/lap2_file_transfer ディレクトリを作成し、KR260 の Petalinux 2022.1 に転送するファイルを集めて、examples/kr260_lap2 ディレクトリに転送した。KR260 の Petalinux 2022.1 で /lib/firmware/xilinx に kr260_lap2 ディレクトリを作成して、転送されたファイルの一部をコピーした。kr260_lap2 を xmutil コマンドでロード後に、/sys/class/uio ディレクトリを見たところ、uio0 〜 uio11 が実装されていた。今回は、アプリケーション・ソフトウェアの cam_dp_ov5642.cpp を用意して、make して、実行形式ファイルを生成した。その実行形式ファイルを実行したところ、カメラ画像が DisplayPort に表示された。成功だ。。。

KR260 の Petalinux 2022.1 上で ~/examples/kr260_lap2 ディレクトリに下に cam_dp ディレクトリを作成した。

~/examples/kr260_lap2/cam_dp ディレクトリの下に build ディレクトリを作成した。

~/examples/kr260_lap/cam_dp ディレクトリから ~/examples/kr260_lap2/cam_dp ディレクトリに CMakeLists.txt をコピーした。

~/examples/kr260_lap/cam_dp ディレクトリから cam_dp_ov5642.cpp を修正してコピーした。
cam_dp_ov5642.cpp を示す。
kr260_cam_disp_250_230515.png

~/examples/kr260_lap2/cam_dp ディレクトリを示す。
kr260_cam_disp_249_230515.png

~/examples/kr260_lap2/cam_dp/build ディレクトリに行って、cmake を実行した。
cd ~/examples/kr260_lap2/cam_dp/build/
cmake ..

kr260_cam_disp_251_230515.png

make を実行した。
make
cam_dp_ov5642 実行ファイルが生成された。
kr260_cam_disp_252_230515.png

u-dma-buf をロードした。
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*


現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードした。(前回ロードしているが、日を改めたので、もう一度ロードする)
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2
sudo chmod 666 /dev/uio*


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01


cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
kr260_cam_disp_253_230515.png

カメラ画像が DisplayPort から表示された。
ディスプレイに表示されているのは 1920 x 1080 の HD 解像度だが、カメラ画像は SVGA なので、小さく真ん中に表示されている。
kr260_cam_disp_254_230515.jpg

最後に cam_dp_ov5642.cpp を貼っておく。

// cam_dp_ov5642.cpp (for KR260)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform
// 2023/05/15 : bug fix

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  3

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *active_frame_gpio;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio7 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio6 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio10", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio10 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio8 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio9 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // active_frame_gpio-uio IP (active_frame input)
    fd6 = open("/dev/uio4", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio4 (active_frame_gpio) open error\n");
        exit(-1);
    }
    active_frame_gpio = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!active_frame_gpio){
        fprintf(stderr, "active_frame_gpio mmap error\n");
        exit(-1);
    }
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(active_frame_gpio[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)active_frame_gpio, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr = read_frame * img_width * img_height;
    
    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年05月17日 04:05 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する3”の続き。

Vivado 2022.1 で KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを作成していて、kr260_cam_disp プロジェクトのバグが分かったので、もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、xsct を使用したデバイスツリー・オーバレイを作成し、pl.dtsi 上の動作させる IP の compatible を generic-uio に変更して、コンパイルし pl.dtbo を生成した。今回は、file_transfer/lap2_file_transfer ディレクトリを作成し、KR260 の Petalinux 2022.1 に転送するファイルを集めて、examples/kr260_lap2 ディレクトリに転送した。KR260 の Petalinux 2022.1 で /lib/firmware/xilinx に kr260_lap2 ディレクトリを作成して、転送されたファイルの一部をコピーした。kr260_lap2 を xmutil コマンドでロード後に、/sys/class/uio ディレクトリを見たところ、uio0 〜 uio11 が実装されていた。

必要なファイルを KR260 の Petalinux 2022.1 に転送するために集めよう。
KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/file_transfer/lap2_file_transfer ディレクトリを作成した。

前回作成した KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo を file_transfer/lap2_file_transfer ディレクトリにコピーした。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system/Hardware/binary_container_1.xclbin を file_transfer/lap2_file_transfer ディレクトリにコピーした。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1/Hardware/laplacian_filter1 を file_transfer/lap2_file_transfer ディレクトリにコピーした。

shell.json はすでに作成済みなので、vadd_filer_transfer ディレクトリからコピーした。

file_transfer/lap2_file_transfer ディレクトリの様子を示す。
kr260_cam_disp_243_230515.png

KR260 の Petalinux 2022.1 で ~/examples ディレクトリの下に kr260_lap2 ディレクトリを作成した。
file_transfer/lap2_file_transfer ディレクトリのファイルを K260 の ~/examples/kr260_lap2 ディレクトリに転送した。
kr260_cam_disp_244_230515.png

/lib/firmware/xilinx/kr260_lap2 ディレクトリを作成し、ファイルを転送した。その際に、binary_container_1.xclbin は binary_container_1.bin に名前を変更した。
cd ~/examples/kr260_lap2
sudo mkdir /lib/firmware/xilinx/kr260_lap2
mv binary_container_1.xclbin binary_container_1.bin
sudo cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/kr260_lap2

kr260_cam_disp_245_230515.png

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap2 をロードした。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap2

kr260_cam_disp_246_230515.png

ターミナルのログを示す。
kr260_cam_disp_247_230515.png

 [  135.946896] som-dashboard.sh[1338]: Cant find IP addr, please call /usr/bin/som-dashboard.sh after assigning IP addr
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/firmware-name
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/resets
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay1
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/afi0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/clocking1
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/overlay2
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/active_frame
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/misc_clk_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/axi_intc_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_axi_iic_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_mt9d111_inf_axis_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/camera_vflip_dma_write2_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_axi_gpio_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/display_disp_dmar_axis_0
May  8 04:52:49 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__symbols__/lap_filter_axim_1


/sys/class/uio に uio が追加されていた。
kr260_cam_disp_248_230515.png

uio の name を確認したところ、uio4 〜 uio11 までが pl.dtbo で追加された uio だった。
uio の対応表を示す。

uio4 - gpio
uio5 - interrupt-controller
uio6 - i2c
uio7 - mt9d111_inf_axis
uio8 - vflip_dma_write2
uio9 - gpio
uio10 - disp_dmar_axis
uio11 - lap_filter_axim

  1. 2023年05月16日 04:16 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する3

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する2”の続き。

Vivado 2022.1 で KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを作成していて、kr260_cam_disp プロジェクトのバグが分かったので、もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Vitis 2022.1 の kr260_cam_disp プラットホームをアップデートしてビルドし、kr260_vadd と laplacian_filter1 アプリケーション・プロジェクトをビルドした。その後、laplacian_filter1 アプリケーション・プロジェクトの Vivado プロジェクトの kr260_bd ブロック・デザインを確認し、アップデートされていることを確認した。今回は、xsct を使用したデバイスツリー・オーバレイを作成し、pl.dtsi 上の動作させる IP の compatible を generic-uio に変更して、コンパイルして pl.dtbo を生成した。

xsct コマンドを使用してデバイスツリー・オーバレイの pl.dtsi と pl.dtbo を作成する

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリで xsct コマンドを実行した。
なお、XSA ファイルは、KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/kr260_cam_disp.xsa ファイルを使用する。
つまり、Vitis アクセラレーション・アプリケーション・プロジェクトで作成したラプラシアン・フィルタを含むデバイス・ツリーを作成する。
cd /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp_platform
xsct

createdts -hw ./laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/kr260_cam_disp.xsa -zocl -platform-name kr260_cam_disp -git-branch xlnx_rel_v2022.1 -overlay -compile -out ./dtg/dtg_kr260_cam_disp

exit

kr260_cam_disp_237_230514.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp に pl.dtbi が生成された。
kr260_cam_disp_238_230514.png

pl.dtbi を示す。
kr260_cam_disp_239_230514.png

pl.dtsi で動作させる可能性のある IP の compatible を generic-uio に変更した。
kr260_cam_disp_240_230514.png

現在の pl.dtbi を示す。

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2022.1
 * Today is: Sun May 14 16:46:28 2023
 */


/dts-v1/;
/plugin/;
/ {
    fragment@0 {
        target = <&fpga_full>;
        overlay0: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            firmware-name = "kr260_cam_disp.bit.bin";
            resets = <&zynqmp_reset 116>, <&zynqmp_reset 117>, <&zynqmp_reset 118>, <&zynqmp_reset 119>;
        };
    };
    fragment@1 {
        target = <&amba>;
        overlay1: __overlay__ {
            afi0: afi0 {
                compatible = "xlnx,afi-fpga";
                config-afi = < 0 0>, <1 0>, <2 0>, <3 0>, <4 0>, <5 0>, <6 0>, <7 0>, <8 0>, <9 0>, <10 0>, <11 0>, <12 0>, <13 0>, <14 0xa00>, <15 0x000>;
            };
            clocking0: clocking0 {
                #clock-cells = <0>;
                assigned-clock-rates = <99999001>;
                assigned-clocks = <&zynqmp_clk 71>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 71>;
                compatible = "xlnx,fclk";
            };
            clocking1: clocking1 {
                #clock-cells = <0>;
                assigned-clock-rates = <23809286>;
                assigned-clocks = <&zynqmp_clk 72>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 72>;
                compatible = "xlnx,fclk";
            };
        };
    };
    fragment@2 {
        target = <&amba>;
        overlay2: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            active_frame: gpio@80060000 {
                #gpio-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                gpio-controller ;
                reg = <0x0 0x80060000 0x0 0x10000>;
                xlnx,all-inputs = <0x1>;
                xlnx,all-inputs-2 = <0x0>;
                xlnx,all-outputs = <0x0>;
                xlnx,all-outputs-2 = <0x0>;
                xlnx,dout-default = <0x00000000>;
                xlnx,dout-default-2 = <0x00000000>;
                xlnx,gpio-width = <0x2>;
                xlnx,gpio2-width = <0x20>;
                xlnx,interrupt-present = <0x0>;
                xlnx,is-dual = <0x0>;
                xlnx,tri-default = <0xFFFFFFFF>;
                xlnx,tri-default-2 = <0xFFFFFFFF>;
            };
            misc_clk_0: misc_clk_0 {
                #clock-cells = <0>;
                clock-frequency = <199998000>;
                compatible = "fixed-clock";
            };
            axi_intc_0: interrupt-controller@80000000 {
                #interrupt-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                interrupt-controller ;
                interrupt-names = "irq";
                interrupt-parent = <&gic>;
                interrupts = <0 89 4>;
                reg = <0x0 0x80000000 0x0 0x10000>;
                xlnx,kind-of-intr = <0xfffffffd>;
                xlnx,num-intr-inputs = <0x20>;
            };
            camera_axi_iic_0: i2c@80010000 {
                #address-cells = <1>;
                #size-cells = <0>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80010000 0x0 0x10000>;
            };
            camera_mt9d111_inf_axis_0: mt9d111_inf_axis@80020000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "s_axi_lite_aclk", "m_axis_aclk";
                clocks = <&misc_clk_0>, <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80020000 0x0 0x10000>;
            };
            camera_vflip_dma_write2_0: vflip_dma_write2@80030000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80030000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            display_axi_gpio_0: gpio@80040000 {
                #gpio-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                gpio-controller ;
                reg = <0x0 0x80040000 0x0 0x10000>;
                xlnx,all-inputs = <0x0>;
                xlnx,all-inputs-2 = <0x0>;
                xlnx,all-outputs = <0x1>;
                xlnx,all-outputs-2 = <0x0>;
                xlnx,dout-default = <0x00000000>;
                xlnx,dout-default-2 = <0x00000000>;
                xlnx,gpio-width = <0x1>;
                xlnx,gpio2-width = <0x20>;
                xlnx,interrupt-present = <0x0>;
                xlnx,is-dual = <0x0>;
                xlnx,tri-default = <0xFFFFFFFF>;
                xlnx,tri-default-2 = <0xFFFFFFFF>;
            };
            display_disp_dmar_axis_0: disp_dmar_axis@80050000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80050000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            lap_filter_axim_1: lap_filter_axim@a0000000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                /*clock-names = "ap_clk";
                clocks = <&misc_clk_0>;*/
                compatible = "generic-uio";
                /*interrupt-names = "interrupt";
                interrupt-parent = <&axi_intc_0>;
                interrupts = <1 2>;*/
                reg = <0x0 0xa0000000 0x0 0x10000>;
                /*xlnx,s-axi-control-addr-width = <0x6>;
                xlnx,s-axi-control-data-width = <0x20>;*/
            };
            zyxclmm_drm {
                compatible = "xlnx,zocl";
                interrupts-extended = <&axi_intc_0 0 4>, <&axi_intc_0 1 4>, <&axi_intc_0 2 4>, <&axi_intc_0 3 4>, <&axi_intc_0 4 4>, <&axi_intc_0 5 4>, <&axi_intc_0 6 4>, <&axi_intc_0 7 4>, <&axi_intc_0 8 4>, <&axi_intc_0 9 4>,
<&axi_intc_0 10 4>, <&axi_intc_0 11 4>, <&axi_intc_0 12 4>, <&axi_intc_0 13 4>, <&axi_intc_0 14 4>,
<&axi_intc_0 15 4>, <&axi_intc_0 16 4>, <&axi_intc_0 17 4>, <&axi_intc_0 18 4>, <&axi_intc_0 19 4>,
<&axi_intc_0 20 4>, <&axi_intc_0 21 4>, <&axi_intc_0 22 4>, <&axi_intc_0 23 4>, <&axi_intc_0 24 4>,
<&axi_intc_0 25 4>, <&axi_intc_0 26 4>, <&axi_intc_0 27 4>, <&axi_intc_0 28 4>, <&axi_intc_0 29 4>,
<&axi_intc_0 30 4>, <&axi_intc_0 31 4 >;
            };
        };
    };
};


変更した pl.dtsi をコンパイルして pl.dtbo を生成する。
dtc -@ -O dtb -o ./dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo ./dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtsi
kr260_cam_disp_241_230514.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg/dtg_kr260_cam_disp/dtg/dtg_kr260_cam_disp/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp に pl.dtbo が生成された。
kr260_cam_disp_242_230514.png
  1. 2023年05月15日 04:28 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する2

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する1”の続き。

Vivado 2022.1 で KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを作成していて、kr260_cam_disp プロジェクトのバグが分かったので、もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを修正して、論理合成、インプリメンテーション、ビットストリームの生成を行って、XSA ファイルを生成した。今回は、Vitis 2022.1 の kr260_cam_disp プラットホームをアップデートしてビルドし、kr260_vadd と laplacian_filter1 アプリケーション・プロジェクトをビルドした。その後、laplacian_filter1 アプリケーション・プロジェクトの Vivado プロジェクトの kr260_bd ブロック・デザインを確認し、アップデートされていることを確認した。

Vitis 2022.1 を起動して、KR260/kr260_cam_disp_platform/kr260_cam_disp_platform をワークスペースとして、指定した。

kr260_cam_disp プラットホームをアップデートする。
kr260_cam_disp を右クリックし右クリックメニューから Update Hardware Specification を選択してアップデートする。
Update Hardware Specification ダイアログが開く。
Hardware Specification File に KR260/kr260_cam_disp_platform/kr260_cam_disp/kr260_cam_disp.xsa を指定する。
kr260_cam_disp_232_230513.png

kr260_cam_disp プラットホームをトンカチ・ボタンをクリックして、ビルドして成功した。

kr260_vadd_system と laplacian_filter1_system もトンカチ・ボタンをクリックして、ビルドして成功した。
kr260_cam_disp_233_230513.png

書き換わったはずの Vivado プロジェクト、KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/prj.xpr を Vivado 2022.1 に読み込んで、確認した。
プロジェクトを Vivado 2022.1 に読み込んで、kr260_bd ブロック・デザインを表示した。
display 階層モジュールの axi_clk には 200 MHz クロックが入力されていて正しかった。
kr260_cam_disp_234_230513.png

Address Editor 画面を示す。
kr260_cam_disp_235_230513.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/prj.xpr でハードウェアをエクスポートした。
File メニューから Export -> Export Platform... を選択する。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。

Platform Type 画面では、Hardware ラジオボタン(デフォルト設定)をクリックする。
Next > ボタンをクリックする。

Platform State 画面では、Include bitstream のチェック・ボックスにチェックを入れた。
Next > ボタンをクリックする。

Platform Properties 画面では、Name に kr260_cam_disp_platform と入力した。
Next > ボタンをクリックする。

Output File 画面では、XSA file name に kr260_cam_disp と入力した。
Next > ボタンをクリックする。

サーマリ画面が表示された。
Finish ボタンをクリックした。

kr260_cam_disp.xsa ファイルが KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj ディレクトリに生成された。
kr260_cam_disp_236_230513.png

  1. 2023年05月14日 14:51 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する1

Vivado 2022.1 で KR260 対応の kr260_cam_disp3 プロジェクトの kr260_bd ブロック・デザインを作成していて、kr260_cam_disp プロジェクトのバグが分かったので、もう一度、KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しよう。

バグは、display 階層モジュールの axi_clk が pl_clk0 の 100 MHz に接続されていたことだ。HD 解像度の場合、ピクセル・クロックは 148.5 MHz なので、100 MHz ではピクセル・データの供給が間に合わない。axi_clk は 200 MHz に接続されるべきだった。
kr260_cam_disp_224_230512.png

display 階層モジュールでは、 axi_clk は disp_dmar_axis_0 と axi2video_out_0 のクロックに入っている。
kr260_cam_disp_225_230512.png

display 階層モジュールの axi_clk を 200 MHz の clk_wiz_0 の clk_out2 に接続し、リセットも proc_sys_reset_1 の peripheral_aresetn に接続した。
更に、active_frame を PS で見るために、AXI GPIO を追加した。
kr260_cam_disp_226_230512.png

Address Editor の結果を示す。
kr260_cam_disp_229_230512.png

これで、ブロック・デザインをセーブして、論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
kr260_cam_disp_230_230512.png

ハードウェアをエクスポートして、XSA ファイルを生成する。
File メニューから Export -> Export Platform... を選択する。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。

Platform Type 画面では、Hardware ラジオボタン(デフォルト設定)をクリックする。
Next > ボタンをクリックする。

Platform State 画面では、Include bitstream のチェック・ボックスにチェックを入れた。
Next > ボタンをクリックする。

Platform Properties 画面では、Name に kr260_cam_disp_platform と入力した。
Next > ボタンをクリックする。

Output File 画面では、XSA file name に kr260_cam_disp と入力した。
Next > ボタンをクリックする。

サーマリ画面が表示された。
Finish ボタンをクリックした。

kr260_cam_disp.xsa ファイルが再生成された。
kr260_cam_disp_231_230512.png
  1. 2023年05月13日 05:49 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム3を作成する1

KR260 で PS の DisplayPort の同期信号に合わせてカメラ画像を出力し、DisplayPort に出力しようとしてきたが、うまくカメラ画像が表示できない。そこで、今度は、同期信号を自分で作成し、カメラ画像を PS の DiaplayPort から出力しようと思う。

最初に、KR260 ディレクトリ上に kr260_cam_disp3_platform ディレクトリを作成した。
kr260_cam_disp3_platform ディレクトリの下に VIvado 2022.1 の KR260 対応の kr260_cam_disp3 プロジェクトを作成した。
なお、Project Type 画面で、Project is an extensible Vitis platform にチェックを入れてある。
kr260_cam_disp_211_230511.png

kr260_cam_disp3 プロジェクトのディレクトリに kr260_cam_disp プロジェクトのディレクトリから axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vflip_dma_write_IP, kr260_bd.tcl をコピーした。

IP Catlog に axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vflip_dma_write_IP を登録した。
kr260_cam_disp_213_230511.png

Vivado の Tcl Console で kr260_cam_dp2 プロジェクトのディレクトリに cd して、kr260_bd.tcl をコピーして実行した。
cd /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp3_platform/kr260_cam_disp3
source kr260_bd.tcl


kr260_bd ブロック・デザインが生成できた。
kr260_cam_disp_214_230511.png

Platform Setup ウインドウで Platform Name は kr260_cam_disp3_platform に変更した。
kr260_cam_disp_215_230511.png

トリプル・バッファの AXI4-Stream 出力 DMA を KR260 用に変更する”の DMA2axis_3buf と”AXI4-Stream 入出力のビットマップ・ディスプレイ・コントローラを KR260 対応にする”の bitmap_disp_cont_axis をディレクトリを作成して、IP をコピーした。
kr260_cam_disp_216_230511.png

IP Catlog に DMA2axis_3buf と bitmap_disp_cont_axis を登録した。
kr260_cam_disp_217_230511.png

kr260_cam_disp プロジェクトから、制約ファイルの kr260_cam_disp.xdc をコピーした。
kr260_cam_disp_218_230511.png

kr260_cam_disp プロジェクトの様子を示す。
kr260_cam_disp_219_230511.png
  1. 2023年05月12日 05:07 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream 入出力のビットマップ・ディスプレイ・コントローラを KR260 対応にする

ビットマップ・ディスプレイ・コントローラをAXI4-Stream対応にする6(Vivado 2022.1 で IP作成)”の bitmap_disp_cont_axis IP を KR260 対応に変更しよう。

Vivado 2022.1 で KR260 対応の bitmap_disp_cont_axis プロジェクトを作成した。
kr260_cam_disp_200_230509.png

bitmap_disp_cont_axis プロジェクトに bitmap_disp_cont_axis.v, bitmap_disp_engine.v, bm_disp_cntrler_axi_lite_slave.v video_timing_param.vh を Add source した。

IP Catlog を開いて、FIFO Generator を起動して、bitmap_afifo を作成した。
kr260_cam_disp_201_230509.png

Basic タブの設定を示す。
Fifo Implementation は independent Clocks Block RAM に設定した。
kr260_cam_disp_202_230509.png

Native Ports タブの設定を示す。
Read Mode は First Word Fall Through とした。
Data Port Parameters の Write Width は 32 、Write Depth は 512 とした。
Initialization の Enable Reset Synchronaization のチェックを外した。
kr260_cam_disp_203_230509.png

Status Flags タブの設定を示す。
Overflow FlagUnderflow Flag にチェックを入れた。
kr260_cam_disp_204_230509.png

Data Conts タブの設定を示す。
More Accurate Data Counts にチェックを入れた。
Write Data Count (Synchronized with Write Clk) にチェックを入れた。
kr260_cam_disp_205_230509.png

Summary タブの内容を示す。
kr260_cam_disp_206_230509.png

OK ボタンを押すと、Generate Output Products ダイアログが表示されたので、Generate ボタンをクリックした。
kr260_cam_disp_207_230509.png

bitmap_afifo が生成された。
kr260_cam_disp_208_230509.png

Vivado の Tools メニューから Create and Package New IP... を選択して、bitmap_disp_cont_axis IP を作成した。
kr260_cam_disp_209_230509.png

HDL/2022.1/KR260/bitmap_disp_cont_axis/bitmap_disp_cont_axis.srcs/sources_1 ディレクトリに user.org_user_bitmap_disp_cont_axis_1.0.zip が生成された。
kr260_cam_disp_210_230509.png
  1. 2023年05月11日 04:44 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

トリプル・バッファの AXI4-Stream 出力 DMA を KR260 用に変更する

ZYBO Z7-20 用カメラ画像表示システムの作成1”のディスプレイ回路を KR260 の DisplayPort 出力に利用しようということで、今回は、トリプル・バッファの AXI4-Stream 出力 DMA (DMA2axis_3buf)を KR260 用に変更しよう。

トリプル・バッファの AXI4-Stream 出力 DMA 1(DMA2axis_3buf)”、”トリプル・バッファの AXI4-Stream 出力 DMA 2(DMA2axis_3buf)”の DMA2axis_3buf IP のプロジェクト・ディレクトリをコピーして、KR260 用に変更する。

/media/masaaki/Ubuntu_Disk/Vitis_HLS/KR260/2022.1 ディレクトリに DMA2axis_3buf ディレクトリをコピーした。

Vitis HLS 2022.1 を起動して、/media/masaaki/Ubuntu_Disk/Vitis_HLS/KR260/2022.1/DMA2axis_3buf ディレクトリのプロジェクトを開いた。

Vitis HLS の Project メニューから New Solution... を選択して、Solution2 を作成した。
その際に、Clock の Period を 5 ns とし、Part Selection の Part を xck26-sfvc784-2LV-c に指定した。
kr260_cam_disp_197_230509.png

C コードの合成を行った。結果を示す。
kr260_cam_disp_198_230509.png

Export RTL を行った。

Clock Priod を 5 ns として、Implementation を行った。
結果を示す。
kr260_cam_disp_199_230509.png

CP achieved post-implementation は 3.239 ns なので、問題無さそうだ。
  1. 2023年05月11日 04:18 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする5

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする4”の続き。

前回、KR260 の Petalinux 2022.1 の examples ディレクトリの下に kr260_lap_ila ディレクトリを作成した。/lib/firmware/xilinx に kr260_lap_ila ディレクトリを作成して、前回作成した bin ファイルなどをコピーした。kr260_lap_ila を xmutil コマンドでロードした。その後、cam_dp_ov5642 アプリケーション・ソフトウェアを起動して、DisplayPort に表示された。更に、System ILA のキャプチャ結果を検討した。今回は、hsync の間隔を見るために、System ILA の設定を変更し、前回と同様に ILA ダッシュボードで hsync の間隔を測定したが、2080 クロックだった。HD 解像度としては妥当だと思う。

Vivado の kr260_bd ブロック・デザインで system_ila_1 をダブルクリックした。
kr260_cam_disp_192_230508.png

Re-customize IP ダイアログが表示された。
Sample Data Depth を 1024 から 4096 に変更した。
kr260_cam_disp_191_230508.png

これで、論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
kr260_cam_disp_193_230508.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/prj.runs/impl_1 ディレクトリの kr260_bd_wrapper.bin を KR260 の Petalinux の ~/examples/kr260_lap_ila ディレクトリに SFTP で転送した。
kr260_cam_disp_194_230508.png

kr260_bd_wrapper.bin の名前を変更して、コピーした。
cd ~/examples/kr260_lap_ila
cp kr260_bd_wrapper.bin kr260_cam_disp.bit.bin
sudo cp kr260_cam_disp.bit.bin /lib/firmware/xilinx/kr260_lap_ila/


u-dma-buf をロードした。
cd ~/examples/kr260_lap_ila/cam_dp/build
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*


現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap_ila をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap_ila
sudo chmod 666 /dev/uio*

kr260_cam_disp_195_230508.png

Vivado 2022.1 の Project Navigator の PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして Auto Connect を選択すると、ILA ダッシュボードが表示された。Display 関連の信号が入っている。

AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01


cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
kr260_cam_disp_196_230508.png

ILA ダッシュボードで hsync の間隔を見ると 2080 クロックだった。HD 解像度としては妥当だと思う。
ということで、タイミングは問題無さそうなのだが、Zynq MP のレジスタ設定がおかしいのだろうか?
次回からは VIvado で作ったハードウェア・プラットホームを作り直して、自分で表示タイミングを作ってみようと思う。
kr260_cam_disp_197_230508.png
  1. 2023年05月09日 04:21 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする4

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする3”の続き。

前回、ベアメタルでのデバックが難しいので、Petalinux 上でデバックをすることにした。laplacian_filter1 の Vitis アクセラレーション・プロジェクトで生成された Vivado プロジェクトを使用して、System ILA を実装して、論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。ハードウェアをエクスポートして、XSA ファイルを生成した。今回は、KR260 の Petalinux 2022.1 の examples ディレクトリの下に kr260_lap_ila ディレクトリを作成した。/lib/firmware/xilinx に kr260_lap_ila ディレクトリを作成して、前回作成した bin ファイルなどをコピーした。kr260_lap_ila を xmutil コマンドでロードした。その後、cam_dp_ov5642 アプリケーション・ソフトウェアを起動して、DisplayPort に表示された。更に、System ILA のキャプチャ結果を検討した。

pcmanfm 上で KR260 の Petalinux 2022.1 の examples/kr260_lap ディレクトリをコピーして kr260_lap_ila に変更した。
examples/kr260_lap_ila ディレクトリの binary_container_1.bin を削除した。
kr260_cam_disp_181_230507.png

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする3”で作成した kr260_bd_wrapper.bin を ~/examples/kr260_lap_ila ディレクトリにアップロードした。
kr260_cam_disp_182_230507.png

/lib/firmware/xilinx/kr260_lap_ila ディレクトリを作成し、kr260_bd_wrapper.bin の名前を変更して、コピーした。
kr260_bd_wrapper.bin の名前を変更したのは、pl.dtsi の firmware-name に合わせたためだ。(”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する8”参照)
cd ~/examples/kr260_lap_ila
sudo mkdir /lib/firmware/xilinx/kr260_lap_ila
cp kr260_bd_wrapper.bin kr260_cam_disp.bit.bin
sudo cp pl.dtbo kr260_cam_disp.bit.bin shell.json /lib/firmware/xilinx/kr260_lap_ila/


u-dma-buf をロードした。
cd ~/examples/kr260_lap_ila/cam_dp/build
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*


現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap_ila をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap_ila
sudo chmod 666 /dev/uio*


/sys/class/uio に uio が追加されていた。
kr260_cam_disp_183_230507.png

Vivado 2022.1 の Project Navigator の PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして Auto Connect を選択すると、ILA ダッシュボードが表示された。Display 関連の信号が入っている。
kr260_cam_disp_184_230507.png

AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01


cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
kr260_cam_disp_185_230507.png

DisplayPort の表示はやはり流れていて正常にカメラ画像が表示されない。

disp_pixel は出力されているようだ。
kr260_cam_disp_186_230507.png

hsync も出力されている。
kr260_cam_disp_187_230507.png

vsync も出力されている。
kr260_cam_disp_188_230507.png

cam_dp_ov5642 の w コマンドで画像を出力した。
kr260_cam_disp_189_230507.png

やはり、カメラ画像は正常だった。
kr260_cam_disp_190_230507.png

hsync の間隔は調べてみよう。
  1. 2023年05月08日 05:16 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする3

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする2”の続き。

前回、ハードウェアをエクスポートし、Vitis を起動して、プラットホームを作成し、アプリケーション・プロジェクトを作成した。アプリケーション・ソフトウェアを作成し、ビルドして動作せせたが、動作しなかった。更に、デバックも難しい。今回は、ベアメタルでのデバックが難しいので、Petalinux 上でデバックをすることにした。laplacian_filter1 の Vitis アクセラレーション・プロジェクトで生成された Vivado プロジェクトを使用して、System ILA を実装して、論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。ハードウェアをエクスポートして、XSA ファイルを生成した。

laplacian_filter1 の Vitis アクセラレーション・プロジェクトをビルドした時に生成された Vivado 2022.1 の prj プロジェクトの kr260_bd ブロック・デザインに System ILA を追加する。そのためには、kr260_bd ブロック・デザインで、display 階層モジュールの disp_pixel, de_out, vsync_out, hsync_out を選択して、右クリックし右クリックメニューから Debug を選択して、System ILA を実装した。
その際に、System ILA がそれぞれの信号に対して、1個実装されたので、1個にまとめて、その他の System ILA は削除した。
kr260_cam_disp_175_230506.png

Address Editor 画面を示す。
kr260_cam_disp_176_230506.png

Project Navigator から Settins をクリックし、Settings ダイアログを表示した。
Project Settings で Implementation をクリックし、-bin_file のチェックボックスにチェックを入れた。
kr260_cam_disp_177_230506.png

論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
Project Summary を示す。
kr260_cam_disp_178_230506.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/prj.runs/impl_1 ディレクトリに kr260_bd_wrapper.bin と kr260_bd_wrapper.bit ファイルが生成された。
kr260_cam_disp_179_230506.png

ハードウェアをエクスポートして、XSA ファイルを生成する。
File メニューから Export -> Export Platform... を選択する。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。

Platform Type 画面では、Hardware ラジオボタン(デフォルト設定)をクリックする。
Next > ボタンをクリックする。

Platform State 画面では、Include bitstream のチェック・ボックスにチェックを入れた。
Next > ボタンをクリックする。

Platform Properties 画面では、Name に kr260_cam_disp_platform と入力されていた。
Next > ボタンをクリックする。

Output File 画面では、XSA file name はデフォルトのままとする。
Next > ボタンをクリックする。

サーマリ画面が表示された。
Finish ボタンをクリックした。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj ディレクトリに kr260_bd_wrapper.xsa ファイルが生成された。
kr260_cam_disp_180_230506.png
  1. 2023年05月07日 04:18 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする2

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする1”の続き。

前回は、”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する6”でカメラ画像が DisplayPort に正常に出力されなかった。そこで、デバックするために回路をベアメタル・アプリケーションで動作させて System ILA を入れて波形を観察することにした。今回は、ハードウェアをエクスポートし、Vitis を起動して、プラットホームを作成し、アプリケーション・プロジェクトを作成した。アプリケーション・ソフトウェアを作成し、ビルドして動作せせたが、動作しなかった。更に、デバックも難しい。

Vivado 2022.1 でハードウェアをエクスポートした。
kr260_bd_wrapper.xsa が生成された。

Vivado の Tools メニューから Launch Vitis IDE を選択して、Vitis を起動した。
kr260_cam_dp2 の下に vitis_work ディレクトリを作成し、workspace に指定した。
Vitis 2022.1 が起動した。
Create Platform Project をクリックして、kr260_cam_disp2_pf プラットホームを作成した。
kr260_cam_disp_168_230505.png

kr260_cam_disp2_pf プラットホームを指定して、アプリケーション・プロジェクトの kr260_cam_dp を作成した。
kr260_cam_dp_system -> kr260_cam_dp -> src に kr260_cam_dp.c を新規作成した。
ビルドを行って成功した。
なお、 kr260_cam_dp.c には、デバックコードを埋め込んである。
kr260_cam_disp_169_230505.png

ビルドが終了したので、ソフトウェアを動作させる。
MicroSD カードを抜いて、KR260 の電源を ON した。
ブート・ローダーが走った。
kr260_cam_disp_170_230505.png

起動ログを示す。

Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... Device NOT ready
   Request Sense returned 02 3A 00
5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: unknown device

Device 1: unknown device

Device 2: unknown device

Device 3: unknown device
ethernet@ff0b0000 Waiting for PHY auto negotiation to complete......................................... TIMEOUT !
BOOTP broadcast 1
DHCP client bound to address 192.168.3.29 (190 ms)
missing environment variable: pxeuuid
Retrieving file: pxelinux.cfg/01-00-0a-35-0f-40-0f
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8031D
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8031
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A803
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A80
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm-zynqmp-zynqmp
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm-zynqmp
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default
*** ERROR: `serverip' not set
Config file not found
BOOTP broadcast 1
DHCP client bound to address 192.168.3.29 (185 ms)
## Executing script at 20000000
Wrong image format for "source" command
BOOTP broadcast 1
DHCP client bound to address 192.168.3.29 (184 ms)
*** ERROR: `serverip' not set
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
Found 0 disks
No EFI system partition
tpm_tis_spi_probe: missing reset GPIO
DFU alt info setting: done
SF: Detected mt25qu512a with page size 256 Bytes, erase size 64 KiB, total 64 MiB
No UEFI binary known at 0x18000000
ZynqMP> 


SD カード・ブートモードの Zynq UltraScale+ MPSoC で Vitis を使用してコンフィギュレーション、ソフトウェアを起動する”に従って、Run Configuration を作成した。
kr260_cam_disp_171_230505.png

Target Setup タブで Use FSBL flow for initialization のチェックを外した。
kr260_cam_disp_174_230505.png

これで Run を行ったが、途中で止まっている。
kr260_cam_disp_173_230505.png

デバックコードを付加してやってみたが、”Timeout Reached. Mask poll failed at ADDRESS: 0XFD40A3E4 MASK: 0x00000010”で止まってしまうことが多く、デバックが難しい。
kr260_cam_disp_172_230505.png

困った。やはり、ベアメタル・アプリケーションではなく、Petalinux を起動して、デバックする必要があるかも知れない?
  1. 2023年05月06日 05:09 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する回路をデバックする1

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する6”でカメラ画像が DisplayPort に正常に出力されなかった。そこで、デバックするために回路をベアメタル・アプリケーションで動作させて System ILA を入れて波形を観察することにした。

Vivado 2022.1 の kr260_cam_dp プロジェクトで、kr260_bd ブロック・デザインを表示して、File メニューから Export -> Export Block Design... を選択して、kr260_bd.tcl を出力させた。

KR260 用の Vivado 2022.1 用の kr260_cam_dp2 プロジェクトを作成した。
なお、Project Type 画面で、Project is an extensible Vitis platform にチェックを入れていない。

kr260_cam_dp2 プロジェクト のディレクトリに axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vflip_dma_write_IP をコピーした。

IP Catlog に axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vflip_dma_write_IP を登録した。

Vivado の Tcl Console で kr260_cam_dp2 プロジェクトのディレクトリに cd して、kr260_bd.tcl をコピーして実行した。
cd <kr260_cam_dp2 プロジェクトのディレクトリ>
source kr260_bd.tcl


kr260_bd ブロック・デザインが生成できたので、HDL Wrapper ファイルを生成した。
kr260_cam_dp プロジェクトから制約ファイル(xdc ファイル)を Add Source した。

DisplayPort に出力するディスプレイ用の信号に System ILA を追加した。
System ILA が分割されてしまっている。これでは、信号同士の依存関係が分からないが、とりあえず論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。

kr260_cam_dp2 プロジェクトを示す。
kr260_cam_disp_164_230503.png

kr260_bd ブロック・デザインを示す。
kr260_cam_disp_165_230503.png

Address Editor 画面を示す。
kr260_cam_disp_167_230503.png

ビットストリーム生成後の Project Summary を示す。
kr260_cam_disp_166_230503.png
  1. 2023年05月03日 05:00 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-1.0.0 を動作させてみる

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.x を動作させて来たが、正式版の KR260 用 ZynqMP-FPGA-Debian11-1.0.0 が出たのでそれに入れ替えてみた。

ファイルをダウンロードした。
wget https://github.com/ikwzm/ZynqMP-FPGA-Debian11/archive/refs/tags/v1.0.0.tar.gz
tar xfz v1.0.0.tar.gz
cd ZynqMP-FPGA-Debian11-1.0.0


今まで使用していた MicroSD カードを使用する。ファイルを消去した。
rm /media/masaaki/boot/*
sudo rm -r /media/masaaki/root/*


boot パーティションにファイルを転送する。
cp target/Kr260/boot/* /media/masaaki/boot
gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-5 > /media/masaaki/boot/image-5.15.108-zynqmp-fpga-generic


root パーティションにファイルを転送した。
cat debian11-rootfs-vanilla.tgz.files/* | sudo tar xfz - -C /media/masaaki/root
sudo mkdir /media/masaaki/root/home/fpga/debian
sudo cp debian/* /media/masaaki/root/home/fpga/debian


/etc/fstab に boot パーティションをマウントする設定を書き込む。
sudo su
vi /media/masaaki/root/etc/fstab

vi 上で o コマンドを実行して、下に以下の行を追加した。

/dev/sda1   /mnt/boot       auto            defaults        0       0


exit

ファイルマネージャー上で boot , root をアンマウントした。

MicroSD カードを KR260 に入れて電源ON した。
Debian Linux がブートして、ログイン・プロンプトが出た。
kr260_Debian11_20_230502.png

イーサーネットへの接続だが、いつもの GEM0 PS Ethernet の口では DHCP の割当がなかった。GEM1 PS Ethernet の口にLAN ケーブルを接続したところ eth0 に IP アドレスが割り当てられた。(Kria KR260 ロボティクス スターター キット ユーザー ガイド (UG1092) のインターフェイスの図:インターフェイスおよびカードコネクタ:カード表面参照)

ホストパソコンから KR260 の Debian Linux へ ssh でログインした。
ssh 192.168.3.34 -X -l fpga

最初に現在の環境をアップデートしようとしたら、アップデート済みだった。
sudo apt update
kr260_Debian11_21_230502.png

X11関連のパッケージをインストールした。
sudo apt install xbase-clients xterm x11-apps

GUI アプリ(nautilus と geany)をインストールした。
sudo apt install nautilus geany

KR260 をリブートした。

もう一度 ssh でログインしてから、
nautilus &
でファイル・マネージャーを起動した。起動できた。

geany も起動した。
geany &
geany も起動できた。

最後に日本語フォントをインストールした。
sudo apt install fonts-vlgothic fonts-horai-umefont fonts-umeplus

最後に起動ログを貼っておく。

Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 30474.0 MB = 29.7 GB (62410752 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2661 bytes read in 2 ms (1.3 MiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
2280 bytes read in 1 ms (2.2 MiB/s)
Importing environment(uEnv.txt) from usb0...
Running uenvcmd ...
24201728 bytes read in 1583 ms (14.6 MiB/s)
44332 bytes read in 5 ms (8.5 MiB/s)
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Device Tree to 000000000fff2000, end 000000000ffffd2b ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.108-zynqmp-fpga-generic (ichiro@Jabberwock) (aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0, GNU ld (GNU Binutils for Ubuntu) 2.30) #5 SMP Sat Apr 29 16:18:34 JST 2023
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000087fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000]   node   0: [mem 0x0000000800000000-0x000000087fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000087fffffff]
[    0.000000] cma: Reserved 1000 MiB at 0x0000000041800000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 27 pages/cpu s73496 r8192 d28904 u110592
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1032192
[    0.000000] Kernel command line: console=ttyPS1,115200 root=/dev/sda2 rw rootwait systemd.unit=multi-user.target cpuidle.off=1 cma=1000M uio_pdrv_genirq.of_id=generic-uio
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] software IO TLB: mapped [mem 0x000000003d800000-0x0000000041800000] (64MB)
[    0.000000] Memory: 2999156K/4194304K available (14528K kernel code, 1938K rwdata, 3940K rodata, 3136K init, 610K bss, 171148K reserved, 1024000K cma-reserved)
[    0.000000] trace event string verifier disabled
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000001] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.000402] Console: colour dummy device 80x25
[    0.000434] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.000445] pid_max: default: 32768 minimum: 301
[    0.000618] LSM: Security Framework initializing
[    0.000711] AppArmor: AppArmor initialized
[    0.000798] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.000817] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.002006] rcu: Hierarchical SRCU implementation.
[    0.002293] EFI services will not be available.
[    0.002467] smp: Bringing up secondary CPUs ...
[    0.002905] Detected VIPT I-cache on CPU1
[    0.002945] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.003406] Detected VIPT I-cache on CPU2
[    0.003429] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.003868] Detected VIPT I-cache on CPU3
[    0.003891] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.003962] smp: Brought up 1 node, 4 CPUs
[    0.003977] SMP: Total of 4 processors activated.
[    0.003983] CPU features: detected: 32-bit EL0 Support
[    0.003987] CPU features: detected: CRC32 instructions
[    0.004030] CPU: All CPU(s) started at EL2
[    0.004046] alternatives: patching kernel code
[    0.005047] devtmpfs: initialized
[    0.010978] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.010995] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.033237] pinctrl core: initialized pinctrl subsystem
[    0.034190] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.035302] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.035392] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.035424] audit: initializing netlink subsys (disabled)
[    0.035518] audit: type=2000 audit(0.032:1): state=initialized audit_enabled=0 res=1
[    0.035943] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.036011] ASID allocator initialised with 65536 entries
[    0.053773] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.053789] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.053795] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.053801] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    0.055175] cryptd: max_cpu_qlen set to 1000
[    0.056921] iommu: Default domain type: Translated 
[    0.056928] iommu: DMA domain TLB invalidation policy: strict mode 
[    0.057059] vgaarb: loaded
[    0.057282] SCSI subsystem initialized
[    0.057418] usbcore: registered new interface driver usbfs
[    0.057446] usbcore: registered new interface driver hub
[    0.057470] usbcore: registered new device driver usb
[    0.057532] mc: Linux media interface: v0.10
[    0.057552] videodev: Linux video capture interface: v2.00
[    0.057592] pps_core: LinuxPPS API ver. 1 registered
[    0.057597] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.057610] PTP clock support registered
[    0.057639] EDAC MC: Ver: 3.0.0
[    0.057981] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    0.058167] FPGA manager framework
[    0.058291] Advanced Linux Sound Architecture Driver Initialized.
[    0.058619] NetLabel: Initializing
[    0.058624] NetLabel:  domain hash size = 128
[    0.058629] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.058681] NetLabel:  unlabeled traffic allowed by default
[    0.059073] clocksource: Switched to clocksource arch_sys_counter
[    0.086263] VFS: Disk quotas dquot_6.6.0
[    0.086323] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.086676] AppArmor: AppArmor Filesystem Enabled
[    0.159104] NET: Registered PF_INET protocol family
[    0.159257] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.160763] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    0.160806] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.160818] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.161005] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    0.161367] TCP: Hash tables configured (established 32768 bind 32768)
[    0.161444] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161514] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161654] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.163394] RPC: Registered named UNIX socket transport module.
[    0.163400] RPC: Registered udp transport module.
[    0.163404] RPC: Registered tcp transport module.
[    0.163409] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.163989] PCI: CLS 0 bytes, default 64
[    0.708475] armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
[    0.708647] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    0.712987] Initialise system trusted keyrings
[    0.713084] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    0.713802] NFS: Registering the id_resolver key type
[    0.713823] Key type id_resolver registered
[    0.713829] Key type id_legacy registered
[    0.713850] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.713857] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.713877] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    0.746865] NET: Registered PF_ALG protocol family
[    0.746875] Key type asymmetric registered
[    0.746881] Asymmetric key parser 'x509' registered
[    0.746922] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[    0.746996] io scheduler mq-deadline registered
[    0.747003] io scheduler kyber registered
[    0.748568] Error: Driver 'clk-wizard' is already registered, aborting...
[    0.775653] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.778830] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    0.783418] brd: module loaded
[    0.786979] loop: module loaded
[    0.787599] mtdoops: mtd device (mtddev=name/number) must be supplied
[    0.789983] tun: Universal TUN/TAP device driver, 1.6
[    0.790572] PPP generic driver version 2.4.2
[    0.790647] SPI driver wl1271_spi has no spi_device_id for ti,wl1271
[    0.790653] SPI driver wl1271_spi has no spi_device_id for ti,wl1273
[    0.790658] SPI driver wl1271_spi has no spi_device_id for ti,wl1281
[    0.790663] SPI driver wl1271_spi has no spi_device_id for ti,wl1283
[    0.790668] SPI driver wl1271_spi has no spi_device_id for ti,wl1285
[    0.790672] SPI driver wl1271_spi has no spi_device_id for ti,wl1801
[    0.790677] SPI driver wl1271_spi has no spi_device_id for ti,wl1805
[    0.790681] SPI driver wl1271_spi has no spi_device_id for ti,wl1807
[    0.790686] SPI driver wl1271_spi has no spi_device_id for ti,wl1831
[    0.790691] SPI driver wl1271_spi has no spi_device_id for ti,wl1835
[    0.790695] SPI driver wl1271_spi has no spi_device_id for ti,wl1837
[    0.791666] usbcore: registered new interface driver uas
[    0.791699] usbcore: registered new interface driver usb-storage
[    0.792472] rtc_zynqmp ffa60000.rtc: registered as rtc0
[    0.792489] rtc_zynqmp ffa60000.rtc: setting system clock to 1970-01-01T00:02:49 UTC (169)
[    0.792545] i2c_dev: i2c /dev entries driver
[    0.793902] usbcore: registered new interface driver uvcvideo
[    0.794645] EDAC MC: ECC not enabled
[    0.794784] EDAC DEVICE0: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    0.795158] failed to register cpuidle driver
[    0.795355] sdhci: Secure Digital Host Controller Interface driver
[    0.795360] sdhci: Copyright(c) Pierre Ossman
[    0.795364] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.795689] ledtrig-cpu: registered to indicate activity on CPUs
[    0.795769] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
[    0.795838] zynqmp_firmware_probe Platform Management API v1.1
[    0.795846] zynqmp_firmware_probe Trustzone version v1.0
[    0.824796] securefw securefw: securefw probed
[    0.824892] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: The zynqmp-aes driver shall be deprecated in 2022.2 and removed in 2023.1
[    0.825081] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: AES Successfully Registered
[    0.825193] zynqmp-keccak-384 firmware:zynqmp-firmware:sha384: The zynqmp-sha-deprecated driver shall be deprecated in 2022.2 and removed in 2023.1 release
[    0.825588] usbcore: registered new interface driver usbhid
[    0.825595] usbhid: USB HID core driver
[    0.828849] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    0.829940] drop_monitor: Initializing network drop monitor service
[    0.830070] Initializing XFRM netlink socket
[    0.830163] NET: Registered PF_INET6 protocol family
[    0.830684] Segment Routing with IPv6
[    0.830712] In-situ OAM (IOAM) with IPv6
[    0.830753] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.831104] NET: Registered PF_PACKET protocol family
[    0.831119] NET: Registered PF_KEY protocol family
[    0.831125] can: controller area network core
[    0.831155] NET: Registered PF_CAN protocol family
[    0.831161] can: raw protocol
[    0.831167] can: broadcast manager protocol
[    0.831176] can: netlink gateway - max_hops=1
[    0.831362] 9pnet: Installing 9P2000 support
[    0.831390] Key type dns_resolver registered
[    0.831883] registered taskstats version 1
[    0.831895] Loading compiled-in X.509 certificates
[    0.832109] AppArmor: AppArmor sha1 policy hashing enabled
[    0.841150] ff010000.serial: ttyPS1 at MMIO 0xff010000 (irq = 51, base_baud = 6249999) is a xuartps
[    1.975626] printk: console [ttyPS1] enabled
[    1.980248] of-fpga-region fpga-full: FPGA Region probed
[    1.986284] xilinx-zynqmp-dma fd500000.dma-controller: ZynqMP DMA driver Probe success
[    1.994365] xilinx-zynqmp-dma fd510000.dma-controller: ZynqMP DMA driver Probe success
[    2.002445] xilinx-zynqmp-dma fd520000.dma-controller: ZynqMP DMA driver Probe success
[    2.010515] xilinx-zynqmp-dma fd530000.dma-controller: ZynqMP DMA driver Probe success
[    2.018586] xilinx-zynqmp-dma fd540000.dma-controller: ZynqMP DMA driver Probe success
[    2.026661] xilinx-zynqmp-dma fd550000.dma-controller: ZynqMP DMA driver Probe success
[    2.034739] xilinx-zynqmp-dma fd560000.dma-controller: ZynqMP DMA driver Probe success
[    2.042815] xilinx-zynqmp-dma fd570000.dma-controller: ZynqMP DMA driver Probe success
[    2.050953] xilinx-zynqmp-dma ffa80000.dma-controller: ZynqMP DMA driver Probe success
[    2.059027] xilinx-zynqmp-dma ffa90000.dma-controller: ZynqMP DMA driver Probe success
[    2.067109] xilinx-zynqmp-dma ffaa0000.dma-controller: ZynqMP DMA driver Probe success
[    2.075188] xilinx-zynqmp-dma ffab0000.dma-controller: ZynqMP DMA driver Probe success
[    2.083265] xilinx-zynqmp-dma ffac0000.dma-controller: ZynqMP DMA driver Probe success
[    2.091337] xilinx-zynqmp-dma ffad0000.dma-controller: ZynqMP DMA driver Probe success
[    2.099417] xilinx-zynqmp-dma ffae0000.dma-controller: ZynqMP DMA driver Probe success
[    2.107490] xilinx-zynqmp-dma ffaf0000.dma-controller: ZynqMP DMA driver Probe success
[    2.115885] xilinx-zynqmp-dpdma fd4c0000.dma-controller: Xilinx DPDMA engine is probed
[    2.127165] zynqmp-display fd4a0000.display: vtc bridge property not present
[    2.137112] xilinx-dp-snd-codec fd4a0000.display:zynqmp_dp_snd_codec0: Xilinx DisplayPort Sound Codec probed
[    2.147199] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm0: Xilinx DisplayPort Sound PCM probed
[    2.155272] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm1: Xilinx DisplayPort Sound PCM probed
[    2.164111] xilinx-dp-snd-card fd4a0000.display:zynqmp_dp_snd_card: Xilinx DisplayPort Sound Card probed
[    2.167880] zynqmp_pll_disable() clock disable failed for dpll_int, ret = -13
[    2.173692] OF: graph: no port node found in /axi/display@fd4a0000
[    2.187301] xlnx-drm xlnx-drm.0: bound fd4a0000.display (ops 0xffffffc008ef0ae0)
[    2.360496] Console: switching to colour frame buffer device 240x67
[    2.383422] zynqmp-display fd4a0000.display: [drm] fb0: xlnxdrmfb frame buffer device
[    2.391471] [drm] Initialized xlnx 1.0.0 20130509 for fd4a0000.display on minor 0
[    2.398976] zynqmp-display fd4a0000.display: ZynqMP DisplayPort Subsystem driver probed
[    2.408925] spi-nor spi0.0: mt25qu512a (65536 Kbytes)
[    2.414051] 17 fixed-partitions partitions found on MTD device spi0.0
[    2.420501] Creating 17 MTD partitions on "spi0.0":
[    2.425379] 0x000000000000-0x000000080000 : "Image Selector"
[    2.431918] 0x000000080000-0x000000100000 : "Image Selector Golden"
[    2.438923] 0x000000100000-0x000000120000 : "Persistent Register"
[    2.445531] tpm_tis_spi spi2.0: 2.0 TPM (device-id 0x1B, rev-id 22)
[    2.445824] 0x000000120000-0x000000140000 : "Persistent Register Backup"
[    2.459308] 0x000000140000-0x000000200000 : "Open_1"
[    2.465021] 0x000000200000-0x000000f00000 : "Image A (FSBL, PMU, ATF, U-Boot)"
[    2.472971] 0x000000f00000-0x000000f80000 : "ImgSel Image A Catch"
[    2.479942] 0x000000f80000-0x000001c80000 : "Image B (FSBL, PMU, ATF, U-Boot)"
[    2.487942] 0x000001c80000-0x000001d00000 : "ImgSel Image B Catch"
[    2.494868] 0x000001d00000-0x000001e00000 : "Open_2"
[    2.500561] 0x000001e00000-0x000002000000 : "Recovery Image"
[    2.507091] 0x000002000000-0x000002200000 : "Recovery Image Backup"
[    2.514124] 0x000002200000-0x000002220000 : "U-Boot storage variables"
[    2.521385] 0x000002220000-0x000002240000 : "U-Boot storage variables backup"
[    2.529455] 0x000002240000-0x000002280000 : "SHA256"
[    2.535221] 0x000002280000-0x0000022a0000 : "Secure OS Storage"
[    2.541897] 0x0000022a0000-0x000004050000 : "User"
[    2.546692] mtd: partition "User" extends beyond the end of device "spi0.0" -- size truncated to 0x1d60000
[    2.557654] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.565281] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.593129] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.619961] xilinx-axipmon ffa00000.perf-monitor: Probed Xilinx APM
[    2.626499] xilinx-axipmon fd0b0000.perf-monitor: Probed Xilinx APM
[    2.632992] xilinx-axipmon fd490000.perf-monitor: Probed Xilinx APM
[    2.639503] xilinx-axipmon ffa10000.perf-monitor: Probed Xilinx APM
[    2.646982] at24 1-0050: supply vcc not found, using dummy regulator
[    2.653683] at24 1-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.660516] at24 1-0051: supply vcc not found, using dummy regulator
[    2.667164] at24 1-0051: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.675222] i2c i2c-1: Added multiplexed i2c bus 3
[    2.680133] i2c i2c-1: Added multiplexed i2c bus 4
[    2.685046] i2c i2c-1: Added multiplexed i2c bus 5
[    2.689952] i2c i2c-1: Added multiplexed i2c bus 6
[    2.694739] pca954x 1-0074: registered 4 multiplexed busses for I2C switch pca9546
[    2.702339] cdns-i2c ff030000.i2c: 400 kHz mmio ff030000 irq 40
[    2.709693] cdns-wdt fd4d0000.watchdog: Xilinx Watchdog Timer with timeout 60s
[    2.717162] cdns-wdt ff150000.watchdog: Xilinx Watchdog Timer with timeout 10s
[    2.725467] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.732373] macb ff0b0000.ethernet: invalid hw address, using random
[    2.739299] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.764947] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.771850] macb ff0c0000.ethernet: invalid hw address, using random
[    2.784415] macb ff0c0000.ethernet eth0: Cadence GEM rev 0x50070106 at 0xff0c0000 irq 38 (86:24:a2:e0:d5:cf)
[    2.818106] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    2.823603] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 1
[    2.831350] xhci-hcd xhci-hcd.1.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010890
[    2.840777] xhci-hcd xhci-hcd.1.auto: irq 57, io mem 0xfe200000
[    2.846799] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    2.852285] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
[    2.859942] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed
[    2.866621] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    2.874883] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.882103] usb usb1: Product: xHCI Host Controller
[    2.886982] usb usb1: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.894290] usb usb1: SerialNumber: xhci-hcd.1.auto
[    2.899470] hub 1-0:1.0: USB hub found
[    2.903246] hub 1-0:1.0: 1 port detected
[    2.907482] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    2.915747] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.922974] usb usb2: Product: xHCI Host Controller
[    2.927850] usb usb2: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.935163] usb usb2: SerialNumber: xhci-hcd.1.auto
[    2.940287] hub 2-0:1.0: USB hub found
[    2.944053] hub 2-0:1.0: 1 port detected
[    2.963201] usb5744 3-002d: Sending boot command failed
[    2.983193] i2c 3-002d: Sending boot command failed
[    3.026802] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    3.032298] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 3
[    3.040061] xhci-hcd xhci-hcd.2.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010890
[    3.049486] xhci-hcd xhci-hcd.2.auto: irq 60, io mem 0xfe300000
[    3.055505] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    3.060990] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 4
[    3.068646] xhci-hcd xhci-hcd.2.auto: Host supports USB 3.0 SuperSpeed
[    3.075460] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    3.083736] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.090962] usb usb3: Product: xHCI Host Controller
[    3.095833] usb usb3: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    3.103134] usb usb3: SerialNumber: xhci-hcd.2.auto
[    3.108291] hub 3-0:1.0: USB hub found
[    3.112061] hub 3-0:1.0: 1 port detected
[    3.116300] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    3.124569] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.131804] usb usb4: Product: xHCI Host Controller
[    3.136686] usb usb4: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    3.143997] usb usb4: SerialNumber: xhci-hcd.2.auto
[    3.149139] hub 4-0:1.0: USB hub found
[    3.152911] hub 4-0:1.0: 1 port detected
[    3.171199] usb5744 4-002d: Sending boot command failed
[    3.191198] i2c 4-002d: Sending boot command failed
[    3.196649] macb ff0b0000.ethernet: Not enabling partial store and forward
[    3.203564] macb ff0b0000.ethernet: invalid hw address, using random
[    3.211080] usb 1-1: new high-speed USB device number 2 using xhci-hcd
[    3.219269] macb ff0b0000.ethernet eth1: Cadence GEM rev 0x50070106 at 0xff0b0000 irq 37 (d6:82:af:a3:4d:99)
[    3.232324] input: gpio-keys as /devices/platform/gpio-keys/input/input0
[    3.239404] of_cfs_init
[    3.241860] of_cfs_init: OK
[    3.244799] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    3.253907] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    3.261468] ALSA device list:
[    3.264427]   #0: DisplayPort monitor
[    3.268394] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    3.268511] Waiting for root device /dev/sda2...
[    3.277004] cfg80211: failed to load regulatory.db
[    3.363645] usb 1-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    3.371834] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.378968] usb 1-1: Product: USB2744
[    3.382625] usb 1-1: Manufacturer: Microchip Tech
[    3.387434] usb 3-1: new high-speed USB device number 2 using xhci-hcd
[    3.442614] hub 1-1:1.0: USB hub found
[    3.446395] hub 1-1:1.0: 4 ports detected
[    3.506492] usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd
[    3.531442] usb 2-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    3.539625] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    3.546759] usb 2-1: Product: USB5744
[    3.550422] usb 2-1: Manufacturer: Microchip Tech
[    3.555692] usb 3-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    3.563875] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.571022] usb 3-1: Product: USB2744
[    3.574680] usb 3-1: Manufacturer: Microchip Tech
[    3.618592] hub 2-1:1.0: USB hub found
[    3.622463] hub 3-1:1.0: USB hub found
[    3.626229] hub 2-1:1.0: 3 ports detected
[    3.630257] hub 3-1:1.0: 3 ports detected
[    3.683235] usb 4-1: new SuperSpeed USB device number 2 using xhci-hcd
[    3.707436] usb 4-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    3.715611] usb 4-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    3.722740] usb 4-1: Product: USB5744
[    3.726398] usb 4-1: Manufacturer: Microchip Tech
[    3.795292] hub 4-1:1.0: USB hub found
[    3.799194] hub 4-1:1.0: 2 ports detected
[    3.803072] usb 1-1.1: new high-speed USB device number 3 using xhci-hcd
[    3.913377] usb 1-1.1: New USB device found, idVendor=0424, idProduct=2240, bcdDevice= 1.98
[    3.921737] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.929042] usb 1-1.1: Product: Ultra Fast Media 
[    3.933744] usb 1-1.1: Manufacturer: Generic
[    3.938012] usb 1-1.1: SerialNumber: 000000225001
[    3.943229] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[    3.949803] scsi host0: usb-storage 1-1.1:1.0
[    3.971080] usb 3-1.3: new high-speed USB device number 3 using xhci-hcd
[    4.035071] usb 1-1.4: new high-speed USB device number 4 using xhci-hcd
[    4.075764] usb 3-1.3: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    4.084125] usb 3-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    4.091434] usb 3-1.3: Product: Hub Controller
[    4.095867] usb 3-1.3: Manufacturer: Microchip Tech
[    4.139748] usb 1-1.4: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    4.148098] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    4.155410] usb 1-1.4: Product: Hub Controller
[    4.159848] usb 1-1.4: Manufacturer: Microchip Tech
[    4.959835] scsi 0:0:0:0: Direct-Access     Generic  Ultra HS-COMBO   1.98 PQ: 0 ANSI: 0
[    4.969189] sd 0:0:0:0: [sda] 62410752 512-byte logical blocks: (32.0 GB/29.8 GiB)
[    4.977351] sd 0:0:0:0: [sda] Write Protect is off
[    4.982727] sd 0:0:0:0: [sda] No Caching mode page found
[    4.988036] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    4.998107]  sda: sda1 sda2
[    5.002738] sd 0:0:0:0: [sda] Attached SCSI removable disk
[    5.024085] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[    5.033425] VFS: Mounted root (ext4 filesystem) on device 8:2.
[    5.041274] devtmpfs: mounted
[    5.044948] Freeing unused kernel memory: 3136K
[    5.049536] Run /sbin/init as init process
[    5.845822] systemd[1]: System time before build time, advancing clock.
[    5.971668] systemd[1]: systemd 247.3-7+deb11u2 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +ZSTD +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=unified)
[    5.994989] systemd[1]: Detected architecture arm64.

Welcome to Debian GNU/Linux 11 (bullseye)!

[    6.023890] systemd[1]: Set hostname to <debian-fpga>.
[    6.528846] systemd[1]: Queued start job for default target Multi-User System.
[    6.537434] random: systemd: uninitialized urandom read (16 bytes read)
[    6.545756] systemd[1]: Created slice system-getty.slice.
[  OK  ] Created slice system-getty.slice.
[    6.567184] random: systemd: uninitialized urandom read (16 bytes read)
[    6.574556] systemd[1]: Created slice system-modprobe.slice.
[  OK  ] Created slice system-modprobe.slice.
[    6.595149] random: systemd: uninitialized urandom read (16 bytes read)
[    6.602531] systemd[1]: Created slice system-serial\x2dgetty.slice.
[  OK  ] Created slice system-serial\x2dgetty.slice.
[    6.623721] systemd[1]: Created slice User and Session Slice.
[  OK  ] Created slice User and Session Slice.
[    6.647333] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password …ts to Console Directory Watch.
[    6.671269] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Started Forward Password R…uests to Wall Directory Watch.
[    6.695229] systemd[1]: Condition check resulted in Arbitrary Executable File Formats File System Automount Point being skipped.
[    6.706936] systemd[1]: Reached target Local Encrypted Volumes.
[  OK  ] Reached target Local Encrypted Volumes.
[    6.727240] systemd[1]: Reached target Paths.
[  OK  ] Reached target Paths.
[    6.743167] systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
[    6.763153] systemd[1]: Reached target Slices.
[  OK  ] Reached target Slices.
[    6.779178] systemd[1]: Reached target Swap.
[  OK  ] Reached target Swap.
[    6.796474] systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
[    6.811346] systemd[1]: Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on initctl Compatibility Named Pipe.
[    6.835606] systemd[1]: Listening on Journal Audit Socket.
[  OK  ] Listening on Journal Audit Socket.
[    6.855366] systemd[1]: Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
[    6.875441] systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
[    6.891543] systemd[1]: Listening on udev Control Socket.
[  OK  ] Listening on udev Control Socket.
[    6.911371] systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
[    6.933441] systemd[1]: Mounting Huge Pages File System...
         Mounting Huge Pages File System...
[    6.953587] systemd[1]: Mounting POSIX Message Queue File System...
         Mounting POSIX Message Queue File System...
[    6.977599] systemd[1]: Mounting Kernel Debug File System...
         Mounting Kernel Debug File System...
[    6.997543] systemd[1]: Mounting Kernel Trace File System...
         Mounting Kernel Trace File System...
[    7.018088] systemd[1]: Starting Create list of static device nodes for the current kernel...
         Starting Create list of st…odes for the current kernel...
[    7.045872] systemd[1]: Starting Load Kernel Module configfs...
         Starting Load Kernel Module configfs...
[    7.065693] systemd[1]: Starting Load Kernel Module drm...
         Starting Load Kernel Module drm...
[    7.085670] systemd[1]: Starting Load Kernel Module fuse...
         Starting Load Kernel Module fuse...
[    7.105470] systemd[1]: Started Nameserver information manager.
[    7.111697] fuse: init (API version 7.34)
[  OK  ] Started Nameserver information manager.
[    7.131586] systemd[1]: Reached target Network (Pre).
[  OK  ] Reached target Network (Pre).
[    7.157732] systemd[1]: Condition check resulted in Set Up Additional Binary Formats being skipped.
[    7.171034] systemd[1]: Starting Journal Service...
         Starting Journal Service...
[    7.192269] systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
[    7.210018] systemd[1]: Starting Remount Root and Kernel File Systems...
         Starting Remount Root and Kernel File Systems...
[    7.233596] systemd[1]: Starting Coldplug All udev Devices...
         Starting Coldplug All udev Devices...
[    7.260375] systemd[1]: Mounted Huge Pages File System.
[  OK  ] Mounted Huge Pages File System.
[    7.272813] systemd[1]: Mounted POSIX Message Queue File System.
[  OK  ] Mounted POSIX Message Queue File System.
[    7.295534] systemd[1]: Mounted Kernel Debug File System.
[  OK  ] Mounted Kernel Debug File System.
[    7.315649] systemd[1]: Mounted Kernel Trace File System.
[  OK  ] Mounted Kernel Trace File System.
[    7.340200] systemd[1]: Finished Create list of static device nodes for the current kernel.
[  OK  ] Finished Create list of st… nodes for the current kernel.
[    7.368151] systemd[1]: modprobe@configfs.service: Succeeded.
[    7.374923] systemd[1]: Finished Load Kernel Module configfs.
[  OK  ] Finished Load Kernel Module configfs.
[    7.400166] systemd[1]: modprobe@drm.service: Succeeded.
[    7.406412] systemd[1]: Finished Load Kernel Module drm.
[  OK  ] Finished Load Kernel Module drm.
[    7.427654] systemd[1]: Started Journal Service.
[  OK  ] Started Journal Service.
[  OK  ] Finished Load Kernel Module fuse.
[  OK  ] Finished Load Kernel Modules.
[  OK  ] Finished Remount Root and Kernel File Systems.
         Mounting FUSE Control File System...
         Mounting Kernel Configuration File System...
[    7.541627] random: systemd: uninitialized urandom read (16 bytes read)
         Starting Flush Journal to Persistent Storage[0[    7.551430] random: systemd-journal: uninitialized urandom read (16 bytes read)
m...
[    7.575475] random: systemd: uninitialized urandom read (16 bytes read)
         Starting Load/Save Random Seed...
[    7.586645] systemd-journald[232]: Received client request to flush runtime journal.
         Starting Apply Kernel Variables...
[    7.618026] systemd-journald[232]: File /var/log/journal/5373c8a9c3424343990ddc419823c6d0/system.journal corrupted or uncleanly shut down, renaming and replacing.
         Starting Create System Users...
[  OK  ] Mounted FUSE Control File System.
[  OK  ] Mounted Kernel Configuration File System.
[  OK  ] Finished Apply Kernel Variables.
[  OK  ] Finished Create System Users.
         Starting Create Static Device Nodes in /dev...
[  OK  ] Finished Flush Journal to Persistent Storage.
[  OK  ] Finished Create Static Device Nodes in /dev.
[  OK  ] Reached target Local File Systems (Pre).
         Mounting /config...
         Starting Rule-based Manage…for Device Events and Files...
[  OK  ] Finished Coldplug All udev Devices.
[  OK  ] Mounted /config.
         Starting Helper to synchronize boot up for ifupdown...
[  OK  ] Finished Helper to synchronize boot up for ifupdown.
[  OK  ] Started Rule-based Manager for Device Events and Files.
[  OK  ] Found device /dev/ttyPS1.
[    8.231099] random: crng init done
[    8.234530] random: 72 urandom warning(s) missed due to ratelimiting
[  OK  ] Finished Load/Save Random Seed.
[  OK  ] Found device Ultra_HS-COMBO boot.
[  OK  ] Reached target Sound Card.
[  OK  ] Listening on Load/Save RF …itch Status /dev/rfkill Watch.
         Mounting /mnt/boot...
[  OK  ] Mounted /mnt/boot.
[  OK  ] Reached target Local File Systems.
[  OK  ] Started ifup for eth0.
         Starting Raise network interfaces...
         Starting Create Volatile Files and Directories...
[  OK  ] Finished Create Volatile Files and Directories.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Finished Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Daily apt download activities.
[  OK  ] Started Daily apt upgrade and clean activities.
[  OK  ] Started Periodic ext4 Onli…ata Check for All Filesystems.
[  OK  ] Started Discard unused blocks once a week.
[   10.084577] macb ff0c0000.ethernet eth0: PHY [ff0c0000.ethernet-ffffffff:08] driver [TI DP83867] (irq=POLL)
[   10.094385] macb ff0c0000.ethernet eth0: configuring for phy/rgmii-id link mode
[   10.102416] pps pps0: new PPS source ptp0
[   10.106595] macb ff0c0000.ethernet: gem-ptp-timer ptp clock registered.
[  OK  ] Started Daily rotation of log files.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Reached target Timers.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
         Starting Avahi mDNS/DNS-SD Stack...
[  OK  ] Started Regular background program processing daemon.
[  OK  ] Started D-Bus System Message Bus.
         Starting System Logging Service...
         Starting User Login Management...
         Starting WPA supplicant...
[  OK  ] Finished Raise network interfaces.
[  OK  ] Started System Logging Service.
[  OK  ] Started User Login Management.
[  OK  ] Started Avahi mDNS/DNS-SD Stack.
[  OK  ] Started WPA supplicant.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
         Starting Samba NMB Daemon...
         Starting Network Time Service...
         Starting OpenBSD Secure Shell server...
         Starting Permit User Sessions...
[  OK  ] Finished Permit User Sessions.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttyPS1.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started Network Time Service.
[  OK  ] Started OpenBSD Secure Shell server.
[   14.180774] macb ff0c0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   14.188469] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Debian GNU/Linux 11 debian-fpga ttyPS1

debian-fpga login: [   21.343373] macb ff0c0000.ethernet eth0: Link is Down
[   22.368218] macb ff0c0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   23.391385] macb ff0c0000.ethernet eth0: Link is Down
[   28.512218] macb ff0c0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   30.559369] macb ff0c0000.ethernet eth0: Link is Down
[   31.584208] macb ff0c0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   32.607369] macb ff0c0000.ethernet eth0: Link is Down
[   53.088161] macb ff0c0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off

  1. 2023年05月02日 05:03 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる4(環境を整備)

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる3”の続き。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみようということで、前回、ikwzm さんに修正していただいた Debian11 を起動してみたところ、見事に起動した。更に、Linux イメージ・パッケージをインストールした。今回は、LAN に接続して、SSH でログインし、環境を設定した。

ホストパソコンから KR260 の Debian Linux へ ssh でログインする。
ssh 192.168.3.33 -X -l fpga
kr260_Debian11_12_230430.png

最初に現在の環境をアップデートする。
sudo apt update
kr260_Debian11_13_230430.png

sudo apt upgrade
kr260_Debian11_14_230430.png

X11関連のパッケージをインストールする。
sudo apt install xbase-clients xterm x11-apps
kr260_Debian11_15_230430.png

GUI アプリ(nautilus と geany)をインストールする。
sudo apt install nautilus geany
kr260_Debian11_16_230430.png

KR260 をリブートした。

もう一度 ssh でログインしてから、
nautilus &
でファイル・マネージャーを起動した。
kr260_Debian11_17_230430.png

geany も起動した。
geany &
kr260_Debian11_18_230430.png

最後に日本語フォントをインストールした。
sudo apt install fonts-vlgothic fonts-horai-umefont fonts-umeplus
kr260_Debian11_19_230430.png
  1. 2023年05月01日 04:49 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0