コンテンツにスキップ

カメラ・ディスプレイ・オーディオ

1. MIPI-CSIカメラ

1.1 MIPIカメラの概要

1.1.1 MIPI CSI-2インターフェースの概要

MIPI (Mobile Industry Processor Interface)は、ARM、Nokia、ST、TIなどの企業が2003年に設立したアライアンスによって策定されたインターフェースです。その目的は、スマートフォンなどのモバイルデバイス内部のインターフェース(カメラ、ディスプレイインターフェース、RF/ベースバンドインターフェースなど)を標準化することで、デバイス設計の複雑さを軽減し、設計の柔軟性を高めることにあります。ワーキンググループ(Work Group)MIPIアライアンスの下には多くのワーキンググループが存在し、それぞれが対応するデバイスの標準定義を担当しています。Cameraワーキンググループ、Displayワーキンググループ、高速マルチポイントリンクワーキンググループなど、十数個のグループが含まれます。

MIPI CSI-2インターフェースは、MIPIアライアンスのCameraワーキンググループによって策定されたCSI(Camera Serial Interface) の第2版標準です。

  • ハードウェア層: 最大4つの仮想チャネル(Lane)でのデータ転送をサポートしており、ハードウェア上では1つのLaneが1対の差動信号線として実装されます(回路図参照)。各Laneの最大通信速度は2.0Gbpsです。

  • ソフトウェア層: MIPI CSI-2プロトコルスタックは主にアプリケーション層、プロトコル層、物理層で構成されます。さらにプロトコル層は、ピクセル/バイトのパケット化・展開層、下位プロトコル層、レーン管理層に細分化されます。

1.1.2 ハードウェアインターフェースリソースの紹介

EASY EAI Nano-TB開発ボードには、2系統のMIPI CSI-2インターフェースが搭載されています。各系統から4つのLaneが引き出されています。位置の定義は以下の通りです。

ハードウェアインターフェースリソースの紹介

ハードウェアインターフェースリソースの紹介

EASY EAI Nano-TBは、デフォルトでIMX415単眼カメラと組み合わせて使用されます。また、0.5mmピッチの40ピンFPCリバースケーブル(反向線)が1本付属しています。

ハードウェアインターフェースリソースの紹介

ハードウェアインターフェースリソースの紹介

  • リバースケーブル(反向線): 両端の青いプラスチック補強板(識別マーク)が同じ面にありません。

  • ストレートケーブル(同向線): 両端の青いプラスチック補強板が同じ面にあります。

ハードウェアインターフェースリソースの紹介

ハードウェアインターフェースリソースの紹介

1.1.3 配線手順

  • 配線作業は必ず電源を切った状態で行ってください。

  • IMX415カメラとCamera1インターフェースの接続にはリバースケーブルを使用します。

💡 注意: ケーブルの種類を間違えると、カメラやコアボードが焼損する恐れがあります。配線時は十分ご注意ください。)

  • コネクタのロック部分とFPCケーブルの青いプラスチック識別マークは、必ず同じ側になるようにしてください。詳細は下図をご参照ください。

配線手順

配線手順

1.1.4 デバイスステータスの確認

dmesg コマンドを使用して、MIPI-CSI2インターフェースモジュールが正常に動作しているか確認できます。

Terminal window
dmesg \| grep "csi2-.phy"

カメラが正常にマウントされている状態は以下のようになります。ログから以下のことが確認できます:

  • dphy0 インターフェースにセンサーモデル imx415 のカメラが接続されており、MIPI-CSI2アドレスは 1-0036 です。

  • dphy3 インターフェースにセンサーモデル imx415 のカメラが接続されており、MIPI-CSI2アドレスは 4-0036 です。

デバイスステータスの確認

デバイスステータスの確認

目的のカメラノードが表示されない場合は、FPCケーブルが正しく接続されているか確認する必要があります。「1.3配線手順」の通りにケーブルが接続されているかチェックしてください。

1.1.5 使用可能なデバイスノードの検索

Rockchipプラットフォームでは、1つのMIPI-CSIインターフェースに対して20以上のvideoノードが割り当てられます(デバイスツリーで定義されている数だけ生成されます)。下図をご参照ください。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

💡 注意: CSI0が必ずしも video0~24に対応するわけではありません。デバイスツリーの実際の状況に応じて生成されます。

また、MIPI-CSIカメラに対応するノードは、カーネルのデバイスツリーを変更した際に固定されます(つまり、カーネルでMIPI-CSIカメラの数を設定すると、実際にMIPI-CSIカメラが接続されているかどうかに関わらず、videoノードの生成数はカメラの接続状況によって【動的に】変わることはありません)。

そのため、ユーザーはこれらのノードがどのようなデバイス情報に対応しているかを特定する必要があります。Linuxのv4l2フレームワークでは、これらのノードの記述情報はすべて/sys/class/video4linux/ ディレクトリにまとめられます。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

任意のディレクトリ(例:video22)に入ります。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

cat コマンドを使用して、この nameファイルの内容を確認できます。Rockchipチップの定義では、この名前がmainpath または selfpath であれば、その video22 は使用可能なノードです。 ターミナルの任意のディレクトリで以下のコマンドを実行すると、すべてのノードのname 記述を素早くスキャンできます。

Terminal window
grep "mainpath" /sys/class/video4linux/video\*/name

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

このスキャン結果から、/dev/video22 と /dev/video23がMIPI-CSI0の使用可能なノードであることがわかります。

1.2. クイックスタート

1.2.1 開発環境の準備

PC側のUbuntuシステムで run スクリプトを実行し、EASY-EAIコンパイル環境に入ります。詳細は以下の通りです。

Terminal window
cd ~/develop_environment
./run.sh 2204

1.2.2 ソースコードのダウンロードとサンプルのコンパイル

まず、仮想マシンのバックグラウンドターミナルで以下のコマンドを実行し、周辺機器サンプルソースコードの管理ディレクトリを作成します:

Terminal window
cd /opt
mkdir -p EASY-EAI-Nano-TB/demo

例えば、サンプルプログラムを「PC\D:」(指定はありません。ユーザーの任意の場所で構いません)にダウンロードします。

その後、ダウンロードしたサンプルを仮想マシンのファイルシステムにコピーします。

ソースコードのダウンロードとサンプルのコンパイル

ソースコードのダウンロードとサンプルのコンパイル

最後に、該当するサンプルのディレクトリに移動してコンパイル操作を実行します。具体的なコマンドは以下の通りです:

Terminal window
cd EASY-EAI-Nano-TB/demo/02_camera
./build.sh

💡 注意 :依存ライブラリはボード上に配置されているため、クロスコンパイル中は/mnt のマウントを維持する必要があります。

ソースコードのダウンロードとサンプルのコンパイル

ソースコードのダウンロードとサンプルのコンパイル

1.2.3 サンプルの実行

シリアルポートデバッグまたはSSH経由でボードのバックグラウンドにアクセスし、サンプルが配置されているディレクトリに移動します:

Terminal window
cd /userdata

サンプルの実行

サンプルの実行

サンプルを実行するコマンドは以下の通りです:

Terminal window
./test-mipiCam 22

1.2.4 実行結果

実行結果は図の通りです。

実行結果

実行結果

サンプルの実行が完了すると、/tmp ディレクトリに photoという生データ(Raw Video)の画像ファイルが生成されます。仮想マシンに戻り、新しいターミナルウィンドウを開いて、scpコマンドでその画像をローカルにコピーします。

実行結果

実行結果

その後、mplayer コマンドを使用して、コピーした photoファイルを表示させます。

Terminal window
mplayer -demuxer rawvideo -rawvideo w=1920:h=1080:format=bgr24 photo -loop 0

実行結果

実行結果

サンプルのデフォルト解像度は1920x1080であるため、w と h のパラメータにはそれぞれ1920と1080を指定します。画像が正常に表示されない場合は、お手元のカメラと解像度が一致していない可能性があるため、mipicamera_init()の解像度を調整(例:1280x720)する必要があります。

1.3 MIPIカメラのテストケース

サンプルコードのパスは 02_camera/test-mipiCam/main.c です。MIPI Camera APIのテストケースコードのロジックフローは図の通りです。

MIPIカメラのテストケース

MIPIカメラのテストケース

1.3.1 ソースコードの説明

int main(int argc, char **argv) {
int ret = 0;
if(1 == argc){
printf("\nerr: Missing parameter!\n");
printf("================= [usage] ==================\n");
printf("example:\n");
printf("\t%s <22/30>\n", argv[0]);
printf("--------------------------------------------\n");
return 0;
}
char *pbuf = NULL;
int skip = 0;
FILE *fp = NULL;
int cameraIndex = atoi(argv[1]); // 通常はvideo22
ret = mipicamera_init(cameraIndex, CAMERA_WIDTH, CAMERA_HEIGHT, 0);
if (ret) {
printf("error: %s, %d\n", __func__, __LINE__);
goto exit3;
}
pbuf = (char *)malloc(IMAGE_SIZE);
if (!pbuf) {
printf("error: %s, %d\n", __func__, __LINE__);
ret = -1;
goto exit2;
}
// 最初の10フレームをスキップ(露出やホワイトバランスを安定させるため)
skip = 10;
while(skip--) {
ret = mipicamera_getframe(cameraIndex, pbuf);
if (ret) {
printf("error: %s, %d\n", __func__, __LINE__);
goto exit1;
}
}
/* tips: Ubuntu環境ではmplayerを使って録画した画像を表示できます
* mplayer -demuxer rawvideo -rawvideo w=1920:h=1080:format=bgr24 photo -loop 0
*/
fp = fopen("/tmp/photo", "w");
if (!fp) {
printf("error: %s, %d\n", __func__, __LINE__);
ret = -1;
goto exit2;
}
fwrite(pbuf, 1, IMAGE_SIZE, fp);
fclose(fp);
exit1:
free(pbuf);
pbuf = NULL;
exit2:
mipicamera_exit(cameraIndex);
exit3:
return ret;
}

コード内の mipicamera_init()、mipicamera_getframe()、mipicamera_exit() は、v4l2インターフェースの呼び出しを簡略化したラッパー関数です。具体的な実装は 02_camera/commonApi/mipi_camera.c に記述されています。

2 USBカメラ

2.1 USBの概要

USB (Universal Serial Bus:ユニバーサル・シリアル・バス)は、電子機器間の通信によく用いられる汎用標準インターフェースです。USBバスは高速シリアルバスとして、その非常に高い転送速度により、高速なデータ転送が求められるアプリケーション環境の要件を満たすことができます。電源供給が容易(バスパワー対応)、インストールと設定が簡単(プラグアンドプレイおよびホットスワップ対応)、ポート拡張が容易(ハブを介して最大127台の周辺機器を拡張可能)、多様な転送方式(4種類の転送モード)、および優れた互換性(製品アップグレード後の下位互換性)などの利点があります。

2.1.1 EASY EAI Nano-TB USBリソースの紹介

EASY EAI Nano-TBには1系統のUSB3.0 HOSTがあり、USBハブチップを経由して2つのUSB3.0 HOSTインターフェースに拡張されています。さらに、直接出力される1系統のUSB2.0 HOSTインターフェースも備えています。

EASY EAI Nano-TB USBリソースの紹介

EASY EAI Nano-TB USBリソースの紹介

2.1.2 USBカメラの接続手順

通常、接続するUSBカメラは1台のみとすることをお勧めします。

複数のUSBカメラを接続する必要がある場合は、ハブ(Hub)を使用してマルチポートUSBに拡張する方法を検討できます。理論上は127台のデバイスを拡張可能ですが、実際に複数のUSBカメラを接続する際には、USB帯域幅、USBハブの階層数(最大階層はRootHubを含めて7層)、およびデバイスIDの重複問題の解決などを考慮する必要があります。そのため、必須でない限りこのような接続は【お勧めしません】。

💡 注意 :USBはホットスワップをサポートしていますが、ベースボードに保護ケースが装着されていない状態で抜き差しを行うと、ベースボード上の部品に触れやすく、ボード付近の金属部品によってショートを引き起こす危険性があります。そのため、周辺機器の抜き差しは、電源を完全に切った状態で行うことをお勧めします。

2.1.3 USBデバイスの接続管理

USBカメラまたはUSBハブを物理的に接続した後、これらのUSBデバイスがシステムに正しく認識されているかを確認する必要があります。これには lsusb コマンドを使用します。

Terminal window
lsusb

USBデバイスの接続管理

USBデバイスの接続管理

また、ファイルシステムにおいて、USBデバイスの管理ディレクトリは/sys/bus/usb/devicesです。ここでは、root_hubからマウントされているUSBデバイスやハブデバイスのトポロジー関係を確認できます。

USBデバイスのオブジェクト命名規則は以下の通りです:

USBデバイスのオブジェクト命名規則

USBデバイスおよびインターフェースは、システム上で特定の規則に従って命名され、管理されます。詳細な命名規則は以下の通りです。

デバイスの命名規則

デバイスの種類命名規則説明
バスオブジェクトusb1, usb2プロセッサ内蔵のUSBハードウェア。0番のハブデバイスとして扱われるため、そのインターフェースオブジェクトは0からカウントされます。
直接接続されたUSBデバイスroot_hub-hub_port注: ハイフン「-」で区切られます。

root_hub:接続されているバス番号。
hub_port:そのバス上の何番目のデバイスかを示します。0番デバイスはバス自体であり、新しく接続されたデバイスは1から始まります。
外部ハブに接続されたデバイスroot_hub-hub_port.device注: ドット「.」で区切られます。

新しく接続されたデバイスはハブの子デバイスとして扱われ、番号は1から始まります。

インターフェースの命名規則

デバイスオブジェクトが持つインターフェースについても、構成とインターフェースを識別するための命名規則が定義されています。

オブジェクト命名規則説明
デバイスオブジェクトの
インターフェースオブジェクト
device_object:config.interface注: コロン「:」でデバイスオブジェクトとそれに続く要素を区切ります。続く要素には構成(config)とインターフェースがあり、この2つはドット「.」で区切られます。

device_object(デバイスオブジェクト):上記のバスオブジェクト、直接接続デバイス、ハブを経由したデバイスの総称。
config(構成記述子):USBデバイスのコンフィギュレーション記述子。1つのUSBデバイスが異なるシステムやアーキテクチャで動作できるのは、この構成記述子を使い分けているためです。
interface(インターフェース記述子):USBデバイスのインターフェース記述子。例えばUSBトランシーバーの場合、音声再生を担当するインターフェースと、録音を担当するインターフェースがそれぞれ存在します。

2.1.4 使用可能なデバイスノードの検索

Rockchipプラットフォームでは、1つのMIPI-CSIインターフェースに対して20以上のvideoノードが割り当てられます。また、MIPI-CSIカメラに対応するノードは、カーネルのデバイスツリーを変更した際に固定されます(つまり、カーネルでMIPI-CSIカメラの数が設定されると、カメラの接続有無に関わらず、videoノードの状態は動的に変化しません)。

一方、1つのUSBカメラは2つの videoノードに対応し、【一般的に】MIPI-CSIカメラのノードの後に配置されます。USBカメラの抜き差しを行い、videoノードの変化を比較・観察することで、どの2つがUSBカメラのデバイスノードであるかを判断できます。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

しかし、【最も正確】な方法は、これらの videoノードの【記述情報】を確認することです。Linuxのv4l2フレームワークでは、これらのノードの記述情報はすべて/sys/class/video4linux/ ディレクトリにまとめられます。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

任意の記述(例:video22)に入り、cat コマンドを使用して、この nameファイルの内容が何であるかを確認できます。

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

Terminal window
cat /sys/class/video4linux/video22/name

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

したがって、以下のコマンドを使用して、【すべての video ノード】に対してスキャンと【フィルタリング(絞り込み)】を行う必要があります。

Terminal window
grep -i "usb" /sys/class/video4linux/video\*/name

使用可能なデバイスノードの検索

使用可能なデバイスノードの検索

2.2 クイックスタート

2.2.1 開発環境の準備

PC側のUbuntuシステムで run スクリプトを実行し、EASY-EAIコンパイル環境に入ります。詳細は以下の通りです。

Terminal window
cd ~/develop_environment
./run.sh 2204

2.2.2 ソースコードのダウンロードとサンプルのコンパイル

まず、仮想マシンのバックグラウンドターミナルで以下のコマンドを実行し、周辺機器サンプルソースコードの管理ディレクトリを作成します:

Terminal window
cd /opt
mkdir -p EASY-EAI-Nano-TB/demo

次に、サンプルプログラムをダウンロードします:

その後、ダウンロードしたサンプルを仮想マシンのファイルシステムにコピーします。

ソースコードのダウンロードとサンプルのコンパイル

ソースコードのダウンロードとサンプルのコンパイル

最後に、該当するサンプルのディレクトリに移動してコンパイル操作を実行します。具体的なコマンドは以下の通りです:

Terminal window
cd EASY-EAI-Nano-TB/demo/02_camera
./build.sh

💡 注意 :依存ライブラリはボード上に配置されているため、クロスコンパイル中は /mntのマウントを維持する必要があります。

注意

2.2.3 サンプルの実行

シリアルポートデバッグまたはSSH経由でボードのバックグラウンドにアクセスし、サンプルが配置されているディレクトリに移動します:

Terminal window
cd /userdata

サンプルの実行

サンプルの実行

サンプルを実行するコマンドは以下の通りです(51は /dev/video51 を意味します):

Terminal window
./test-usbCam-single 51

2.2.4 実行結果

実行結果

実行結果

サンプルの実行が完了すると、/tmp ディレクトリに photoという画像ファイルが生成されます。仮想マシンに戻り、新しいターミナルウィンドウを開いて、scpコマンドでその画像をローカルにコピーします。

実行結果

実行結果

その後、mplayer コマンドを使用して、取得した photo ファイルを再生(表示)させます。

Terminal window
mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 photo -loop 0

サンプルのデフォルト解像度は1280x720であるため、w と hのパラメータにはそれぞれ1280と720を指定します。画像が正常に表示されない場合は、お手元のカメラと解像度が一致していない可能性があるため、usbcamera_init()の解像度を調整(例:640x480)する必要があります。

実行結果

実行結果

2.3. USBカメラAPIのテストケース

サンプルコードのパスは 02_camera/test-usbCam/single-cam.c です。

実行結果

実行結果

2.3.1 ソースコードの説明

int main(int argc, char **argv){
if(1 == argc){
printf("\nerr: Missing parameter!\n");
printf("================= [usage] ==================\n");
printf("example:\n");
printf("\t%s <51/52>\n", argv[0]);
printf("--------------------------------------------\n");
return 0;
}
int cameraIndex = atoi(argv[1]);
char *pbuf = NULL;
int ret = 0;
int skip = 0;
FILE *fp = NULL;
ret = usbcamera_init(cameraIndex, CAMERA_WIDTH, CAMERA_HEIGHT, 0);
if (ret) {
printf("error: %s, %d\n", __func__, __LINE__);
goto exit3;
}
pbuf = (char *)malloc(IMAGE_SIZE);
if (!pbuf) {
printf("error: %s, %d\n", __func__, __LINE__);
ret = -1;
goto exit2;
}
// 最初の10フレームをスキップ(露出などを安定させるため)
skip = 10;
while(skip--) {
ret = usbcamera_getframe(cameraIndex, pbuf);
if (ret) {
printf("error: %s, %d\n", __func__, __LINE__);
goto exit1;
}
}
/* tips: Ubuntu環境ではmplayerを使って録画した画像を表示できます
* mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 photo -loop 0
*/
fp = fopen("/tmp/photo", "w");
if (!fp) {
printf("error: %s, %d\n", __func__, __LINE__);
ret = -1;
goto exit2;
}
fwrite(pbuf, 1, IMAGE_SIZE, fp);
fclose(fp);
exit1:
free(pbuf);
pbuf = NULL;
exit2:
usbcamera_exit(cameraIndex);
exit3:
return ret;
}

コード内の usbcamera_init()、usbcamera_getframe()、usbcamera_exit()は、v4l2インターフェースの呼び出しを簡略化したラッパー関数です。具体的な実装は02_camera/commonApi/usb_camera/usb_camera.c に記述されています。

3.MIPI-DSI

3.1. MIPI-DSIの概要

MIPI (Mobile Industry Processor Interface)ARM、Nokia、ST、TIなどの企業が2003年に設立したアライアンスによって策定されたインターフェースです。その目的は、スマートフォンなどのモバイルデバイス内部のインターフェース(カメラ、ディスプレイインターフェース、RF/ベースバンドインターフェースなど)を標準化することで、モバイルデバイス設計の複雑さを軽減し、設計の柔軟性を高めることにあります。 ワーキンググループ(Work Group)MIPIアライアンスの下には多くのワーキンググループが存在し、それぞれが対応するデバイスの標準定義を担当しています。Cameraワーキンググループ、Displayワーキンググループ、高速マルチポイントリンクワーキンググループなど、十数個のグループが含まれます。 MIPI DSIインターフェースは、MIPIアライアンスのDisplayワーキンググループによって策定されたDSI(Display Serial Interface) のインターフェース標準です。

3.1.1 EASY EAI Nano-TB DSI

DSIインターフェースはホットスワップ(活線挿抜)を【サポートしていません】。また、電源電力に一定の要件があります。そのため、DSIインターフェースを使用するには、まず入力電源がDC12V-3Aであることを確認する必要があります。そうでない場合、電力不足によりDSI画面を駆動できなくなります。具体的な現象としては、U-Bootの段階で再起動を繰り返すようになります。

3.1.2 接続ケーブルの説明

  • リバースケーブル(反向線): 両端の青いプラスチック識別マークが同じ面にありません。

  • ストレートケーブル(同向線): 両端の青いプラスチック識別マークが同じ面にあります。

接続ケーブルの説明

接続ケーブルの説明

3.1.3 ハードウェアインターフェースの説明

  • MIPIインターフェースはホットスワップを【サポートしていません】。配線作業は【必ず】電源を切った状態で行ってください。

  • 画面とMIPI-DSI0インターフェースの接続にはストレートケーブル(同向線)を使用します。(注意:ケーブルの種類を間違えると、カメラやコアボードが焼損する恐れがあります。配線時は十分ご注意ください。)

  • コネクタのロック部分とFPCケーブルの青いプラスチック識別マークは、必ず同じ側になるようにしてください。詳細は下図をご参照ください。

ハードウェアインターフェースの説明

ハードウェアインターフェースの説明

3.2. ドライバサポートの説明

デフォルトのファームウェアでは、MIPI-DSIは8インチMIPIディスプレイをサポートしています。システムで他のサイズやモデルのディスプレイをサポートする必要がある場合は、カーネルイメージを変更して置き換える必要があります。これには以下の手順が含まれます。

3.2.1 最新ファームウェアへのアップグレード

3.2.2 UbuntuシステムSDKソースコードのダウンロード

ubuntu_sdkのソースコード(主にカーネルソースコード)のダウンロードについては、「組み込みローレベル開発/UbuntuシステムSDK/ソースコードの取得」をご参照ください。

3.2.3 カーネルデバイスツリーの変更

「組み込みローレベル開発/UbuntuシステムSDK/kernel」の説明に従い、ユーザーは必要に応じて【カーネルソースコード開発リポジトリ】を構築および管理します。

そして、下図の説明に従って、【カーネルソースコード開発リポジトリ】内のデバイスツリーファイルを変更します:

カーネルデバイスツリーの変更

カーネルデバイスツリーの変更

  • EASY-EAI-Nano-TBデバイスツリーのエントリポイント: arch/arm64/boot/dts/rockchip/rv1126b-nano.dts

コンパイル後、新しい boot.img が生成されます。

3.2.4 カーネルイメージの更新

前のステップで生成された boot.img をファームウェアの rockdevディレクトリにコピーして元の boot.img を置き換え、その後 boot.imgを開発ボードに書き込みます。

3.3.1 デフォルトの表示結果

配線に間違いがないことを確認した後、デバイスの電源を入れると、下図のような起動ロゴが表示されます。

デフォルトの表示結果

デフォルトの表示結果

3.3.2 起動ロゴの変更

起動ロゴを変更したい場合は、「アプリケーションノート/起動ロゴの変更方法」のドキュメントを参照して操作を行ってください。

3.3.3 デスクトップシステムのインストール

デバイスの電源を入れた後、画面は常にロゴが表示された状態になります。デスクトップシステムをインストールする必要がある場合は、「アプリケーションノート/デスクトップシステムのインストール」を参照して操作を行ってください。

3.3.4 UIアプリケーション開発

ユーザーがUIアプリケーションを開発する必要がある場合は、「EASY-EAI-Solution(開発例)/QT GUIサンプル」を参照して操作を行ってください。

4.音声出力

4.1. サウンドカードリソースの概要

EASY-EAI-Nano-TBには、RV1126Bメインコントローラから出力されるサウンドカードが1つのみ搭載されています。

シリアルポートデバッグまたはSSHデバッグを通じて、開発ボードのターミナルにアクセスできます。aplay コマンドを実行して、サウンドカードに関する詳細情報を確認します。詳細は以下の通りです。

Terminal window
aplay -l

サウンドカードリソースの概要

サウンドカードリソースの概要

4.1.1 ハードウェアインターフェース

ハードウェアインターフェースの位置は以下の通りです。

ハードウェアインターフェース

ハードウェアインターフェース

4.2. サウンドカードの制御

Linuxシステムでは、アプリケーション層からサウンドカードを呼び出す際に通常ALSA(aplay、arecord、amixer)フレームワークが使用されます。本ドキュメントでは、この開発ボードプラットフォームに関連する部分のみを説明します。ALSAの具体的な使用方法についてさらに詳しく知りたい場合は、開発者コミュニティの「ALSA使用の概要」をご参照ください。

4.2.1 音声の再生

音声の再生には aplay コマンドを使用します。

Terminal window
aplay -D plughw:0,0 test.wav \## 音声がCard0から出力されます

4.2.2 音量調整

Card0の出力音量【値】の【範囲】は 0 から 510 です。

Terminal window
amixer -c 0 cset name='DAC Digital Volume' 0,0 ## Card0の出力音量【値】を 0 に設定
amixer -c 0 cset name='DAC Digital Volume' 192,192 ## Card0の出力音量【値】を 192 に設定
amixer -c 0 cset name='DAC Digital Volume' 255,255 ## Card0の出力音量【値】を 255 に設定

💡 注意 :ここでの【値】はゲインと正の相関を持つ変数ですが、ゲインそのものでも、音量のパーセンテージでもありません。また、これを調整した場合の音量変化は**【リニア(線形)ではありません】**。

  • 0〜255: デジタルゲイン部分です。255に設定すると、歪みが発生しない最大音量となります。

  • 256〜510: アナログゲイン部分です。255を超えると、音声出力に歪み(ディストーション)が発生します。

4.3. サウンドカード使用上のノート

ハードウェアレベルで使用されているI2S/SAIコントローラ自体は、モノラルやミキシングなどの使用状況をサポートしていません。しかし、ユーザーはalsa-plugを介してデータ変換を行うことができます。具体的な操作方法としては、~/.asoundrcファイルを編集します。

4.3.1 チャンネル変換

I2S/SAIコントローラはモノラルをサポートしていないため、ユーザーがモノラルの音声ファイルを再生しようとすると「2倍速再生」の現象が発生します。 そのため、ユーザーは ~/.asoundrcファイルを編集してチャンネル変換を行う必要があります。ファイルに以下の内容を追記してください:

Terminal window
pcm.!default{
type asym
playback.pcm "playbackmono"
capture.pcm "hw:0,0"
}
pcm.playbackmono {
type route
slave.pcm "hw:0,0" # サウンドカードデバイスhw:0,0に出力
slave.channels 2
ttable { # チャンネルrouteの設定
0.0 0.5
0.1 0.5
1.0 0.5
1.1 0.5
}
}

その後、音声ファイルを再生する際に、コマンドを以下のように変更します:

Terminal window
aplay -D default test_mono.wav

または

Terminal window
aplay -D playbackmono test_mono.wav

5.オーディオ入力

5.1 サウンドカードリソースの紹介

EASY-EAI-Nano-TBには、RV1126Bメインコントローラから出力されるサウンドカードが1つだけ搭載されています。

シリアルポートデバッグまたはSSHデバッグを通じて、開発ボードのターミナルにアクセスできます。aplayコマンドを実行して、サウンドカードに関する詳細情報を確認します。以下のようになります。

Terminal window
arecord -l

サウンドカードリソースの紹介

サウンドカードリソースの紹介

5.1.1 ハードウェアインターフェース

ハードウェアインターフェースの位置は以下の通りです。

ハードウェアインターフェース

ハードウェアインターフェース

5.2 サウンドカードの制御

Linuxシステムでは、アプリケーション層でサウンドカードを呼び出す際に、通常ALSA(aplay、arecord、amixer)フレームワークを使用します。この記事では、本開発ボードプラットフォームに関連する部分のみを説明します。ALSAの使用方法についてさらに詳しく知りたい場合は、開発者コミュニティの「ALSA使用の概要(alsa使用简介)」を参照してさらに理解を深めることができます。

5.2.1 オーディオ録音

オーディオの録音にはarecordコマンドを使用します。

Terminal window
arecord -D plughw:0,0 -c 2 -r 44100 -f S16_LE 1234567.wav

【Ctrl+C】キーの組み合わせで録音を終了します。

💡 注意 :モノラル(-c 1)オーディオを録音する場合、-fは【S16_LE】および【S24_LE】の2種類のサンプリングビット深度のみをサポートします。

5.2.2 録音音量の調整

Card0の録音音量の【値】の【範囲】は0から31までです。

Terminal window
amixer -c 0 cset name='ACodec_LP PGA Gain Volume' 0 ##Card0の出力音量の【値】を0に設定
amixer -c 0 cset name='ACodec_LP PGA Gain Volume' 16 ##Card0の出力音量の【値】を16に設定
amixer -c 0 cset name='ACodec_LP PGA Gain Volume' 31 ##Card0の出力音量の【値】を31に設定

💡 注意 :ここでの【値】はゲインと正の相関を持つ変数ですが、ゲインそのものでも、音量のパーセンテージでもありません。また、これを調整した場合の音量の変化は【非線形(リニアではない)】です。

5.2.3 録音コマンドの詳細

cdフォーマットで録音する(【Ctrl+C】キーの組み合わせで録音を終了します):

Terminal window
arecord -D hw:0,0 -f cd 1234567.wav

cd録音フォーマットを指定することは、チャンネル(ステレオ/2チャンネル)、サンプリングレート(44100Hz)、およびサンプリングビット深度(S16_LE)を固定することに相当します。

録音時間を指定する:

Terminal window
arecord -D hw:0,0 -f cd -d 10 1234567.wav

-d 10:録音時間を10秒に指定し、その後自動的に録音を終了することを示します。 arecordのさらに多くの使用方法についての参考:

Terminal window
arecord -h |