/ 雑記帳

出来たらいいなぁ〜

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のピンの直近に直列で抵抗を挟み、波形を整える。

— posted by くま at 12:48 pm   commentComment [0] 

この記事に対する TrackBack URL:


コメントをどうぞ。 名前(ペンネーム)は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~ (QQ)

     

[Top ↑]

<< 2026.8 >>
SMTWTFS
      1
2 345678
9101112131415
16171819202122
23242526272829
3031     
 
























T: Y: ALL: Online:
ThemePanel
Created in 0.1031 sec.