Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。 記事の転載や、基板・キットの商用利用の方は、ご連絡ください。学生やサークルの学習目的でまとめてご購入する場合は特別価格でご提供させていただきます。
無料ブログはココログ

スポンサー

« ラズパイPico USB-DDC Feedbackを機能するように実装(1) | トップページ | 禁断のヘッドホンアンプ Single OPAMP版 出荷しました »

2024年8月23日 (金)

ラズパイPico USB-DDC Feedbackを機能するように実装(2)

こちらの続きです。

ラズパイ公式のソースではFeedbackをちゃんと実装していないことが分ったのでバッファー残量をみる所から始めましょう。読むのはpicoのsdkです。USBからパケットを受け取ってI2SのPIOへデータを送るのにDMAを使っていることが分っています。

https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf

Pico_sdk

そう言えば、DMA(ダイレクト・メモリ・アクセス)ってちゃんと使ったことなかったなぁ。。。とボヤきつつ、API仕様を眺めていればお盆休み中には何とかなるさ、と軽い気持ちでいました。

 

 

ふむふむ。

Pico_sdk_dma

ふむふむ。

ふむふむ。

!?

バッファ残量を読みだす関数が用意されていない・・・?

 

 

・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バッファの残量が知りたいだけなのです。

ということで次に読むのはこちらです。

Pico_datasheet

https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

Pico_dma_count

なんと、それらしい「Transfer Count」というレジスタがあるじゃないですか。

sdkに読み出しAPIが用意されていないだけのようです。

 

このキーワードを頼りに検索していたら、dma.hの中でセットしている関数がありました。

Pico_dma_transfer_now

読みだす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_buff1

DMAバッファからPIOへ1サンプルずつ自動で送られてバッファ残量は時間とともに減っていきます。

この絵の赤丸の位置で読みだすとDMAバッファ残量は0に近い数値になり、僅かでもタイミングがずれるとバッファが空になって音切れが発生します。

ですので、DMAバッファが20から30あたりになるようにfeedbackすれば良さそうです。 多すぎても今度はオーバーフローする可能性ありますしね。

Dma_buff2

イメージではこうです。再生開始直後はDMA残量0近辺でもfeedback値を大きくしていれば49サンプル送られてきて徐々にCOUNT値が大きくなり20~30で安定するように調整すればよさそう。

 

 

 

つづきます。

« ラズパイPico USB-DDC Feedbackを機能するように実装(1) | トップページ | 禁断のヘッドホンアンプ Single OPAMP版 出荷しました »

Raspberry Pi pico」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ラズパイPico USB-DDC Feedbackを機能するように実装(1) | トップページ | 禁断のヘッドホンアンプ Single OPAMP版 出荷しました »

サイト内検索(new)

2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31