ラズパイPico USB-DDC Feedbackを機能するように実装(2)
こちらの続きです。
ラズパイ公式のソースではFeedbackをちゃんと実装していないことが分ったのでバッファー残量をみる所から始めましょう。読むのはpicoのsdkです。USBからパケットを受け取ってI2SのPIOへデータを送るのにDMAを使っていることが分っています。
https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf
そう言えば、DMA(ダイレクト・メモリ・アクセス)ってちゃんと使ったことなかったなぁ。。。とボヤきつつ、API仕様を眺めていればお盆休み中には何とかなるさ、と軽い気持ちでいました。
ふむふむ。
ふむふむ。
・
・
ふむふむ。
・
・
!?
バッファ残量を読みだす関数が用意されていない・・・?
・DMAをセットしたときのデータ量と、内部クロックから割り出して現在の残量を推測する
もしくは、
・PIOのLRCKを別のGPIOに接続して、実際に出力した波形から出力サンプル数をカウントする
はたまた、
・PIOからIRQを叩いてカウントする
方法は色々あるとは思いますが「調べて、実験して、挫折」を繰り返して熱い戦いを繰り広げているうちにお盆休みが終わってしまいました。
汗
そういえばインターフェス誌のpico 1bit DACのソースが公開されていたはず。
と検索してみるとDMAを使っていない様子。ちゃんと解読しておりませんが独自のキューバッファを作って割り込み処理にて1サンプルづつ出力しているような気配です。その独自キューバッファの残量を読みだしていました。
ラズパイ公式の方でもfs=96kHz化を実験している方がUSBバッファ問題に気が付いて放置している様子。
Issue with usb sound card at higher sample rates #42
RP2040のDMAハードウェア
独自キューバッファまで実装しての改造は骨が折れます。 私はDMAバッファの残量が知りたいだけなのです。
ということで次に読むのはこちらです。
https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
なんと、それらしい「Transfer Count」というレジスタがあるじゃないですか。
sdkに読み出しAPIが用意されていないだけのようです。
このキーワードを頼りに検索していたら、dma.hの中でセットしている関数がありました。
読みだすAPIがないのであれば、作ればいいということで、、、
DMAバッファ残量読み出し関数
uint32_t get_queue_level(void){
dma_channel_hw_t *hw = dma_channel_hw_addr(shared_state.dma_channel);
return hw->al1_transfer_count_trig;
}
ってのを作って呼んでみたら、それらしい数値を取得できました。
trigという文字が気になりますが、、、とりあえず めでたしめでたし。
読みだすタイミングは・・
DMA残量は刻々と変化しているので適当なタイミングではいけません。
サンプリング周波数48kHzでは1msごとに48サンプルずつパケット(バケツ)が送られてくるので、USBバッファからDMAバッファへ入れる直前で読みだすことにします。
DMAバッファからPIOへ1サンプルずつ自動で送られてバッファ残量は時間とともに減っていきます。
この絵の赤丸の位置で読みだすとDMAバッファ残量は0に近い数値になり、僅かでもタイミングがずれるとバッファが空になって音切れが発生します。
ですので、DMAバッファが20から30あたりになるようにfeedbackすれば良さそうです。 多すぎても今度はオーバーフローする可能性ありますしね。
イメージではこうです。再生開始直後はDMA残量0近辺でもfeedback値を大きくしていれば49サンプル送られてきて徐々にCOUNT値が大きくなり20~30で安定するように調整すればよさそう。
« ラズパイPico USB-DDC Feedbackを機能するように実装(1) | トップページ | 禁断のヘッドホンアンプ Single OPAMP版 出荷しました »
「Raspberry Pi pico」カテゴリの記事
- RPiZeroRP2040 ラズパイZERO形状USB-DDC基板(2024.10.20)
- RPiZeroRP2040 USB-DDC基板試作(2024.09.01)
- ラズパイPico USB-DDC Feedbackを機能するように実装(3)(2024.08.24)
- ラズパイPico USB-DDC Feedbackを機能するように実装(2)(2024.08.23)
- ラズパイPico USB-DDC Feedbackを機能するように実装(1)(2024.08.22)
« ラズパイPico USB-DDC Feedbackを機能するように実装(1) | トップページ | 禁断のヘッドホンアンプ Single OPAMP版 出荷しました »
コメント