PetalinuxでWavファイルを再生する(2)
サウンドカードドライバをビルドする
公開日:2023年7月31日
前回記事 でVivadoからビットストリームを作成し、 .xsaファイルを作成しました。今回はこれを元にPetalinuxのイメージ作成を始めます。
自作のサウンドカードデバイスとして登録するために、標準のデバイスドライバ群のソースコードを一度展開したうえで、コードを追加、その後 petalinux-config/petalinux-build を実行してOS作成、という手順で進めます。
Petalinuxビルドプロジェクトを用意
まずは、Zynqのテンプレートを使って petalinux-create を行い、SDカード上のEXT4パーティションに root filesystem を作るように設定します。
$ petalinux-create --type project --template zynq --name petalinux3
$ cd petalinux3
$ petalinux-config --get-hw-description=../design_1_wrapper.xsa
module名 | メニューの位置 | 設定 |
---|---|---|
Root filesystem type | Image Packaging Configuration | EXT4 (SD/eMMC/SATA/USB) |
カーネルをビルドし直す
つぎに、自作のドライバをカーネルへ静的に組み込むため、一度カーネルのソースコードを展開し、ビルドし直してみます。
Petalinuxのツールを使って、ソースコードを展開します。
$ petalinux-devtool modify linux-xlnx
[INFO] Sourcing buildtools
[INFO] Sourcing build environment
[INFO] Generating workspace directory
[INFO] devtool modify linux-xlnx
NOTE: Starting bitbake server...
...
時間がかかりますが、展開が完了するとフォルダ直下に
./components/yocto/workspace/sources/linux-xlnx
というフォルダが生成され、中に様々なソースコードが用意されている事が確認できます。
ドライバを追加する
つぎにサウンドカードのドライバソースを追加します。
ドライバのコードの書き方は、Linuxドライバと同様のため、詳細については別途まとめることとし、ここでは簡易版として用意したコードを使って、「ドライバを用意しカーネルに組み込む」という流れを追いかけることにします。
以下のzipファイルを展開すると、 zybo/ というフォルダと中身が生成されます。
./components/yocto/workspace/sources/linux-xlnx/sound/soc/xilinx/xlnx_pl_snd_card.c
を元に、 zedboard向けdriver を参考にして、必要最低限動作するまでを記載しています。
CODECの周波数変換部分が未完のため、実行時に明示的に周波数変換が必要です。(今後の課題)
ドライバが用意できたら配置します。Zyboの専用サウンドカードドライバとして、場所は以下としました。
$ mkdir -p ./components/yocto/workspace/sources/linux-xlnx/sound/soc/zybo
$ cp -r <driver-source-dir> ./components/yocto/workspace/sources/linux-xlnx/sound/soc/zybo
さらに Makefile と カーネルのコンフィグレーション画面に追加するための Kconfig を編集します。
./components/yocto/workspace/sources/linux-xlnx/sound/soc/Makefile
に以下を追加
obj-$(CONFIG_SND_SOC) += zybo/
./components/yocto/workspace/sources/linux-xlnx/sound/soc/Kconfig
に以下を追加
source "sound/soc/zybo/Kconfig"
この状態で petalinux-config -c kernel を実行します。
次の順で各moduleを全て有効( <*> ) に変更します。
module名 | メニューの位置 |
---|---|
Audio support for the Xilinx I2S | Device Drivers → Sound card support → Advanced Linux Sound Architecture → ALSA for SoC audio support |
Audio support for the Xilinx audio formatter | Device Drivers → Sound card support → Advanced Linux Sound Architecture → ALSA for SoC audio support |
Audio support for the Zybo SSM2603 sound card with Xilinx
IP (上の2moduleを有効にすると現れる) |
Device Drivers → Sound card support → Advanced Linux Sound Architecture |
Xilinx I2C controller | Device Drivers → I2C Support → I2C Hardware Bus Support |
Analog Devices SSM2602 CODEC -I2C | Device Drivers → Sound card support → Advanced Linux Sound Architecture → ALSA for SoC audio support → CODEC drivers |
kernel configurationを終了し、続いて rootfs のmodule追加を行います。
module名 | メニュー位置 |
---|---|
alsa-utils | Filesystem Packages → console → utils → alsa-utils |
alsa-utils-aplay | Filesystem Packages → console → utils → alsa-utils |
alsa-utils-speakertest | Filesystem Packages → console → utils → alsa-utils |
alsa-plugins | Filesystem Packages → multimedia → alsa-plugins |
設定が終わればこちらも configuration終了させます。
デバイスツリー の編集
最後に デバイスツリー project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi を下記のように修正します。
/include/ "system-conf.dtsi"
/ {
};
&axi_iic_0{
status = "okay";
ssm2603: ssm2603@1a {
#sound-dai-cells = <0>; // only single DAI
compatible = "adi,ssm2603";
clock-name ="mclk";
clocks =<&misc_clk_0>;
reg = <0x1a>;
};
};
&i2s_receiver_0{
audio-codec = <&ssm2603>;
};
&i2s_transmitter_0{
audio-codec = <&ssm2603>;
};
これでpetalinux-buildのためのconfigが完了です。
※文中に記載されている各種名称、会社名、商品名などは各社の商標もしくは登録商標です。