link もっと前
   2018年 11月 11日 -
      2018年 11月 2日  
link もっと後

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

日々

link permalink

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 から転記しておくことにした。少し加筆。

[編集者: すずき]
[更新: 2018年 11月 17日 00:27]
link 編集する

コメント一覧

  • T4 
    こんにちわ
    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月16日 23:22:08)
  • すずき 
    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 されそうです。
     
    (2018年11月17日 00:15:14)
  • T4 
    ● 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日 09:44:30)
  • すずき 
    T4 さん

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

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

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

    ありがとうございます。
     
    (2018年11月17日 13:06:05)
open/close この記事にコメントする



link permalink

ROCK64 の I2S が動かない

先日(2018年 7月 22日の日記参照)買った Rockchip RK3328 搭載ボード ROCK64 で遊んでいます。

Rockchip の SoC で動く Linux は Rockchip がメンテナンスしている Linux(以降 Rockchip Linux)ですが、実は Linux の本流開発ツリー(以降 linux-next)も動作します。

しかし linux-next の方は全く音が出ません(speaker-test で叩くと xrun_recovery faild: -5, Input/output error が出ます)。

以前 S/PDIF も全く動かなかったのですが、原因が分かったのでパッチを送って直しました。今は出音までできているはずです。しかし I2S は原因が違うらしく、なぜ動かないのかさっぱりです。

Rockchip Linux との差

I2S のレジスタ情報は TRM(Technical Reference Manual)に載っていたので、それを見つつ Rockchip Linux とレジスタ値を同じに揃えましたが、I2S は微塵も動きませんでした……。

I2S 以外のドライバのバグを疑い、Rockchip Linux の I2S ドライバを丸ごとコピーしたら、動いてしまいました。疑いはハズレ、つまり I2S ドライバに何らかのバグがあることは確定です。一体何が違うんでしょう。diff を見ましたが差分の意味がわかりません。

差分は多くないので、力技で Rockchip Linux から linux-next に 1つずつ差分を移植していって、動作するかどうか確かめました。原因は devm_snd_dmaengine_pcm_register() の第 2 引数(config)に NULL を渡すかどうか、でした。

私には、その違いの意味するところも、現在の linux-next のコードの何が悪いのかも、さっぱりわかりません。

差分の意味

動作とコードを追ってみると、現在の linux-next のコードは struct snd_dmaengine_pcm_config の prepare_slave_config を設定し忘れているため、全く DMA 転送設定がされていないことがわかりました。

要は、音声データを全く I2S ハードに送っていなかったんです。そりゃ動くわけないわ。

Rockchip Linux はなぜ動くのか

Rockchip Linux はどうしていたかというと devm_snd_dmaengine_pcm_register() の第 2 引数に NULL を指定していました。何も指定していないのに、どうして動くのでしょう?同じバグを踏まないのでしょうか?

実は第二引数に NULL を指定すると ALSA のフレームワーク側で prepare_slave_config に snd_dmaengine_pcm_prepare_slave_config() を指定した状態と同等に扱われます。この働きにより、無事動作していたのでした。わかるかそんなの。

知っていれば秒殺系のバグでしょうけど、私はぱっと見ではわかりませんでした。

バグの修正としてはたった 1行なんですが、理解するまで 2日掛かりました。Linux 詳しい人はもっと早く解析できると思います……。Linux を触っているとこういうの多いので、もっと Linux パワーが欲しいです。

せっかく判明したバグなので ALSA ML にパッチをぶん投げておきました。

まだまだ問題は山積み

ちなみに、これで万事解決ではなく、アナログ音声端子から音を出すには I2S1 と ACODEC というハードを叩かないといけないです(今回動いたのは I2S0)。今わかっているだけで、

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

これだけの問題があります。Rockchip Linux は何らかの方法で問題を解決しているはずなのですが、今のところ私にはさっぱりわかりません。

私のような門外漢が四苦八苦するより、Rockchip の中の人が linux-next に修正パッチを投げてくれる方が断然早いんですけどねえ。あまり linux-next にはご興味がないのでしょうか。

[編集者: すずき]
[更新: 2018年 11月 14日 01:53]
link 編集する

コメント一覧

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



link permalink

遠くに映せ

LAN ケーブルで HDMI 伝送できる世界初の "GPU搭載" HDBaseT カード - PCWatch を読んで。

面白い製品だな〜と思いつつ、今一つこの製品の価値が理解できていませんので、少し調べてみました。

私の予想するこの製品の魅力は、

  • 価格: LAN ケーブルは HDMI ケーブルより安い
  • 距離: HDMI の伝送距離は短い、LAN は長距離引き回せる

のどちらかです。まず価格を見てみると、

10m
LAN: 4,800円(Amazon): サンワサプライ KB-T7-10NVN
HDMI: 2,200円(Amazon): HORIC HDM100-886SV
30m
LAN: 9,700円(Amazon): サンワサプライ KB-T7-30NVN
HDMI: 9,500円(Amazon): HORIC HDM300-008
50m
LAN: 17,700円(Amazon): サンワサプライ KB-T7-50NVN
HDMI: 14,000円(Amazon): HORIC HDM500-275GD

HDMI ケーブルは確かに高いけど、実は CAT7 LAN ケーブルもかなり高いため、大きな違いがありません。

次に距離を見てみると、HDMI も 50m くらいならイコライザ付きのケーブルを使えば、引き回せるみたいです。さすがにケーブル 1本で 100m は無理そうでした。商品が見当たりません。HDMI で 100m に挑むとすると、

  • HDMI エクステンダ(送信、受信に 2つ必要、1つ 1万円くらい、電源も必要、LAN ケーブルも必要)で延長
  • 光ファイバの HDMI ケーブル(10万円くらい、電源必要)で接続

このような選択肢があるようです。HDMI で 50m を超えることは不可能ではないですが、一気に価格が跳ね上がります。

従って、この製品が輝くシーンは
「50m〜100m のディスプレイ配線をケーブル 1本で安く繋ぎたいとき」
だと思われます。たぶん。

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

[編集者: すずき]
[更新: 2018年 11月 9日 15:03]
link 編集する

コメント一覧

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



link permalink

家にたくさんマウスとキーボードがある

引っ越し荷物を開梱していると、たくさんのマウスとキーボードが出てきました。いつのまにこんなに買っていたのか。


我が家のマウスとキーボード

写真には 6つのマウス、6つのキーボードが映っていますが、他にもマウス 3つ(Logicool V450、Microsoft Wireless Mouse 1000 が 2つ)と、キーボード 1つ(Topre REALFORCE)がありました。

マウスの一覧です。

  • Logitech Optical Mouse USB M-UV96
  • ELECOM EX-G Ultimate Laser Mouse M-XGL20DL(リンク)
  • Logicool Wireless Mouse M510(リンク)
  • Logicool Wireless Mouse M560(リンク)
  • Logicool Cordless Laser Mouse MX1100(リンク)
  • Logicool Marathon Mouse M705(リンク)
  • Logicool Nono Cordless Laser Mouse V450(リンク)
  • Microsoft Wireless Mouse 1000(リンク)

キーボードの一覧です。

マウスの感想

マウスは 9個も買ったにも関わらず、一番手に合うと思ったのは、会社の PC に付属している有線タイプのマウスでした。サイズが絶妙で、とても軽くて良いです。

ワイヤレスマウスは妙に小さいか、妙に重たいので、手が疲れてしまいます。今のところ唯一気に入ったのは Logicool の M705 だけです。

キーボードの感想

キーボードは 7個も買いましたが、キーの配置がスタンダードであることだけが重要で、構造や他の要素はあまり気にならないことがわかりました。PC に付属しているキーボードはキー配置に捻りがなくて使いやすいものが多いですが、最近の PC は変なキー配置のキーボードが増えていて困ります。普通の配置が良いです。要らんことしないで欲しい。

前の会社(ソシオ)で使っていた富士通 PC に付いてたキーボード(FKB-1424 と配置が似ているやつ)はキーが若干頼りなかったですけど、キー配置が普通で良かったです。

今の会社の DELL KB216 はイマイチです。左下の Fn キーが邪魔ですし、左 Alt のところ(Z キーの一段下)に Win キーが来ていて、メチャクチャ押し間違えます。あまりに誤打するので撤去して、REALFORCE に置き換えたほどです。昔使っていた DELL マシンのキーボード(DELL SK8115?スペースキーが正方形のもの)はスタンダードな配置で良かったのにな〜。なんでノート PC もどきの配置にしたんでしょうね。

Logicool のマウスは良いものが多いんですけど、キーボードはイマイチなキー配置が多いです。K275 以外は誤打連発で手に合いません。

REALFORCE は価格は高いのを除けば、キー配置がスタンダードで非常に良いキーボードです。我が家では活躍の場がないため、会社に持って行って活躍してもらっています。

メモ: 技術系の話は Facebook から転記しておくことにした。10月13日の投稿が元だが、大幅に加筆した。

[編集者: すずき]
[更新: 2018年 11月 9日 14:43]
link 編集する

コメント一覧

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



link permalink

職業ダブってた

先日(2018年 10月 15日の日記参照)気づいたことですが、Facebook や LinkedIn の職歴では、現職として 2社以上に所属することができるようになっています。

エグゼクティブクラスなら複数の会社の取締役を兼任するだろうけど、正直言って自分には縁が無い機能だと思っていました。

しかしエグゼクティブでなくとも、この世には「出向」という 2足の草鞋を履ける制度がある訳で。自分でこの機能を使うことになるとは思いませんでした……。

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

[編集者: すずき]
[更新: 2018年 11月 9日 14:42]
link 編集する

コメント一覧

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



link もっと前
   2018年 11月 11日 -
      2018年 11月 2日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

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

最終更新: 12/10 12:33

カレンダー

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

最近のコメント 5件

  • link 18年11月28日
    すずき 「Linux に contribute す...」
    (更新:12/10 12:33)
  • link 18年11月28日
    T4 「やっぱり貴方でしたか、ご苦労さまでした。...」
    (更新:12/05 09:20)
  • link 18年11月28日
    すずき 「RK3228 じゃなくて RK3288 ...」
    (更新:12/05 02:19)
  • link 18年11月28日
    すずき 「ありがとうございます。Linux のコミ...」
    (更新:12/05 02:04)
  • link 18年12月01日
    すずき 「私も最初、HDD, SSD は使いまわそ...」
    (更新:12/04 12:49)

最近の記事 3件

link もっとみる
  • link 18年11月29日
    すずき 「[ROCK64 のアナログオーディオが動いた] 先日(2018年 ...」
    (更新:12/03 10:21)
  • link 18年12月01日
    すずき 「[PC パワーアップ計画] 普段、家の PC のパワー不足を感じる...」
    (更新:12/02 18:32)
  • link 18年11月28日
    すずき 「[ROCK64 の I2S1 が動いた] 先日(2018年 11月...」
    (更新:12/02 16:34)

こんてんつ

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

その他の情報

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