昨日(2018年 11月 10日の日記参照)の続きです。残る問題は 3つありました。
2番目の「認識しなくなる問題」の原因が判明しました。
I2S2 を有効にすると SPDIF が使えなくなる問題は、DMA の資源が枯渇していたせいでした。
RK3328 は ARM の PL330(or 互換)の DMA を持っています。SPI, UART, I2S, SPDIF, PWM, PDM など 16のハードウェアがこの DMA を使えますが、実は同時に使えるのは 8つまでという制約があります。知るかそんなこと……。
オーディオ系のハードを全て disable にしたときの DMA 資源の割り当ては、
このようになっていて、残りは 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 を有効にするパターンです。この場合、
以上のように DMA 資源が足りなくなり、エラーになってしまいます。
ちなみに I2S0, I2S1, SPDIF を有効に(11/16: I2S2 → I2S1 に訂正)すると、一応動くのですが、割り当てを調べると、
このように UART が犠牲になってしまうようです。Audio が動いても、UART が死んじゃうのはダメな気がします。
(11/16 加筆)UART は DMA が無効になっても動作はしますので、死んでしまうという言い方は間違いでした。正しくは、Audio のために勝手に UART の DMA を無効にしてしまうのはダメな気がします。デバイスツリー上は有効になっているように見えるので。
せっかく鳴るようになった SPDIF を活かすか、Rockchip Linux に合わせるか、さて、どうしたもんかなあ。
メモ: 技術系の話は Facebook から転記しておくことにした。少し加筆。
合計:
本日:
< | 2018 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 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 | - |
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2016.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)