2017-01-10

浦安海釣

新年2日。検見川浜突堤にて。これでシーズン3匹め。


8日には高洲公園前で40センチのフッコ。なんか釣れてないみたいで、偵察に来た方が、唯一釣れてます、と。常連からも、年始から初めて釣れた魚をみたとか、、、カレイ以外にもセイゴは釣れてて、小さいから大抵リリースしてるんだけどなぁ、、、

で、9日。今度は総合公園前。一瞬当りがあったように見えるが、反応続かず。なんだ、と思ってあげてみたら、穴子でした。これで浦安の海で3匹め。居るなぁ、とか思いつつ。



このサイズなら自力でさばけました。



今回は奥様のご要望で、天ぷらに。ふわとろで、とても美味しかったです。


まぁ、魚は居ないわけぢゃないよ、と言うことで、、、

2017-01-09

わかった!

よーく他と比較したら…

iqaudio-dac.c に対して、iqaudio-dacplus-overlay.dtsと、同じレベルのdtsが作られていた。

今回やってるのは

bcm2835-i2s.c(alsaドライバ)→rpi-dac.c(dacドライバ)

の形式で、sampling_rateとかがbcm2835-i2s.cで簡単に拾えているので、そちらに改造を行っていた(よその改造記事でもそこに手を入れていたので)…

これが、失敗だった…

実際修正していたdtsファイルはrpi-dac-overlay.dtsだったので、rpi-dac.c側にgpioの制御を持たせないといけなかった。
#もしくはbcm2835-i2sに対応したdtsファイルを作らないといけなかった(これが正しいやり方かは、微妙な気がするが)

というわけで、bcm2835-i2s.cに乗せていた修正を、全部rpi-dac.c側にうつしたら、あっさり動きました。
(1) probe で、dtsファイルのgpioポートを探して、静的変数に保持する。
(2) hw_paramsで、sampling_rateを識別し、それに合わせて gpioポートの値を変える。

ようやく、linuxのデバイスツリー周りの初歩が理解できました。長かった…日本語のWeb上の解説がほとんど無くて苦戦しました。

何かが違った…

arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts
とか
arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts
を参考に

fragment@2 {
target = <&sound>;
__overlay__ {
compatible = "rpi,rpi-dac";
i2s-controller = <&i2s>;
status = "okay";
};
};


reset-gpio = <&gpio 16 0> ;
とかを記述追加

で、
sound/soc/bcm/iqaudio-dac.c

sound/soc/bcm/hifiberry_digi.c
を参考に

probe関数の中で
devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW);
を使って、resetのgpioの情報を読みだそうとするが、-2でエラー。

なぜ引っ張れないんだろう、と思案中。

エラー値は、 -ENOENT (=-2) つまり、「ファイルまたはディレクトリが存在しません。」

要するに、"reset" で、dtsの中の情報を引っ張ろうとしてるが、引っ張れません、というところか…

ソースをみていくと
http://lxr.free-electrons.com/source/drivers/gpio/gpiolib.c#L3194
このあたり、__must_check gpiod_get_indexの中で

デバイスツリーか、ACPIでの検索をして、なかったら、gpiod_findして、それでもなかったら、上記エラーを返している、と。

dtsに書いている時点でデバイスツリーを使っているはずだが…

んー、よく見比べると

if (pdev->dev.of_node) {

の内側、

i2s_node = of_parse_phandle(pdev->dev.of_node, "i2s-controller", 0);

のコールがすんでからのみ、呼んでるようにみえるな…ちょっとそっちの方向で試してみるか…

2017-01-07

浦安海釣

12月に入って、カレイをもう1匹ゲット。場所は、高洲公園前。
今年はフッコが渋いですね、あんまり釣れません。

1月2日に検見川浜の突堤で、他の人とは違い中に向けて投げていて、カレイをゲット。これで今シーズン3枚。

1月7日に高洲公園前で40cmのフッコ。なんか、原付で来た方に「お!釣れてる人を初めてみた」とか言われた。んー、一応それなりに釣ってるんだけどなぁ…
帰りに常連のおっちゃんに遭ったら「を、やっぱり魚いるぢゃん」って…年始以降で初めてみた魚だったらしい。んー、えー…

この時期、バチ抜けなので、高洲公園前なら適切なところに適切な時間に投げ込んでいれば、たいてい釣れます。岸から80mくらいのところを狙って…

検見川浜の突堤で、ヒイカが釣れているのをみて、浦安でも釣れんかなぁ、と思案中。そのうちいろいろやってみる予定です。寒いからくじけるかもしれませんが…

作業メモ

Raspberry Pi を使い、外部クロック同期で、SPDIFを出す基板に対応するために、いろいろとカーネルに手を入れたのでそのメモ残し。

・環境
 Raspberry Pi 3
 Raspbian OS
 mpd

Volumioでやろうかとも思ったのですが、エディタすら入ってなかったのであきらめました。
Raspbian OS を GitHub から持ってきて、カーネルを一度ビルドかけておきます。
放熱しないと、時々熱で処理速度が落ちるので、その際は息を吹きかけて、とかやってると1時間ちょっとくらいでビルドが終わります。
ビルドが終わったら、カーネル差し替えて、動くよね、と確認しておきます。
#ここらの手順は、Raspberry Pi のサイトにあります。

・ドライバの組み込み。
bcm2835-i2s と、Rpi-dac およびpcm1794a-hifiの組み合わせで利用。
/boot/config.txt にどいつを組み込むかが書いてあるので、そこに rpi-dac を記述。
参考
rebootかけて、lsmodすると、rpi-dac周りが入ってるはず。入ってなければ rmmod とかで不要なドライバを抜いて、insmod でrpi-dacとかを入れておく。

・ドライバの改造
GPIOでいろいろ情報を渡す(サンプルレートとか)ので、それができるように設定する必要がある。
カーネルビルドを行った環境で、以下を参照。
linux/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
fragment@2 {
target = <&sound>;
__overlay__ {
compatible = "rpi,rpi-dac";
i2s-controller = <&i2s>;
status = "okay";
};
};
この _overlay_ の内側に、gpioの識別名-gpio = <&gpio ポート番号 値> ; とかいう形で記述しておくと、後ほどドライバからこの設定を読み込んで、指定のgpioの値の書き換えが可能となる。これが最初どこにあるかさっぱりわからなかった…

ここにgpioの設定を書き込んだ後に、linux/sound/soc/bcm/bcm2835-i2s.cを書き換える。

bcm2835_i2s_probeの中で、devm_gpiod_get を使って、上記の「gpioの識別名」に対応する情報が得られる。この情報を使って、gpiod_set_value_cansleepで値をセットすると、きちんと反映されるようになった。

後はスレーブモードになるように設定値を変えれば、大体終了。

カーネルをビルドしなおして、差し替えをしてrebootすれば、これらの設定が生きるようになるはず。

あとは、mpd入れて、適当なファイルを再生すれば、きちんと鳴ることが確認できました。

gpioの設定を理解するまでが長かった…判りやすく解説している情報がなかったので、clock44 という文字列で、カーネル中をすべて検索してよーやく…