4.3K Views
January 26, 24
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、Kria KV260でRaspberry Pi Camera Module 3を動かしてみた
Kria KV260にはRaspberry Pi Camera互換のコネクタがあり、
Raspberry Pi Camera Module V2を動かす既存のOSSがいくつか存在します。
今年1月に新モデルのRaspberry Pi Camera Module 3が発売されましたが、
こちらをFPGAで動かしている例はほとんど見当たりません。
本セミナーでは、既存のOSSをベースにして、KV260でRaspberry Pi Camera Module 3を動かす方法を紹介します。
ベースとして使用するOSSとOSは下記の3通りで、それぞれについて必要な手順と注意点を説明します。
1.ultra96v2_imx219_to_displayport(ベアメタル)
2.Kria-PYNQ 1.0(Ubuntu 20.04)
3.NLP SmartVision(Ubuntu 22.04)
2、FPGA 合成クラスターをつくる
Fixstars には複数のFPGA 合成用マシンがありますが、
エンジニア各々が空いている合成マシンを確認してから合成しているため、
マシンが空くのを待つような状況がしばしば発生しており、
合成マシンが空き次第速やかに合成ジョブを投入できていないという課題があります。
この状況を改善するため、
合成ジョブを投入すると自動的に合成用マシンを割り当てて効率的に合成することが可能な
FPGA 合成クラスターを構築したので、そこで得られたノウハウを共有します。
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
実践的!FPGA開発セミナー vol.23 2023/06/28 18:00~ Copyright© Fixstars Group 1
FPGA 合成クラスターをつくる Copyright© Fixstars Group 2
Who I am Eisuke MOCHIZUKI 写真 望月 英輔 ソリューション第四事業部 シニアエンジニア Copyright© Fixstars Group
FPGA 合成クラスターをつくるモチベーション ● Fixstars には複数のFPGA 合成用マシンが存在 ○ 7 台のマシンを10人くらいのFPGA エンジニアで使用している ■ ○ ● ● 1人が複数のデザインを合成することもあるので納品前は枯渇しがち 各マシンのCPU、メモリ等のスペックはバラバラ 現状: エンジニア各々が空いているマシンを確認して合成を開始 ○ 合成マシンが空いていない場合、しばらくまって確認するを繰り返す ○ 無理やり合成するとメモリを食い合って合成がFail することも 希望: ジョブを投入しておけば空いているマシンで合成を実行 ○ 合成マシンが空いていない状態でジョブを投入しても、空きが発生次第合成が開始される Copyright© Fixstars Group 4
希望のイメージ図 PC1 ユーザー1 スケジューラ PC2 ユーザー2 PC3 ユーザー3 PC4 Copyright© Fixstars Group 5
実現したいこと(要件) ● AMD Xilinx Vivado/Vitis を使用する ● コントローラに合成ジョブを送ると、自動的にマシンを選択し実行する ● 1つの合成ジョブは1つのマシン上で実行する ○ ● 複数のマシンで分散実行はしない 1つのマシン上では複数の合成ジョブが実行可能 ○ リソースの許す限りのジョブを実行する ■ ● CPUコア数、メモリ・・・ Linux を使用し、CUI から合成を実行する ○ Fixstars におけるFPGA 開発では、合成はCUI から実行することがほとんど Copyright© Fixstars Group 6
利用できそうなもの ● Vivado が用意しているリモート合成機能 ○ Vivado GUI 上から合成する際に利用可能なリモート合成機能 ○ 予め設定しておけば、合成クラスターに合成ジョブを投入できる ■ ○ ● Using Remote Hosts and Compute Clusters 今回はCUI から合成を実行したいため見送り Kubernetes (K8s) ○ docker 等のコンテナのオーケストレーションツールであるK8s を利用すると、 非常に高い自由度で合成クラスターを構築可能 ○ ● 一方、構築にかかるコストが高く、今回の用途ではオーバースペックと感じたため見送り Slurm ○ HPC 等で利用されるジョブスケジューラ(詳細後述) ○ 今回の用途とマッチしていたためこちらを採用 Copyright© Fixstars Group 7
Slurm について ● Linux 上で動作するフリーのジョブスケジューラ ● 複数のPC(ノード) のリソース(CPU, MEM ...) を管理し、ジョブを割り振る ○ ジョブの使用するリソース量を指定可能 ○ 各ノードのリソース量以上のジョブは割り振らず、他のノードに割り振るかキューに保留 ■ ● FPGA の合成ではメモリを大量消費するので、そこを管理できるのは嬉しい ハイパフォーマンスであり、HPC での採用が目立つ ○ 2017年のTOP500 において、上位10位中6個のシステムで使用されている ■ Slurm Workload Manager - Wikipedia https://slurm.schedmd.com/overview.html Copyright© Fixstars Group 8
Slurm 環境のセットアップ ● Quick Start Administrator Guide を参照し、セットアップを実施 ○ 上記に従えば確かにセットアップはできるのだが、 具体的なコマンド等が示されておらず、かなり不親切な印象 ○ 日本語の情報も古いものが多く、参考にできないものが多かった ■ ● 要望があれば、最新Ver. でのセットアップ方法をどこかに記載します 現状以下のような構成となっている ○ コントローラ(スケジューラ) ○ ノード1 ■ ○ ノード2 ■ ○ CPUs=36 Boards=1 SocketsPerBoard=1 CoresPerSocket=18 ThreadsPerCore=2 RealMemory=128452 CPUs=48 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=2 RealMemory=128454 ノード3 ■ CPUs=40 Boards=1 SocketsPerBoard=2 CoresPerSocket=10 ThreadsPerCore=2 RealMemory=257105 Copyright© Fixstars Group 9
FPGA 合成クラスターとして運用するために ● Slurm はあくまでコマンドやスクリプトを実行するだけである点に注意 ○ 合成対象のコードはgit clone, scp, NFS などで各ノードに渡しておく必要あり ○ Vivado/Vitis も予め各ノードにインストールしておく必要がある ■ すべてのVer. をすべてのノードにインストールしておく必要はなく、 インストールされているVer. 毎に”PARTITION” を設定しておけば、 ジョブ実行時に使用したいVer. を指定できる PARTITION “2022.1” PC1 PC2 - Vivado 2022.1 - Vivado 2022.1 - Vivado 2020.1 Copyright© Fixstars Group PC3 PARTITION “2020.1” - Vivado 2020.1 10
FPGA 合成クラスターとして運用するために ● Slurm の機能で便利そうなもの ○ ジョブ実行毎に要求するメモリサイズを指定できる ■ ○ ジョブの完了を指定したメールアドレスに通知する機能 ■ ● メモリの使用量が対象FPGA 毎に異なるので、適宜指定することでリソースを有効活用 合成時間の長くなりがちなFPGA 合成にはありがたい 細かい問題によりまだ運用できていませんが、近々ベータテストを行います Copyright© Fixstars Group 11
Kria KV260で Raspberry Pi Camera Module 3を動かしてみた Copyright© Fixstars Group 12
Who I am Takumi IMAI 写真 今井 巧 ソリューション第四事業部 シニアエンジニア Copyright© Fixstars Group
自己紹介 ● 今井 巧 ○ 2022年4月中途入社 ○ 略歴 ■ 家電メーカー ● 画像処理関連の研究開発 ○ ● ■ リアルタイム処理のためFPGAを利用 車載カメラの評価ソフトウェア開発 フィックスターズ ● GPUを使用した推論処理や複数カメラ処理の高速化 Copyright© Fixstars Group 14
アジェンダ ● ● Raspberry Pi Camera Module 3(IMX708)の概要 オープンソースのコードをベースにしてKV260でIMX708を動かす a. ベアメタルで動かす https://github.com/gtaylormb/ultra96v2_imx219_to_displayport (Sony IMX219用) b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす https://github.com/Xilinx/Kria-PYNQ/tree/v1.0 (OmniVision OV5640用) c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす https://xilinx.github.io/kria-apps-docs/kv260/2022.1/build/html/docs/nlp-smartvision/nlp _smartvision_landing.html (OnSemi AR1335またはSony IMX219またはUVCカメラ用) ● まとめ どのケースでもPLはオリジナルから変更せず、ソフトウェア部分の変更だけでIMX708に対応します。 ベアメタルのビルドにはVivadoとVitisが必要です。 それ以外はKV260自体でビルドできます。 Copyright© Fixstars Group 15
Raspberry Pi Camera Module 3(IMX708)の概要1 ラズパイ用カメラモジュールの三世代目 接続インターフェースは従来どおりの15ピンFPCでMIPI 2レーン接続 総画素数 出力解像度 (動画, 静止画) 名称 センサ 特徴 Camera Module V1.3 OmniVision 5M pixels OV5647 1920x1080p30, Fixed Focus 2592x1944 Camera Module V2.1 Sony IMX219 8M pixels 1920x1080p47, Manual Focus 3280x2464 Camera Module 3 Sony IMX708 11.9M pixels 2304x1296p56, Auto Focus 4608x2592 HDR https://www.raspberrypi.com/documentation/accessories/camera.html Copyright© Fixstars Group 16
Raspberry Pi Camera Module 3(IMX708)の概要2 通常レンズと広角レンズの2種類に加えて、 IRカットフィルタありとなしの組み合わせがあり、計4種類のラインナップ 名称 画角 最小焦点距離 IRフィルタ Normal 水平66°/垂直41° 5cm Normal NoIR 水平66°/垂直41° Wide 5cm 水平102°/垂直67° 10cm あり 価格 $25 日本では 4,400円 なし $25 あり $35 今回使用 日本では Wide NoIR 水平102°/垂直67° 10cm なし $35 5,940円 選び方:用途に応じた画角を選択 NoIRは赤外線ライトを使った暗視撮影をしたい場合などに Copyright© Fixstars Group 17
Raspberry Pi Camera Module 3(IMX708)の概要3 ● I2Cによるカメラレジスタへのアクセス ○ データシートはNDAを結ばないと手に入らない ■ しかしながら、ラズパイのソースコードやデバイスツリーから、 初期化コマンドや一部のレジスタアクセスの情報はわかる https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/media/i2c/imx708.c https://github.com/raspberrypi/linux/blob/rpi-6.1.y/arch/arm/boot/dts/overlays/imx708.dtsi https://github.com/raspberrypi/linux/blob/rpi-6.1.y/arch/arm/boot/dts/overlays/imx708-overlay.dts ○ ○ ○ ○ ○ スレーブアドレスは0x1a デバイスのprobeに用いられるCHIP IDのレジスタアドレスは0x0016で値は 0x0708 IMX219でCHIP IDが書かれていたレジスタアドレス0x0000にはレンズやIRカッ トフィルタの種別などの情報が格納されている(Normal or Wide, IR or NoIR) レジスタアドレスは16bit レジスタ値はアドレスによって8bitと16bitがある ■ 16bitデータはビッグエンディアン Copyright© Fixstars Group 18
a. ベアメタルで動かす - ベースにするプロジェクト https://github.com/gtaylormb/ultra96v2_imx219_to_displayport ● リポジトリ名の通り、Ultra96でIMX219を動かすものだが、 2021年末にKV260用のデザインが追加された。 ● Xilinxの無償IPを使ったRAW現像処理とDisplayPort出力が実装されている。 ● Vitisでビルドするベアメタルソフトウェアは、各IPとカメラの初期化を行っている。 1920x1080p47 bayer RAW (10bit RGGB) カメラ入力 1920x1080p47 MIPI CSI-2受信 ・MIPI CSI2 Receiver/Transmitter Subsystem bayer RAW (10bit RGGB) デモザイク ・Sensor Demosaic 1920x1080p47 Linear-RGB (10bit) ガンマ変換 ・Gamma LUT 1920x1080p60 RGB (12bit) DisplayPort出力 インターフェース変換 1920x1080p60 RGB (10bit) ・AXI4-Stream to Video Out フレームバッファ ・AXI Video DMA ・Test Pattern Generator Copyright© Fixstars Group 1920x1080p47 RGB (10bit) 19
a. ベアメタルで動かす - IMX708での変更点(PL) IMX708では赤字のようにMIPI入力の解像度が一回り大きい。 デモザイク以降のIPが入力解像度1920x1080までの設定になっているため、 変更が必要かと思われたが、試してみるとPLは一切変更しなくても動作した。 (おそらく表示されていない1920x1080の外側部分は正しく処理されていない) 2304x1296p56 bayer RAW (10bit RGGB) カメラ入力 2304x1296p56 MIPI CSI-2受信 ・MIPI CSI2 Receiver/Transmitter Subsystem 4096ラインまで 1920x1080p60 RGB (12bit) DisplayPort出力 インターフェース変換 bayer RAW (10bit RGGB) デモザイク ・Sensor Demosaic IMX219と同じ ベイヤー配列 1920x1080まで 1920x1080p60 RGB (10bit) フレームバッファ ・AXI4-Stream to Video Out Linear-RGB (10bit) ガンマ変換 ・AXI Video DMA ・Test Pattern Generator 1920x1080まで 2304x1296p56 ・Gamma LUT 2304x1296p56 RGB (10bit) 1920x1080まで Copyright© Fixstars Group 20
a. ベアメタルで動かす - IMX708での変更点(PS)
●
変更が必要なのはセンサの初期化を行っている以下の2ファイル
○
○
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.h
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.c
imx219.h
imx219.cのimx219_init()内のセンサ検出処理
#define IMX219_I2C_SLAVE_ADDR 0x10
#define IMX219_I2C_SLAVE_ADDR 0x1a
int imx219_init();
int imx219_write(u16 addr, u8 data);
int imx219_write16(u16 addr, u16 data);
int imx219_read(u16 addr, u8 *data);
16bit値の書き込み関数追加
(アナログゲイン設定用)
I2Cスレーブアドレス変更
CHIP IDのアドレスを0x0000から
0x0016へ変更
memset(addr, 0, sizeof(addr));
addr = 0x0016;
if (XIicPs_MasterSendPolled(&iic, addr, 2, IMX219_I2C_SLAVE_ADDR) != XST_SUCCESS) {
xil_printf("imx219 send failed\r\n");
return XST_FAILURE;
}
if (XIicPs_MasterRecvPolled(&iic, camera_model_id, 2, IMX219_I2C_SLAVE_ADDR) != XST_SUCCESS) {
xil_printf("imx219 receive failed\r\n");
return XST_FAILURE;
CHIP IDの期待値を0x0219から
}
0x0708へ変更
if (camera_model_id[0] != 0x2 && camera_model_id[1] == 0x19) {
if (camera_model_id[0] != 0x07 && camera_model_id[1] == 0x08) {
xil_printf("could not read camera id\r\n");
return XST_FAILURE;
}
else {
xil_printf("I2C communication established with IMX219\r\n");
}
Copyright© Fixstars Group
21
a. ベアメタルで動かす - IMX708での変更点(PS)
●
変更が必要なのはセンサの初期化を行っている以下の2ファイル
○
○
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.h
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.c
imx219.cのimx219_init()のセンサ初期化処理
<HDRを有効にしない場合 > 2304x1296p56
/* 1920x1080P48 */
imx219_write(0x30EB, 0x05);
imx219_write(0x30EB, 0x0C);
:
imx219_write(0x479B, 0x0E);
imx219_write(0x0100, 0x01);
xil_printf("Wrote initial configuration to IMX219 sensor\r\n");
※最後の映像出力を開始するコマンド
(0x0100, 0x01)はIMX708でも変わらないので
そのままにする
(参考) ソースコード内にある他の初期化設定
mode_2x2binned_720p_regs[] → 1536x864p90
mode_4608x2592_regs[] → 4608x2592p14
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/driver
s/media/i2c/imx708.cのmode_common_regs[]と
mode_2x2binned_regs[]の内容へ差し替え
<HDRを有効にする場合 > 2304x1296p30
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/driver
s/media/i2c/imx708.cのmode_common_regs[]と
mode_hdr_regs[]の内容へ差し替え
(0x0222, IMX708_HDR_EXPOSURE_RATIO)の部分は
(0x0222, 4)にする
※imx708.cの上部で定義されている
Copyright© Fixstars Group
22
a. ベアメタルで動かす - IMX708での変更点(PS)
●
変更が必要なのはセンサの初期化を行っている以下の2ファイル
○
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.h
○
https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/software/src/imx219.c
imx219.cへ16bitデータ書き込み関数を追加
imx219.cのimx219_init()のアナログゲイン設定
int imx219_write16(u16 addr, u16 data) {
u8 buf[4];
buf[0]
buf[1]
buf[2]
buf[3]
=
=
=
=
xil_printf("Wrote initial configuration to IMX219 sensor\r\n");
imx219_write(IMX219_ANA_GAIN_GLOBAL, 232);
imx219_write16(0x0204, 960);
addr >> 8;
addr & 0xff;
data >> 8;
data & 0xff;
//imx219_write(IMX219_COARSE_INT_TIME_HI, 0x02);
return XST_SUCCESS;
while (TransmitFifoFill(&iic) || XIicPs_BusIsBusy(&iic)) {
usleep(1);
xil_printf("waiting for transmit...\r\n");
}
if (XIicPs_MasterSendPolled(&iic, buf, 4,
IMX219_I2C_SLAVE_ADDR) != XST_SUCCESS) {
xil_printf("imx219 write failed, addr: %x\r\n", addr);
return XST_FAILURE;
}
usleep(1000);
アナログゲインをIMX708の最大値に設定
return XST_SUCCESS;
}
Copyright© Fixstars Group
23
a. ベアメタルで動かす - 作業手順 または2023.1 1. Vivado 2022.2でplatformを生成するためtclスクリプトを変更 https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/blob/master/fpga/bd/imx219_to_kria_displayport_vivado2021.2.tcl ツールバージョンの変更 ● ○ ● set scripts_vivado_version 2021.22022.2 ○ (2023.1の場合は2023.1) IPバージョンの変更 ● BOARD_PART設定の修正 ○ mipi_csi2_rx_subsystem:5.15.2 ○ v_tpg:8.18.2 ○ zynq_ultra_ps_e:3.33.4 キャリアボード接続を含むBOARD_PART設定をtclで実 行するとエラーになる ○ BOARD_PART設定とBOARD_CONNECTIONS設定に分 けて書くとよい (2023.1の場合は5.3) ● 制約ファイルの追加とwrapperファイルの生成処理を追加 (2023.1の場合は3.5) ○ 元々はMakefileで行われる処理 set_property BOARD_PART xilinx.com:kv260_som_som240_1_connector_kv260_carrier_som240_1_connector:part0:1.2 [current_project] set_property BOARD_PART xilinx.com:kv260_som:part0:1.3 [current_project] set_property BOARD_CONNECTIONS {som240_1_connector xilinx.com:kv260_carrier:som240_1_connector:1.3} [current_project] add_files -fileset constrs_1 -quiet ../constraints/Kria_KV_CarrierCard_Rev1.xdc : validate_bd_design save_bd_design set design_name [get_bd_designs] make_wrapper -files [get_files $design_name.bd] -top -force -quiet -import Copyright© Fixstars Group 24
a. ベアメタルで動かす - 作業手順 2. Vivado 2022.2でbitstreamを生成する Makefileが用意されていますが、今回は使わずに手動でBlock Designを復元します。 ● VivadoのTclコンソールまたはVivado 2022.1 Tcl Shellから以下を実行 cd fpga/bd source ./imx219_to_kria_displayport_vivado2022.2.tcl ● SettingsのImplementationからStrategiesをPerformance_ExplorePostRoutePhysOptへ変更 ○ デフォルトのままだと微妙にタイミング制約を満たさないため ● Generate Bitstreamします ● bitstreamを含むxsaファイルをexportします Copyright© Fixstars Group 25
a. ベアメタルで動かす - 作業手順 3. Vitis 2022.2でplatformとPSソフトウェアを生成する ● SDカード無しでKV260を起動する ● Vitisを起動して適当なworkspaceを作成する ● Vivadoでexportしたxsaファイルからplatformを作成する ○ Generate boot componentsのチェックを外す ● 作成したplatfromのApplication Projectを作成し、Hello Worldを選択 ● helloworld.cを削除してから https://github.com/gtaylormb/ultra96v2_imx219_to_displayport/tree/master/software/src のファイルと、変更したimx219.cとimx219.hを追加する ● System project settingsでGenerate SD card imageのチェックを外してビルド ● Run asでRun Configurationを選択し、Single Application DebugまたはSingle Application Debug (GDB)を選んでNew Configuration ● Target SetupでUse FSBL flow for initializationのチェックを外してRun Copyright© Fixstars Group 26
a. ベアメタルで動かす - 実演 時間があれば最後に Copyright© Fixstars Group 27
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす https://github.com/Xilinx/Kria-PYNQ/tree/v1.0 ● Kria-PYNQの最新版は3.0だが、MIPI周りを含むbase overlayが1.0から更新されていないためか、 Ubuntu 22.04ではMIPIカメラが正常動作しなかった。 ● そのためKV260のfirmwareを2021.1 Boot FWへダウングレードした上で、 Ubuntu 20.04とKria-PYNQ 1.0を使用する。 ● Kria-PYNQ 1.0はPYNQ 2.7.0相当。Pcam5cを1280x720p60で動かすoverlayが含まれている。 ● PYNQのbase overlayのMIPI周りは先のベアメタルと同等の構成になっており、PL側の変更は不要。 PS側はセンサの初期化を行っている共有ライブラリの差し替えと、IPの解像度設定を変更する。 ● 作業の流れ 1. 2. 3. 4. 5. 6. Ubuntu 20.04または22.04を使ってKV260のfirmwareを更新 SDカードにUbuntu 20.04のイメージを書き込む Ubuntu 20.04をブートして初期設定 Kria-PYNQ 1.0インストール libpcam5c.soをソースコードからビルドして差し替え JupyterLabでkv260/video/mipi_to_displayport.ipynbを実行 Copyright© Fixstars Group 28
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 1. Ubuntu 20.04または22.04でKV260のfirmwareを更新 ● Xilinx Wikiから2021.1 Boot FW Updateをダウンロードする https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM#Boot-Firmware-Updates https://www.xilinx.com/member/forms/download/xef.html?filename=2021.1_update2_BOOT.BIN 2022.1_update3 22.04 20.04 ◯ ✕ 2021.1_update2 Copyright© Fixstars Group 22.04 20.04 ✕ ◯ 29
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 1. Ubuntu 20.04または22.04でKV260のfirmwareを更新 ● Xilinx Wikiから2021.1 Boot FW Updateをダウンロードする https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM#Boot-Firmware-Updates https://www.xilinx.com/member/forms/download/xef.html?filename=2021.1_update2_BOOT.BIN ● firmware更新 ○ ○ ● ● Ubuntu 20.04の場合 ■ sudo xlnx-config -x bootfw_update -i 2021.1_update2_BOOT.BIN Ubuntu 22.04の場合 ■ sudo image_update -i 2021.1_update2_BOOT.BIN 電源を入れ直す ※再起動は不可 更新したfirmwareをbootableに設定する(これをしないと次に電源を入れた際に元のfirmwareに戻る) ○ ○ sudo xlnx-config -x bootfw_update -v Ubuntu 22.04の場合 ■ sudo image_update -v (補足)更新したfirmwareではUbuntu 22.04がブートしないので、Ubuntu 22.04を使う際は元に戻す ● ● sudo xlnx-config -x bootfw_update -i BOOT_xilinx-k26-starterkit-v2022.1-09152304_update3.BIN (Ubuntu 22.04で起動後に) sudo image_update -v Copyright© Fixstars Group 30
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 2. SDカードにUbuntu 20.04のイメージを書き込む https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2037317633/Getting+Started+with+Certified+U buntu+20.04+LTS+for+Xilinx+Devicesの説明に従います。 ● Ubuntu Desktop 20.04.3 LTSのイメージファイルをダウンロード ○ https://ubuntu.com/download/amd-xilinxの中程にあるリンク ○ https://people.canonical.com/~platform/images/xilinx/kria/iot-kria-classic-desktop-2004-x0 3-20211110-98.img.xz?_ga=2.2233784.969660356.1682915914-687109518.1680662501 ● balenaEtcher等を使ってイメージファイルをSDカードに書き込む ○ https://www.balena.io/etcher ● SDカードとUART用のマイクロUSBケーブルを接続し、ボードにACアダプタをつなぐ Copyright© Fixstars Group 31
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 3. Ubuntu 20.04をブートして初期設定 https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2037317633/Getting+Started+with+Certified+U buntu+20.04+LTS+for+Xilinx+Devicesの説明に従います。 ● パッケージの更新 ○ sudo apt update ○ sudo apt -y upgrade Ubuntu 22.04では2.xですが、 ○ sudo snap install xlnx-config --classic --channel=1.x Ubuntu 20.04では1.xです ○ sudo xlnx-config.sysinit ● firmwareをbootableに設定する (これをしないと次に電源を入れた際に元のfirmwareに戻り、Ubuntu20.04がブートしなくなります) ○ sudo xlnx-config -x bootfw_update -v Copyright© Fixstars Group 32
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 4. ● ● ● Kria-PYNQ 1.0インストール GitHubからブランチを指定してクローン ○ git clone -b v1.0 https://github.com/Xilinx/Kria-PYNQ ○ cd Kria-PYNQ インストールスクリプトを変更 ○ nano install.sh ■ 変更前:python3 -m pip install pynq ■ 変更後:python3 -m pip install pynq==2.7.0 インストール ○ sudo bash install.sh Copyright© Fixstars Group ブランチ指定無しで最新版を使用 してしまうと、base overlayとの バージョン整合性がないため、う まくいきません pynqモジュールのみバージョン指 定がされていないため、変更なし では3.0.0がインストールされて しまい、様々な弊害が出ます 33
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす
5.
●
●
base overlayのlibpcam5c.soをソースコードからビルドして差し替え
関係するファイル
○ ソースコード
/usr/local/share/pynq-venv/lib/python3.8/site-packages/pynq/lib/_pynq/_pcam5c
■ pcam_5c.h
■ pcam_5c.c
■ pcam_mipi.c
○ ライブラリ, Pythonスクリプト
/usr/local/share/pynq-venv/lib/python3.8/site-packages/pynq/lib/video
■ libpcam5c.so
<HDRを有効にしない場合> 2304x1296p56
■ pcam5c.py
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/med
ソースコード変更
ia/i2c/imx708.cのmode_common_regs[]とmode_2x2binned_regs[]
○ pcam_5c.h
と{0x0100, 0x01}へ差し替え
■ cfg_init_[]の中身を差し替え
○ pcam_5c.c
<HDRを有効にする場合> 2304x1296p30
https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/med
○ pcam_mipi.c
ia/i2c/imx708.cのmode_common_regs[]とmode_hdr_regs[]と
{0x0100, 0x01}へ差し替え
Copyright© Fixstars Group
34
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす
5.
●
base overlayのlibpcam5c.soをソースコードからビルドして差し替え
ソースコード変更
○ pcam_5c.c
○
■
init_pcam()のセンサ検出処理を変更
u8TxData[0]=0x300x00;
u8TxData[1]=0x0A0x16;
if(u8RxData[0]!=0x560x07) {
:
u8TxData[0]=0x300x00;
u8TxData[1]=0x0B0x17;
if(u8RxData[0]!=0x400x08) {
:
■
■
センサ検出以降の処理を削除
StartPcam()の中身を削除(何もせずにreturn 0;)
■
アナログゲイン設定を追加
unsigned char u8TxData[34], u8RxData[3];
:
u8TxData[0]=0x02;
u8TxData[1]=0x04;
u8TxData[2]=960 / 256;
u8TxData[3]=960 % 256;
if (WriteCmd(pcam_i2c_fd, u8TxData, 4) !=
XST_SUCCESS)( {
return -1;
}
pcam_mipi.c
■
PCAM_I2C_ADDRを0x3Cから0x1Aへ変更
Copyright© Fixstars Group
35
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 5. ● ● ● base overlayのlibpcam5c.soをソースコードからビルドして差し替え ビルド ○ cd /usr/local/share/pynq-venv/lib/python3.8/site-packages/pynq/lib/_pynq/_pcam5c ○ sudo make libpcam5c.soを差し替え ○ sudo cp libpcam5c.so /usr/local/share/pynq-venv/lib/python3.8/site-packages/pynq/lib/video ■ 必要な場合はあらかじめバックアップを取っておく pcam5c.pyの変更 ○ __init__()の中でpcam5c_lib.pcam_mipiを呼び出している部分のMIPIModeを変更 ■ 変更前:init(MIPIMode.r1280x720_60.value), ■ 変更後:init(MIPIMode.r1920x1080_30.value), Copyright© Fixstars Group 36
b. Ubuntu 20.04 + PYNQ 1.0のBase Overlayで動かす 6. ● ● ● ● JupyterLabでkv260/video/mipi_to_displayport.ipynbを実行 kria:9090/labをブラウザで開く kv260/video/mipi_to_displayport.ipynbを開く 表示解像度設定を変更する ○ 変更前:VideoMode(1280, 720, 24) ○ 変更後:VideoMode(1920, 1080, 24) 全てのセルを実行する ○ フレームレート計測の結果はセンサの 動作レートと同じ56fpsになりました またbase overlayを使用する他のNotebookも利用可能です ● 例)pynq_composable/custom_pipeline/09_mipi_pipeline.ipynb ○ カメラ入力に対してエッジ抽出フィルタを適用するNotebook Copyright© Fixstars Group 37
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす https://xilinx.github.io/kria-apps-docs/kv260/2022.1/build/html/docs/nlp-smartvision/nlp_smar tvision_landing.html ● ● ● 自然言語処理(natural language processing)とカメラ映像認識を組み合わせたデモアプリケーション 従来はベーシック アクセサリ パックに含まれるAR1335またはUSBカメラにのみ対応していたが、 Ubuntu22.04対応の2022.1にてIMX219対応が追加された 2022.1で追加 https://github.com/Xilinx/nlp-smartvision より Copyright© Fixstars Group 38
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす https://xilinx.github.io/kria-apps-docs/kv260/2022.1/build/html/docs/nlp-smartvision/nlp_smar tvision_landing.html ● ● ● ● 自然言語処理(natural language processing)とカメラ映像認識を組み合わせたデモアプリケーション 従来はベーシック アクセサリ パックに含まれるAR1335またはUSBカメラにのみ対応していたが、 Ubuntu22.04対応の2022.1にてIMX219対応が追加された。 センサの初期化はUbuntuのカーネルモジュール(imx219.ko)が行っている。 ○ IMX708対応にはカーネルモジュールの追加とDevice Treeの変更とスクリプトの変更が必要 関連資料 ○ ○ ○ ○ アプリケーションソースコード ■ https://github.com/Xilinx/nlp-smartvision ● ビルドはdocker環境(petalinux)を使用する ○ https://github.com/Xilinx/kria-docker platform ■ https://github.com/Xilinx/kria-vitis-platforms/tree/xlnx_rel_v2022.1/kv260/overlays/examples/nlp-smartvision firmware(bitstream, Device tree) ■ https://github.com/Xilinx/kria-apps-firmware/tree/xlnx_rel_v2022.1/boards/kv260/nlp-smartvision Ubuntu 20.04版向け説明(旧バージョン) ■ https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2218918010/Snaps+-+xlnx-nlp-smartvision+Snap+for+Ce rtified+Ubuntu+on+Xilinx+Devices Copyright© Fixstars Group 39
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす ● 作業の流れ カーネルビルドについては https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2287796272/Rebuilding+the+Certified+Ubunt u+for+Xilinx+Devices+20.04+LTS+Kernel+from+Sourceを参照します。 1. KV260のfirmwareを更新 2. SDカードにUbuntu 22.04のイメージを書き込む 3. Ubuntu 22.04をブートして初期設定 4. KV260のカーネルソースコードを取得 5. imx708のソースコードを追加 6. カーネル一式をビルド 7. デバイスツリーの変更 8. カーネルモジュールとデバイスツリーをコピー 9. NLP SmartVisionのoverlay実行 10. 初期化スクリプト変更 11. NLP SmartVisionのアプリケーション実行 12. 他のソフトウェアやライブラリからIMX708を使用する Copyright© Fixstars Group 40
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 1. ● KV260のfirmwareを更新 Xilinx Wikiから2022.1 Boot FW Updateをダウンロードする https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM#Boot-Firmware-Updates https://www.xilinx.com/member/forms/download/xef.html?filename=BOOT_xilinx-k26-starterkit-v2022.1-09152304_update3.BIN ● firmware更新 ○ ○ ● ● Ubuntu 20.04の場合 ■ sudo xlnx-config -x bootfw_update -i BOOT_xilinx-k26-starterkit-v2022.1-09152304_update3.BIN Ubuntu 22.04の場合 ■ sudo image_update -i BOOT_xilinx-k26-starterkit-v2022.1-09152304_update3.BIN 電源を入れ直す ※再起動は不可 更新したfirmwareをbootableに設定する(これをしないと再起動後元のfirmwareに戻る) ○ sudo image_update -v Copyright© Fixstars Group 41
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 2. SDカードにUbuntu 22.04のイメージを書き込む https://japan.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-getting-started/getting-st arted.htmlに従う。 ● Ubuntu Desktop 22.04.2 LTSのイメージファイルをダウンロード ○ https://ubuntu.com/download/amd-xilinx ○ https://people.canonical.com/~platform/images/xilinx/kria-ubuntu-22.04/iot-limerick-kria-cl assic-desktop-2204-x07-20230302-63.img.xz?_ga=2.99097110.969660356.1682915914-68 7109518.1680662501 ● balenaEtcher等を使ってイメージファイルをSDカードに書き込む ○ https://www.balena.io/etcher ● SDカードとUART用のマイクロUSBケーブルを接続し、ボードにACアダプタをつなぐ Copyright© Fixstars Group 42
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 3. Ubuntu 22.04をブートして初期設定 https://japan.xilinx.com/products/som/kria/kv260-vision-starter-kit/kv260-getting-started/getting-started.htmlに従う。 ● ● パッケージの更新 ○ sudo apt update ○ sudo apt -y upgrade ○ sudo snap install xlnx-config --classic --channel=2.x ○ sudo xlnx-config.sysinit Xilinxのリポジトリ追加とXRTインストール ○ sudo add-apt-repository ppa:xilinx-apps ○ sudo add-apt-repository ppa:ubuntu-xilinx/sdk ○ sudo apt update ○ sudo apt -y upgrade ○ sudo apt install xrt-dkms Copyright© Fixstars Group 43
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 3. ● ● Ubuntu 22.04をブートして初期設定 Dockerインストール ○ sudo apt install ca-certificates curl gnupg ○ sudo install -m 0755 -d /etc/apt/keyrings ○ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg ○ sudo chmod a+r /etc/apt/keyrings/docker.gpg ○ echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ○ sudo apt update ○ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ○ sudo groupadd docker ○ sudo usermod -a -G docker $USER NLP SmartVisionのインストール ○ sudo apt install xlnx-firmware-kv260-nlp-smartvision ○ ログインし直す(dockerグループへの追加を反映させるため) ○ docker pull xilinx/nlp-smartvision:2022.1 Copyright© Fixstars Group 44
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 4. ● KV260のカーネルソースコードを取得 カーネルバージョン確認 ○ ● カーネルバージョンに対応するリポジトリのタグ名を確認 ○ ● uname -r 5.15.0.1020-xilinx-zynqmp https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-xilinx-zynqmp/+git/jammy ソースコード取得 ○ ○ ○ ○ ○ ○ ○ ○ echo "deb-src http://archive.ubuntu.com/ubuntu jammy main" | sudo tee -a /etc/apt/sources.list.d/jammy.list sudo apt-get update sudo apt-get build-dep linux sudo apt-get install git fakeroot libncurses-dev gcc-aarch64-linux-gnu linux-tools-common cd /usr/src sudo git clone -b Ubuntu-xilinx-zynqmp-5.15.0-1020.22 --depth 1 https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-xilinx-zynqmp/+git/jammy sudo chown -R ubuntu:ubuntu jammy sudo chown ubuntu:ubuntu /usr/src カーネルバージョンは 実際の出力に合わせてください Copyright© Fixstars Group 45
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 5. ● imx708のソースコードを追加 ソースコード変更 ○ /usr/src/jammy/drivers/media/i2c/Makefileへ以下を追加 ■ ○ obj-$(CONFIG_VIDEO_IMX708) += imx708.o /usr/src/jammy/drivers/media/i2c/Kconfigへ以下を追加 ■ config VIDEO_IMX708 tristate "Sony IMX708 sensor support" depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API depends on MEDIA_CAMERA_SUPPORT help This is a Video4Linux2 sensor driver for the Sony IMX708 camera. To compile this driver as a module, choose M here: the module will be called imx708. ○ /usr/src/jammy/drivers/media/i2c/imx708.cを追加 ■ https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/media/i2c/imx708.cから取得 ■ 変更が必要なので次ページで説明 Copyright© Fixstars Group 46
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 5. ● imx708のソースコードを追加 ソースコード変更 ○ /usr/src/jammy/drivers/media/i2c/imx708.cを変更 ■ notify_gains とnotify_gainsを使用している箇所を全て削除 struct v4l2_ctrl *notify_gains; ■ imx708_update_metadata_pad_formatの定義を変更 ● ■ imx708_update_metadata_pad_formatの呼び出しに引数を追加 ● ■ ■ static void imx708_update_metadata_pad_format(struct imx708 *imx708, struct v4l2_subdev_format *fmt) imx708_update_metadata_pad_format(imx708, fmt); MEDIA_BUS_FMT_SENSOR_DATAをimx708_get_format_code(imx708)へ置換する (HDRを有効にする場合のみ)IMX708_DEFAULT_LINK_FREQを777600000へ変更 ● なぜか動的変更はうまく動作しないため初期値を変更する Copyright© Fixstars Group 47
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 6. カーネル一式をビルド 十分な空き容量が必要。16GBのSDカードでは不足。今回は64GBのSDカードを使用。 ● cd jammy ● export ARCH=arm64 ● export $(dpkg-architecture -aarm64) ● export CROSS_COMPILE=aarch64-linux-gnu● fakeroot debian/rules clean ● fakeroot debian/rules editconfigs ○ 画像を参照して Sony IMX708 sensor support でMキーを押して<M>表示へ変更 ○ Saveしてeditconfigsを抜ける ● fakeroot debian/rules clean ● fakeroot debian/rules binary ○ ○ 半日以上かかる 2回目以降はexportの後に以下で短時間でビルド可 ■ cd /usr/src/jammy/drivers/media/i2c sudo make -C /usr/src/jammy/debian/build/build-xilinx-zynqmp M=`pwd` Copyright© Fixstars Group 48
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす
7.
デバイスツリーの変更
https://github.com/Xilinx/kria-apps-firmware/blob/xlnx_rel_v2022.1/boards/kv260/nlp-smartvision/kv260-nlp-smartvision.dtsi
●
i2c@2 {
#address-cells = <1>;
#size-cells = <0>;
reg = <2>;
imx219: sensor@101a {
compatible = "sony,imx219";
reg = <0x101a>;
clocks = <&misc_clk_7>;
VANAvana1-supply = <&imx219_vana>; /* 2.8v */
vana2-supply = <&imx708_vana2>; /* 1.8v */
VDIGvdig-supply = <&imx219_vdig>; /* 1.81v */
VDDLvddl-supply = <&imx219_vddl>; /* 1.28v */
//reset-gpios = <&axi_gpio 2 0 0>;
port {
imx219_0: endpoint {
remote-endpoint = <&imx_csiss_in>;
data-lanes = <1 2>;
link-frequencies = /bits/ 64 <456000000450000000>;
};
HDRを有効にする場合は
777600000
};
};
};
Copyright© Fixstars Group
49
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす
7.
デバイスツリーの変更
https://github.com/Xilinx/kria-apps-firmware/blob/xlnx_rel_v2022.1/boards/kv260/nlp-smartvision/kv260-nlp-smartvision.dtsi
●
●
●
imx219_vana1: fixedregulator@3 {
compatible = "regulator-fixed";
regulator-name = "imx708_vana1";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
enable-active-high;
};
imx219_vdig: fixedregulator@45 {
compatible = "regulator-fixed";
regulator-name = "imx708_vdig";
regulator-min-microvolt = <18100000>;
regulator-max-microvolt = <18100000>;
};
imx219_vddl: fixedregulator@56 {
imx708_vana2: fixedregulator@4 {
compatible = "regulator-fixed";
compatible = "regulator-fixed";
regulator-name = "imx708_vddl";
regulator-name = "imx708_vana2";
regulator-min-microvolt = <12800000>;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <12800000>;
regulator-max-microvolt = <1800000>;
};
enable-active-high;
};
シンボルを処理するオプション(重要)
全ての219を708へ置換
デバイスツリーをコンパイル
○
sudo dtc -@ -I dts -O dtb -o kv260-nlp-smartvision.dtbo kv260-nlp-smartvision.dtsi
○
AR1335関連のport番号が間違っているというエラーが出るが特に問題はない(AR1335が動作することを確認済)
Copyright© Fixstars Group
50
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 8. カーネルモジュールとデバイスツリーをコピー ● sudo cp\ /usr/src/jammy/debian/linux-modules-$(uname -r)/lib/modules/$(uname -r)/kernel/drivers/media/i2c/imx708.ko\ /lib/modules/$(uname -r)/ ● sudo depmod ○ modprobeでimx708.koを見つけられるように、依存関係リストを更新する ● sudo cp kv260-nlp-smartvision.dtbo /usr/lib/firmware/xilinx/kv260-nlp-smartvision 必要な場合は上書き前にバックアップ を取ってください Copyright© Fixstars Group 51
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 9. ● ● ● ● NLP SmartVisionのoverlay実行 USB接続のマイクを接続する。マイク付きのUSBカメラでも可。 sudo xmutil unloadapp sudo xmutil loadapp kv260-nlp-smartvision docker run \ --env="DISPLAY" \ -h "xlnx-docker" \ 何度か使用する場合は任意の名前をつけておきます --name=<コンテナ名> \ 次回からは --env="XDG_SESSION_TYPE" \ docker start -ai <コンテナ名> --net=host \ でコンテナ実行 --privileged \ -v /tmp:/tmp \ -v /dev:/dev \ -v /sys:/sys \ -v /etc/vart.conf:/etc/vart.conf \ -v /lib/firmware/xilinx:/lib/firmware/xilinx \ -v /run:/run \ -it xilinx/nlp-smartvision:2022.1 bash Copyright© Fixstars Group 52
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 10. 初期化スクリプト変更 https://github.com/Xilinx/nlp-smartvision/blob/xlnx_rel_v2022.1/script/init-imx-smartvision.sh ● apt update && apt install nano nano /opt/xilinx/kv260-nlp-smartvision/bin/init-imx-smartvision.sh ○ media-ctl -V '"imx708_wide":0 [fmt:SRGGB10_1X10/1536x864]' -d $1 media-ctl media-ctl media-ctl media-ctl media-ctl media-ctl ○ '"80002000.csiss":0 [fmt:SRGGB10_1X10/1536x864 field:none colorspace:srgb]' -d $1 '"80002000.csiss":1 [fmt:SRGGB10_1X10/1536x864 field:none colorspace:srgb]' -d $1 '"b0000000.isp_accel":0 [fmt:SRGGB10_1X10/1536x864 field:none colorspace:srgb]' -d $1 '"b0000000.isp_accel":1 [fmt:RBG888_1X24/1536x864 field:none colorspace:srgb]' -d $1 '"b0040000.scaler":0 [fmt:RBG888_1X24/1536x864 field:none colorspace:srgb]' -d $1 '"b0040000.scaler":1 [fmt:RBG888_1X24/1024x768 field:none colorspace:srgb]' -d $1 先頭行はレンズとIRの有無によって書き換える内容が変わります ■ ■ ■ ■ ○ -V -V -V -V -V -V Normalレンズ, IRカットフィルタありの場合:imx708 Normalレンズ, NoIRの場合:imx708_noir Wideレンズ, IRカットフィルタありの場合:imx708_wide Wideレンズ, NoIRの場合 :imx708_wide_noir デバイス名はmedia-ctl -p -d /dev/media0で確認できます。 ※AR1335やUSBカメラが接続されている場合は、media1やmedia2になっている可能性あり Copyright© Fixstars Group 53
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす 11. ● ● NLP SmartVisionのアプリケーション実行 USBマイクを接続する(適当なウェブカメラでよい) GUIを実行している場合は以下のコマンドでGUIを終了する ※コンテナの外で ○ ● sudo systemctl isolate multi-user.target または sudo xmutil desktop_disable nlp-smartvision --mipi ○ ○ アプリケーションの中で先程変更したスクリプトが実行されます 顔検出と音声認識が動作するはずです ■ 認識可能な音声キーワード https://xilinx.github.io/kria-apps-docs/kv260/2022.1/build/ html/docs/nlp-smartvision/docs/app_deployment_nlp.html より ● 終了後にGUI環境を再開する場合は以下を実行 ○ ● sudo systemctl isolate graphical.target または sudo xmutil desktop_enable 時間があれば実演 Copyright© Fixstars Group 54
c. Ubuntu 22.04 + NLP SmartVisionアプリケーションで動かす
12.
●
●
●
他のソフトウェアやライブラリからIMX708を使用する
nlp-smartvision実行後も/dev/video0の1024x768p60 RGB出力のカメラとして認識されます。
obs, cheese, qv4l2などを使ってカメラ映像を表示可能です。
NLP SmartVisionと同様にOpenCVから使用することもできますが、
cv::VideoCaptureのバックエンドはGstreamerを使用する必要があります。
○
●
OpenCVで表示した場合のフレームレートは46fps程度でした。IPのスケーラー設定を変更して解像度
を上げるとさらにフレームレートが低下することから、PL-PS間の転送帯域不足と思われます。
○
○
●
cv::VideoCapture("v4l2src device=/dev/video0 io-mode=dmabuf ! video/x-raw, width=1024, height=768 !
appsink sync=false", cv::CAP_GSTREAMER);
media-ctl -V '"b0040000.scaler":1 [fmt:RBG888_1X24/<解像度> field:none colorspace:srgb]' -d /dev/media0
■
1024x768:46fps程度
■
1280x720:38fps程度
■
1536x864:26fps程度
cv::VideoCaptureの引数の解像度も合わせて変更が必要
センサを2304x1296で動作させるとFailed to allocate required memory.というエラーが出ます。
このoverlayのPLは1920x1080より大きな解像度を受けられないのかもしれません。
○
media-ctl -V '"imx708_wide":0 [fmt:SRGGB10_1X10/2304x1296]' -d $1
■
スケーラーの入力まで、同様の解像度設定の変更が必要
Copyright© Fixstars Group
55
まとめ ● KV260でRaspberry Pi Camera Module 3(IMX708)を動かすことができた a. ベアメタル 1920x1080p60 (センサ入力:2304x1296p56) HDRあり/HDRなし b. Ubuntu 20.04 + PYNQ 1.0 1920x1080p56 (センサ入力:2304x1296p56) HDRあり/HDRなし c. Ubuntu 22.04 + NLP SmartVision 1024x768p24 (センサ入力:1536x864p30) HDRあり 1024x768p46 (センサ入力:1536x864p120) HDRなし ● 今後やりたいこと ○ ○ Ubuntu 22.04 + NLP SmartVisionでの2304x1296動作、フレームレート改善 Auto Focusを使う ぜひ皆様もKria KV260を使って Raspberry Pi Camera Module 3で遊んでみてください! Copyright© Fixstars Group 56
おまけ1 ● ■ yavtaを使用したセンサレジスタ操作 ○ インストール ■ ○ 情報表示 ■ ○ yavta -w '0x009e0903 960' /dev/v4l-subdev0 HDRを有効化 (カメラ未使用時に実行) ■ ■ ■ ○ yavta -l /dev/v4l-subdev0 アナログゲインを960に設定 ■ ○ sudo apt install yavta yavta -w '0x009e0903 960' /dev/v4l-subdev0 フレームレートが下がるだけで映像に変化はない 有効化後に無効化するとカメラが動作しなくなる 180°回転 (カメラ未使用時に実行) ■ ■ ■ yavta -w '0x00980914 1' /dev/v4l-subdev0 yavta -w '0x00980915 1' /dev/v4l-subdev0 SRGGB10をSBGGR10へ置換してmedia-ctlの初期化スク リプトを実行 demosaicを行うisp_accelがベイヤーパターン変更のレジ スタ設定を無視するため赤/青が入れ替わった表示になる yavta実行時に毎回出るioctlのエラーは原因不明 Copyright© Fixstars Group yavta -l /dev/v4l-subdev0の出力 $ yavta -l /dev/v4l-subdev0 Device /dev/v4l-subdev0 opened. --- User Controls (class 0x00980001) --control 0x00980911 `Exposure' min 1 max 874 step 1 default 874 current 874 control 0x00980914 `Horizontal Flip' min 0 max 1 step 1 default 0 current 0 control 0x00980915 `Vertical Flip' min 0 max 1 step 1 default 0 current 0 --- Camera Controls (class 0x009a0001) --control 0x009a0915 `Wide Dynamic Range' min 0 max 1 step 1 default 0 current 0 control 0x009a0922 `Camera Orientation' min 0 max 2 step 1 default 2 current 2 0: Front 1: Back 2: External (*) control 0x009a0923 `Camera Sensor Rotation' min 180 max 180 step 1 default 180 current 180 --- Image Source Controls (class 0x009e0001) --control 0x009e0901 `Vertical Blanking' min 40 max 8387616 step 1 default 2755 current 58 control 0x009e0902 `Horizontal Blanking' min 3680 max 3680 step 1 default 3680 current 3680 control 0x009e0903 `Analogue Gain' min 112 max 960 step 1 default 112 current 960 control 0x009e0904 `Red Pixel Value' min 0 max 4095 step 1 default 4095 current 4095 control 0x009e0905 `Green (Red) Pixel Value' min 0 max 4095 step 1 default 4095 current 4095 control 0x009e0906 `Blue Pixel Value' min 0 max 4095 step 1 default 4095 current 4095 control 0x009e0907 `Green (Blue) Pixel Value' min 0 max 4095 step 1 default 4095 current 4095 --- Image Processing Controls (class 0x009f0001) --control 0x009f0902 `Pixel Rate' min 566400000 max 566400000 step 1 default 566400000 current 566400000 control 0x009f0903 `Test Pattern' min 0 max 4 step 1 default 0 current 0 0: Disabled (*) 1: Color Bars 2: Solid Color 3: Grey Color Bars 4: PN9 control 0x009f0905 `Digital Gain' min 256 max 65535 step 1 default 256 current 256 16 controls found. Unable to get format: Inappropriate ioctl for device (25). 57
おまけ2 ● i2cset/i2cgetを使用したセンサレジスタ操作 /dev/i2c-6 slave address register address ○ CHIP ID読み出し:レジスタ0x0016を2byte読み出す ■ ○ register value sudo i2cset -f -y 6 0x1a 0x00 0x16 i sudo i2cget -f -y 6 0x1a sudo i2cget -f -y 6 0x1a 出力:0x07 出力:0x08 映像を180°回転させる ※カメラ未使用時のみ有効 ■ sudo i2cset -f -y 6 0x1a 0x01 0x01 0x03 i 水平反転と垂直反転を有効 注)回転によってベイヤー配列が変わるため、色がおかしくなります ■ nlp-smartvision実行中に映像を180°回転する sudo i2cset -f -y 6 0x1a 0x01 0x00 0x00 i 映像出力を停止 sudo i2cset -f -y 6 0x1a 0x01 0x01 0x03 i 水平反転と垂直反転を有効 sudo i2cset -f -y 6 0x1a 0x01 0x00 0x01 i 映像出力を開始 注)こちらも回転によってベイヤー配列が変わるため、色がおかしくなります Copyright© Fixstars Group 58
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group 59