link もっと前
   2019年 2月 4日 -
      2019年 2月 4日  
link もっと後

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

日々

link permalink

Rock64 HDMI オーディオ

先日購入した HDMI モニタのおかげで、Rock64 の I2S0 つまり HDMI Audio の動作確認ができました。

しかし以前(2018年 11月 11日の日記参照)悩んでいた通り、単純に I2S0 を有効にすることはできません。DMA チャネルが足りない問題が発生するためです。

Rock64 に搭載されている Rockchip RK3328 の DMAC は、16 の DMA チャネルを持っていますが、そのうち 8ch しか同時に使えない仕様になっています。

苦肉の策

現在の linux-next の Rock64 向けデバイスツリーでは、既に 7ch を使用(I2S1 2ch, SPDIF 1ch, SPI0 2ch, UART2 2ch)していますから、ここに 2ch を使用する I2S0 を追加すると合計 9ch になって、オーバーしてしまいます。

仕方ないので UART2 の DMA 割り当てを解除して、I2S0 に割り当てるパッチを投稿しました。

予想通りの反応

私がパッチに書いた説明が悪かったのだと思いますが、メンテナーの Heiko さんから「どうして UART2 の DMA チャネルを I2S0 が使えるのかわからない」という返事がきました。ですよね……私も最初意味不明でしたし。

できる限り説明を加えて返事しましたが、理解してもらえると良いな。

わかりづらい仕様書

ややこしいことに、RK3328 の仕様書を見ると、各 DMA チャネルには ID が(仕様書では Req number)が振られていて、ぱっと見 16 チャネルが全て同時に使えそうに見えるんですよ。

この仕様書から「各 DMA チャネルは独立しているけど、全てのチャネルが同時に使える訳ではない」という意味を読み取れる人はなかなかいないと思います。

DMA チャネルの割り当て

少なくとも私は DMA の Req number とチャネル数の関係を理解するのは無理だったので、DMAC のドライバ(PL330)を追いかけました。

サウンド系から DMA チャネルの割り当てを要求するとき、次のような呼び出し関係になります。

RK3328 の DMA チャネルの割り当て

rockchip_pcm_platform_register()
  devm_snd_dmaengine_pcm_register()
    snd_dmaengine_pcm_register()
      dmaengine_pcm_request_chan_of()
        dma_request_slave_channel_reason()
          of_dma_request_slave_channel()
            ofdma->of_dma_xlate() => of_dma_pl330_xlate()
              dma_get_slave_channel()
                dma_chan_get()
                  pl330_alloc_chan_resources()
                    pl330_request_channel()

まず、関数 of_dma_pl330_xlate() にはローカル変数 chan_id が登場します。これが DMA の ID に相当します。例えば UART2 の送信側なら chan_id = 6 になります。

元になる数字はどこから来るかというと、of_dma_match_channel() でデバイスツリーから情報を貰っています。RK3328 の場合、デバイスツリーで DMA チャネルを指定する際は、Req number を書くようです。

次に、関数 pl330_request_channel() に構造体 struct pl330_dmac のメンバー channels という配列が登場します。この channels の数が DMAC の DMA チャネルの数と等しいです。Req number とは無関係に、DMA チャネルを要求されると先頭から埋まっていきます。

こんな仕様が初見でわかる訳ないじゃない。むり。

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

[編集者: すずき]
[更新: 2019年 2月 5日 00:59]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 2月 4日 -
      2019年 2月 4日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 2/21 00:46

カレンダー

<2019>
<<<02>>>
-----12
3456789
10111213141516
17181920212223
2425262728--

最近のコメント 5件

  • link 18年12月11日
    すずき 「確認いただいてありがとうございます。直っ...」
    (更新:12/27 00:22)
  • link 18年12月11日
    T4 「再現しませんね\n\n確かに、過去にそう...」
    (更新:12/25 12:45)
  • link 18年12月11日
    すずき 「失礼しました。Rock64 の方は、\n...」
    (更新:12/22 02:10)
  • link 18年12月11日
    T4 「私は、Tinker Board を持って...」
    (更新:12/21 10:14)
  • link 18年12月11日
    すずき 「> 但し、これもう一年以上前の話で...」
    (更新:12/19 11:54)

最近の記事 3件

link もっとみる
  • link 19年02月19日
    すずき 「[RISC-V のコンパイラ] Crosstool-NG は RI...」
    (更新:02/21 00:46)
  • link 19年02月18日
    すずき 「[RockPro64 のシリアル出力] RockPro64 のシリ...」
    (更新:02/21 00:43)
  • link 19年02月20日
    すずき 「[RockPro64 の HDMI Audio] RK3399 の...」
    (更新:02/21 00:33)

こんてんつ

open/close wiki
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 過去日記について

その他の情報

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