x86 PCで再現する「ダミーレス・PCIe-I2S直出し」
カードの設計ラズパイ側でカーネルソースを編集してダミーレス化された実績を、x86のLinux(GentooPlayer等のALSA環境)で再現するため
1. ハードウェア:汎用FPGAボードをPCIeに直刺しするx86のCPUから見て
最も「ただのメモリの塊(レジスタ)」としてシンプルに振る舞えるFPGAボードをPCIeスロットに配置。
使用するハードウェア例: ALINX や Xilinx (AMD) などの汎用 Artix-7 PCIe開発ボード(x1レーン)。
FPGA側の役割(論理回路):Xilinxが標準提供している無料の 「XDMA IPコア」(PCIe経由でPCのメインメモリと直接DMA転送を行うコア)をFPGA内に配置。
これで、PC側からは「特定のメモリ番地にオーディオデータを流し込めば、あとはFPGAが勝手に処理してくれる」
ラズパイのSoC内部のDMAコントローラーと全く同じ挙動をPCIe上に作ることができる?
FPGAの余った汎用I/Oピンから、直接I2S(MCLK, BCLK, LRCK, DATA)を出力...
2. ソフトウェア:x86 Linuxカーネルの「ダミーレス・PCIeドライバ」ラズパイでカーネルソースを弄ったのと全く同じアプローチを、
x86側のLinuxカーネルで行います。ドライバの実装手法:Linuxカーネルソース内の、最も構造がシンプルなPCIeオーディオドライバ
例:旧式のSound Blaster系や、汎用PCIeインターフェースドライバ sound/pci/ 以下の各種コードをベースに改造。
ハードウェア構成を検出する「初期化ルーチン(Probe)」の中で、外部DACチップとのI2CやSPIの通信チェックを行うコードをすべて削除(またはダミーパス)。snd_pcm_hardware 構造体の定義を書き換え、最大サンプリングレートを 384000 や 768000、フォーマットを S32_LE に設定して開放。
動作の流れ:PCの再生ソフトが音声を再生すると、カーネルドライバがPCIeバスを通じて、FPGA(XDMA)が指定するバッファ位置へダイレクトに32bit/384kHzのPCMデータを流し込み。FPGAはダミーチップの存在を気にすることなく、ただメモリからデータを読み出してI/OピンからI2S波形を垂れ流します。
32bit/384kHz(BCLK 24.576MHz)をFPGAのI/Oから綺麗に取り出す物理対策ラズパイのGPIOから直接ワイヤーで取り出す場合も同様ですが、384kHz(BCLKが約25MHz)に達すると、基板のパターンの長さやジャンパ線の静電容量による「波形の崩れ(なまり)」が深刻化し、DAC側でジッターやロック外れの原因に。
FPGA(または既存カードのタップ)のI/OピンからDACへ送る際は、以下の物理対策が必須です。
FPGAの出力ピン直後にダンピング抵抗(22Ω〜47Ω)を配置:信号の立ち上がり・立ち下がりが急峻すぎると反射ノイズが起きるため
FPGAのピンの直近に直列で抵抗を挟み、波形を整える。












Comments