コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2018年11月11日 >>> 2018年11月11日
link もっと後

2018年11月11日

ROCK64のアナログオーディオ - その3 - I2S2を認識しない問題解決

目次: ROCK64/ROCKPro64

linux-nextで動かないROCK64のI2S

昨日(2018年11月10日の日記参照)の続きです。残る問題は3つありました。

  • I2S1はなぜか動かない
  • I2S2はSPDIFと資源が衝突して認識しない
  • ACODECはTRMに何も情報が載っていない

2番目の「認識しなくなる問題」の原因が判明しました。

DMAの資源は有限です

I2S2を有効にするとSPDIFが使えなくなる問題は、DMAの資源が枯渇していたせいでした。

RK3328はARMのPL330(or互換)のDMAを持っています。SPI, UART, I2S, SPDIF, PWM, PDMなど16のハードウェアがこのDMAを使えますが、実は同時に使えるのは8つまでという制約があります。知るかそんなこと……。

オーディオ系のハードを全てdisableにしたときのDMA資源の割り当ては、

  • 0: SPI TX
  • 1: SPI RX
  • 2: UART RX
  • 3: UART TX

このようになっていて、残りは4つです。

I2S0, 1, 2はそれぞれDMA資源を2つ使い(TX, RXがあるため)、SPDIFは資源を1つ使います(TXしかないため)。

Rockchip Linux(Rockchipが独自にメンテナンスしているLinuxのツリーのこと)の設定ではI2S0, I2S1のみを有効にしてSPDIFを切り捨てています。ちょうど資源を8つ使いきる設定ですね。ROCK64はピンヘッダにしかSPDIF信号が出せませんし、捨てるのも妥当かなとは思います。

ダメなパターン

私が前にエラーになってできないと言っていたパターンはI2S0, I2S1, I2S2, SPDIFを有効にするパターンです。この場合、

  • 0: SPI TX
  • 1: SPI RX
  • 2: I2S0 TX
  • 3: I2S0 RX
  • 4: I2S1 TX
  • 5: I2S1 RX
  • 6: I2S2 TX
  • 7: I2S2 RX
  • SPDIF TX -> エラー!

以上のようにDMA資源が足りなくなり、エラーになってしまいます。

微妙なパターン

ちなみにI2S0, I2S1, SPDIFを有効に(11/16: I2S2 → I2S1に訂正)すると、一応動くのですが、割り当てを調べると、

  • 0: SPI TX
  • 1: SPI RX
  • 2: I2S0 TX
  • 3: I2S0 RX
  • 4: I2S1 TX
  • 5: I2S1 RX
  • 6: SPDIF TX
  • 7: UART RX
  • UART TX -> エラー

このようにUARTが犠牲になってしまうようです。Audioが動いても、UARTが死んじゃうのはダメな気がします。

(11/16加筆)UARTはDMAが無効になっても動作はしますので、死んでしまうという言い方は間違いでした。正しくは、Audioのために勝手にUARTのDMAを無効にしてしまうのはダメな気がします。デバイスツリー上は有効になっているように見えるので。

正解は特にない

せっかく鳴るようになったSPDIFを活かすか、Rockchip Linuxに合わせるか、さて、どうしたもんかなあ。

メモ: 技術系の話はFacebookから転記しておくことにした。少し加筆。

編集者:すずき(2020/10/30 01:32)

コメント一覧

  • T4さん(2018/11/16 23:22)
    こんにちわ
    T4 といいます、以前に一度話した事があります。
    全く同じ処で(I2S1->ACODEC 出力)つまずいてて、探していたら ココを見つけました。
    先日の事ですが、私の方では何とか解決に漕ぎ着けました。

    ---

    それはさておき、DMAリソースの件ですが
    ROCK64に限って言えば、I2S2の関連端子は ボード上で GMAC/SPI-FLASH に接続されてます
    この状況で、I2S2 を有効にする事に意味があるとは思えません。

    また、> "Audio が動いても、UART が死んじゃうのはダメな気がします。"
    についてですが、私のところでは DMAを使わなくても実使用上差し支えありません。
    DMAを使わないと、"UART が死んじゃう" という事はないと思います。

    あと、"SPI-FLASH" 関しても U-Bootの為の書き換え程度で、その他は殆ど使う機会が有りません
    (今は直ってるかも知れませんが、以前はDMAを使うとマトモニ動かないと言った報告もありました)

    UART/SPI-FLASH の何れも、DMAの使用無し でも問題なく機能しています(使えなくなるわけじゃない)
    加えて この2者の場合、その転送速度と使用頻度を考慮すれば 無理にDMAを使う必要も無いと思います。

    私見ですが、ROCK64に限っては "SPI0/UART2/I2S2" のDMA使用は "OFF" でいいんじゃないですかね?
    ご指摘のリソース不足の件がありますので、 私はずっと前からこのような設定で使ってました。
  • すずきさん(2018/11/17 00:15)
    T4さん

    > 全く同じ処で(I2S1->ACODEC 出力)つまずいてて、探していたら ココを見つけました。
    > 先日の事ですが、私の方では何とか解決に漕ぎ着けました。

    私の方はまだ動いていないです。よろしければどのように解決したか教えていただけるとありがたいです。


    > この状況で、I2S2 を有効にする事に意味があるとは思えません。

    すみません、思い切り書き間違ってます…。私が使いたいのは I2S2 ではなく、ACODEC に繋がっている I2S1 です。I2S2 はご指摘の通り、有効にする意味がありません。

    > についてですが、私のところでは DMAを使わなくても実使用上差し支えありません。
    > DMAを使わないと、"UART が死んじゃう" という事はないと思います。

    確かに UART は DMA が無効になっても動いていたので「UART が死んでしまう」という表現は間違いですね。ご指摘ありがとうございます。直しておきます。


    > 私見ですが、ROCK64に限っては "SPI0/UART2/I2S2" のDMA使用は "OFF" でいいんじゃないですかね?
    > ご指摘のリソース不足の件がありますので、 私はずっと前からこのような設定で使ってました。

    うーん、そうですね、linux-next にパッチを送るとすると、
    「サウンドは DMA 使わないと動かないから、UART は DMA を無効にして PIO にする」
    という内容になるんですかね。うまく説明しないと reject されそうです。
  • T4さん(2018/11/17 09:44)
    ● I2S1が 全く動かない
    なぜか "I2S1"が 全く動かない、また それをクリアすると今度は別のエラーがでる
    といった問題は下記記ファイルに原因があります
    全ては書けませんが、参考として最後に一部を付けておきます(ココだけじゃありません、他にもあります)
    "Rockchip-Tree" のモノ & TRM(Technical Reference Manual)とじっくり見比べて見てください。
    drivers/clk/rockchip/clk-rk3328.c
    include/dt-bindings/clock/rk3328-cru.h
    sound/soc/rockchip/rockchip_i2s.c

    次に "ACODEC" ですが、
    これは、"Rockchip-Tree" の中にドライバがありますので、
    sound/soc/codecs/rk3328_codec.c
    sound/soc/codecs/rk3328_codec.h
    これを移植します。
    *)ドライバ・モデルの変更に合わせた修正が必要、単純作業ですが修正量は多いです

    そして、デバイスツリーに "ACODEC" を追加します

    ---
    以上の作業の後、私のところでは音が出るようになりました
    でも、まだ問題が
    "FS(サンプリング・レート)"の違う音源を交互に再生すると、音が出なくなる" と言った症状です。
    o 44kHz -> 48Khz
    x 48Khz -> 44kHz
    このため、更に rk3328_codec.c のロジックも弄る必要がありました
    資料が無いので手探り状態での修正を強いられます。
    まぁ、例え有ったとしても rk3328_codec.h に書かれている程度の内容でしょうが…

    以上を合わせると、結構な分量になります。

    ---
    最も時間とを費やしたのは、"I2S1が 全く動かない" の解析です
    全く動かないと、次に進めませんからね
    しかも問題の箇所が、まるで "間違い探し" のようなヤツでしたから…
    でも、バグなんて みんなこんなモンです
    バグの全てと言っていいほどが、作業量の99%を原因の特定に費やします。

    ---
    ● DMA リソース不足
    これに付いては、ボード固有の事情 / 若しくは個人の趣味趣向の類に入ると思いますので
    送る程のものか? とも思いますが、もし報告するとしたら

    rk3328-rock64.dts (HPの使用文字制約ため、一部全角で書いてます)
    &uart2 {
    + /delete-property/ dmas;
    + /delete-property/ dma-names;
    + /delete-property/ #dma-cells;
      status = "okay";
    };
    コード自体を弄くるわけじゃないから、受け入れやすいかも?
    でも 現状の"next"では、"SOUND" 自体が 全て無効になってますよね

    ---

    drivers/clk/rockchip/clk-rk3328.c (HPの使用文字制約ため、一部全角で書いてます)
     COMPOSITE(0, "clk_i2s1_div", mux_2plls_p, 0,
       RK3328_CLKSEL_CON(8), 15, 1, MFLAGS, 0, 7, DFLAGS,
       RK3328_CLKGATE_CON(1), 4, GFLAGS),
     COMPOSITE_FRACMUX(0, "clk_i2s1_frac", "clk_i2s1_div", CLK_SET_RATE_PARENT,
       RK3328_CLKSEL_CON(9), 0,
       RK3328_CLKGATE_CON(1), 5, GFLAGS,
       &rk3328_i2s1_fracmux),
     GATE(SCLK_I2S1, "clk_i2s1", "i2s1_pre", CLK_SET_RATE_PARENT,
    -   RK3328_CLKGATE_CON(0), 6, GFLAGS),
    +   RK3328_CLKGATE_CON(1), 6, GFLAGS),
     COMPOSITE_NODIV(SCLK_I2S1_OUT, "i2s1_out", mux_i2s1out_p, 0,
       RK3328_CLKSEL_CON(8), 12, 1, MFLAGS,
       RK3328_CLKGATE_CON(1), 7, GFLAGS),
  • すずきさん(2018/11/17 13:06)
    T4 さん

    クロック周りなんですね。
    clk-rk3328.c の間違いは私も気づいて、パッチを送ろうと思っていました。ただこれだけでは I2S1 が動かなかったので、困っていました。

    rk3328-cru.h の方は見ていなかったので、比べてみます。

    ACODEC は一応移植してますが、今は I2S1 だけ見たいので、ダミーのコーデックドライバとくっつけて試しています。

    ありがとうございます。
open/close この記事にコメントする



link もっと前
2018年11月11日 >>> 2018年11月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2018>
<<<11>>>
----123
45678910
11121314151617
18192021222324
252627282930-

最近のコメント20件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」
  • link 24年1月24日
    すずきさん (02/13 11:48)
    「ありがとうございます。\n私のPCはもう...」
  • link 24年1月24日
    えはらさん (02/12 15:00)
    「Powershellのスクリプトは以下の...」
  • link 24年2月2日
    すずきさん (02/02 18:17)
    「サーバー側の設定はとても簡単でした。ちょ...」
  • link 24年2月2日
    hdkさん (02/02 08:54)
    「さくらのレンタルサーバの設定でLet's...」
  • link 24年1月24日
    すずきさん (01/28 11:35)
    「ご指摘ありがとうございます。確かに間違っ...」
  • link 24年1月24日
    通りすがりさん (01/27 14:05)
    「Powershellで解決しなかったのは...」
  • link 23年11月29日
    すずきさん (12/04 00:38)
    「あ、そうか。1nsですね。ありがとうござ...」
  • link 23年11月29日
    hdkさん (12/03 18:49)
    「>(本来1usなのに1msになって...」
  • link 23年11月29日
    すずきさん (12/03 00:35)
    「大山先生、お久しぶりです。コメントありが...」
  • link 23年11月29日
    大山恵弘さん (12/02 18:53)
    「すずきさんのX(旧Twitter)へのポ...」
  • link 20年7月12日
    すずきさん (10/19 11:17)
    「ご指摘ありがとうございます。9月の編集は...」
  • link 20年7月12日
    通り縋りさん (10/18 19:08)
    「上の記事2023年9月編集という事ですが...」
  • link 23年9月22日
    すずきさん (09/23 21:14)
    「そうなんですよ。賢いなーと思って自分でも...」
  • link 23年9月22日
    hdkさん (09/23 14:56)
    「+1だから、繰り上がる時は必ず下のほうに...」
  • link 23年9月2日
    すずきさん (09/06 18:21)
    「dアカウント自体はMNPと関係なく存在す...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20