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 コード

最終更新: 4/20 00:42

カレンダー

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

最近のコメント 5件

  • link 19年04月01日
    すずき 「どの CPU というかシステムでも同じ傾...」
    (更新:04/05 11:03)
  • link 19年04月01日
    hdk 「去年Ryzen 7 1700で測りました...」
    (更新:04/02 22:48)
  • link 19年03月05日
    すずき 「> オシロの波形見てて気がつかなか...」
    (更新:03/21 17:45)
  • link 19年03月05日
    kml 「> 自分が持っている RockPr...」
    (更新:03/20 21:30)
  • link 19年03月10日
    すずき 「ありがとー!!」
    (更新:03/13 09:46)

最近の記事 3件

link もっとみる
  • link 19年04月19日
    すずき 「[RISC-V の SoC を見ていた] Linux が動くくらい...」
    (更新:04/20 00:42)
  • link 19年04月18日
    すずき 「[Linux の DMA] 昨今のキャッシュを持った CPU では...」
    (更新:04/20 00:29)
  • link 19年04月13日
    すずき 「[レジスタダンプ、書き換えツール memaccess - ちょ] ...」
    (更新:04/19 23:35)

こんてんつ

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 サイトの情報