新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

そして Hyper-V

なんかしらんがサーバが全滅したみたいなので Hyper-V の上に再構築。Windows Server 2018 R2 っていうやつかな?

何故かデフォルトで Hyper-V はオンになっていないので有効化する。
そして、ubutntu 18.04 をインストール。Hyper-V の新しい VM というやつ(BIOS が使えなくて UEFI で 64bit のみのバージョン)をつかってみる。どっかのサイトを見ると、secure boot をオフにしないといけないとかいてあった。とおもったら、うそだった。Windows の template がだめなだけで、Microsoft UEFI Certificate Authority にすればよかった。(Windows Server の場合。Windows 10 では違う可能性もある)

さっそく ubuntu の install で secure boot で引っかかる。オフにするとちゃんと grub が立ち上がる。そしてインストール。DHCP が立ち上がる。

ubuntu 18.04 はいつのまにか /etc/network/interfaces じゃなくなった。/etc/netplan の下の 50-cloud-init.yaml になった。なんだよ。悩んでしまったじゃないか。

これはほっていおいて postfix と dovecon の imappop3 をインストール。設定して再起動。

service dovecon stop(あるいは start)

postfix はなぜか /etc/init.d で stop/start 。(たぶん違うけどわからなかった)。Maildir は mkdir でつくって、chmod -R 700 にすればいいみたい。sendmail でメール送信して、new に入ることを確認。そして、windowsthunderbirdimap が動くところまで確認した。dovecon は fetchmail の設定をしなかったけど大丈夫なのだろうか?

FreeBSD 11.1 久々にインストール

まず dig も nslookup もない。bind もない sudo もない。内部用の DNS は unbound(だっけ?
)に変わったのか?

とりあえず、sudo インストール

http://www.gadgets-today.net/?p=4314

pkg が効かない。resolv.conf 書いてなかった。IP アドレス追加。resolv.conf に nameserver のキーワード書いてなかった。IP アドレスの追加だけじゃダメだった。

pkg install sudo

インストールできたようだ。ついでに vim-console もインストール。tiny とどう違うのかはなぞ。

dig は知らない間に drill になっていた。ずーと、nslookup つかってたけどね。

dns/bind99 をインストール。その過程で python2.7 が入る。最近は bind じゃないのかも。とおもったら、案の定 deprecated で dns/bind911 をすすめられた。ので bind911 をインストール。911 というところが、わざわざね。という感じ。どうやら dns/bind99 はインストールされずに bind911 をお勧めするメッセージだけが出た模様。(pkg info でみても bind99 がなかったから)

インストールすると、今度はそしたら、attention だって。

/usr/local/sbin/rndc-confgen は既にインストールされていたので(いつ?)、attention の指示通りに rndc-confge を実行する。

rndc-confgen -a

正しいのかどうかは不明だが、/usr/local/etc/namedb/rndc.key ができたらしい。MD5 だよ。ちがう。hmac-md5 だった。
どうやら jail でセキュアーな仮ホストを使ってそこで bind を動かして rndc でコントロールする仕組みらしい。だから rndc が必須。そしてランダムキーを rndc-confgen で作る模様。いままでつかってなかった。

master の書き方は今まで通りのようなのでコピペすればよろしい。いままで内向きの DNS もここに書いていて、反応が妙にのろかったが、これで unbound で別々に管理できる(はず)。

PYNQ を久しぶりに

PYNQ を久しぶりに使ったら login 出来なくなってしまった。
https://groups.google.com/forum/#!topic/pynq_project/l3bKT9VSAmc
によると、ブラウザー(私の場合は firefox)によっては時刻があまりに違い過ぎると表示しなくなるみたい。なので、サーバ側、つまりPYNQ の時刻をちゃんと今に合わせればよい。
も~。
これで数時間無駄にした。

ついでに cygwin と noACL

もう一つ書くと、noacl とするということは MS-DOS のように細かい ACL 制御をしないという選択になることに注意。Windows の複雑な(覚えたくない)ACL の世界を制御しようと思ったら、なんでもかんでも noacl にしてはいけない。特にサーバー関連では。
本来なら cygwin から Windows の世界にコピーしたら、ACL ありだと、自分以外はみれなくなっている。
例えばこんな感じなっているわけだ。

image1280x400_rgba.raw NULL SID:(DENY)(Rc,S,X,DC)
                       <マシン名>\<ユーザ名>:(R,W,D,WDAC,WO)
                       BUILTIN\Administrators:(DENY)(S,X)
                       NT AUTHORITY\SYSTEM:(DENY)(S,X)
                       <マシン名>\なし:(R)
                       BUILTIN\Administrators:(RX,W)
                       NT AUTHORITY\SYSTEM:(RX,W)
                       Everyone:(R)

NULL SID と自分と"なし"(これは cygwin の group にある"なし"だった)が、くっつくわけだ。
見方が今一つ分からないが、挙動を見ると、NULL SID(Windows の標準で設定されているグループ員なしのグループ)で実行などを DENY(拒否?) しているように見える。(でも cmd から実行できてしまった、、、)
順序が有効だと思ったのだが、、、これは Rc,S,X,DC だけが有効という意味なのか?
その後自分自身は R W D など(他は何だかわからない)が許されている。
この状態で、アプリケーションからファイルを読もうとすると、読めなかったりするわけだ。
だから、サーバ関連ではちゃんと ACL つきでコピーして、ひとつひとつ丁寧に設定して必要がある。手抜きしちゃだめよ。

Windows ACL と cygwin のコピー

釈然としないが、cygwin の世界は cygwin で閉じなければだめという話。 cygwin では Windows の世界を”のぞき見”するために /cygdriver なるものがある。便利だからと言ってこれに頼ってはいけないことがわかってきた。たとえば、d: ドライブに(MS-DOS!!) なにかディスクを追加してそこを Work などにしている場合。
自分の場合は、Windows の特定のツールがディレクトリの文字列制限に引っかかるのとデータを別にするために c: ではなく d: を使っている。そして、ちょこちょこ cygwin からコピーしていた。これだめ。
cygwin の世界から Windows の世界にコピーをしようとすると、WindowsACL を作成しようとする。そして、Windows から見ると妙な ACL になってしまい、特定の Windows アプリケーションからは見えなくなってしまうことがある。アプリケーションがそのような事にも対応していればいいのかもしれないが、うまく対応していないと、Windows からはみえているのにアプリケーションからは見えない(読めない)みたいなことが起こる。
どっかの blog にかいてあったように、最初は /cygdrive すべてを noacl にすればいいのかとおもってやってみていた。そうすると、挙動がおかしい。今度は cygwin から見れないファイルが出来てしまう。
cygwin の世界に Windows のフォルダを取り入れるのには mount を使う。一時的なら mount コマンド、恒常的なら /etc/fstab に書いておく。その時 noacl をつけておくと、 ACL は追加しない。/cygdrive 全体を noacl にするといろんなところの影響が大きすぎるのでお勧めしない。/etc/fstab はこんな感じ。

d:/Works /home/Works ntfs binary,noacl,user 0 0

こんな感じ。mount -m で表示したのをそのままコピペしてもよい。

mount -o noacl,user 'd:/Works' /home/Works

mount -m
D:/Works /home/Works ntfs binary,noacl,user 0 0
none /cygdrive cygdrive binary,posix=0,user 0 0

このように豆に mount することで、git clone 時の ACL の問題などが回避できる。

ラズパイ カメラ V2.1 と FPGA

Zybo Z7 とラズパイ・カメラ V2.1 を購入。
忘れないようにメモ(備忘録)

https://github.com/allwinner-zh/linux-3.4-sunxi/blob/master/drivers/media/video/sunxi-vfe/device/imx219.c
android_kernel_asus_ze55xml/imx219.h at master · jerdog/android_kernel_asus_ze55xml · GitHub

どうやら 0x30eb の記述。このなぞの 6 ワード(6byte) で起動がかかるみたい。そのまえに GPIO を操作して起動しないとダメだけど。

0x6620 の隠し機能(?)に書いてるコードもある。
nuttx/camera_ext_mhb_imx219_pi.c at master · MotorolaMobilityLLC/nuttx · GitHub

この場合、起動シーケンスがちょっと変わる。たぶん、高解像度の時かなんかに必要なシーケンス(そしてアンドキュメント)だと思われる。imx219 の pdf の資料には書いてないから。

Zybo Z7 では CAM 用の GPIO に CAM_CLK と CAM_GPIO がある。CAM_CLK のピンは以前のラズパイカメラ(V1.3) では単に LED に繋がっていた。V2.1 はどうも LED がないらしい。今のところ CAM_CLK は on/off しようが I2C とのやりとりはできる。重要なのはどうやら CAM_GPIO のようだ。

参考までにラズパイではそれぞれ GPIO5 と GPIO21 に繋がっている。GPIO5 の使い方の例は次のところで見つけた。
https://www.raspberrypi-spy.co.uk/2013/05/how-to-disable-the-red-led-on-the-pi-camera-module/

試してないし、V2.1 で有効かはわからない。
私が実験した結果では 電源オン後、CAM_CLK を0のまま、CAP_GPIO を 1 にしその後 I2C の通信をすれば、すくなくととも I2C は動くことがわかっている(映像までは確認していないので CAM_CLK がなんらかの影響がある可能性はある)。

下がその I2C をキャプチャした画面。
f:id:ryos36:20180221121339p:plain

そして UART に 0219 を出力。
f:id:ryos36:20180221121420p:plain

デザインはひっちゃかめっちゃか(死語)だが、正しい。
f:id:ryos36:20180221121500p:plain

やりたいことは WindowsTeraTerm から Zynq の PS の UART を通って Zynq PL の UART との通信が一つ。
これは Zynq の PS の UART はただの橋渡し役。いろいろ調べたが、私のやりたいように、うまく接続できないことがわかっている。
Zynq の PL の UART まできたら、Polyphony で解釈して I2C と直接話す。途中までできた。
vio である Virtual な GPIO を on にすると、I2C のプログラムが走り出し imx219 と通信して ID をとってくる。そして、その16進の値をストリングに直して UART へ送る。すると、WindowsTeraTerm で情報が見れる。というところまでは出来た。ソフトウェアはほとんど関与しておらず、Polyphony (Python による高位合成)で達成している。

I2C の確認

AXI の I2C で I2C のプロトコルの確認をした。I2C は MSB からビットを送るので注意が必要という事がわかった。
毎度のことだが FPGA の部屋の記事が役に立つ。
FPGAの部屋 Vivado 2013.4でAXI IIC v2.0 を使用した時のIOBUF

f:id:ryos36:20180216133044p:plain

まずはデザイン ILA のデバッグマークを付けている。

ソフトが必要なのでプログラムを書く。

int main()
{
    int rv;
    uint8_t recv_data[2];
    uint8_t send_data[2];

    init_platform();

    print("Hello World\n\r");
    iic_config0 = XIic_LookupConfig(XPAR_AXI_IIC_0_DEVICE_ID);
    rv = XIic_CfgInitialize(&iic0, iic_config0, iic_config0->BaseAddress);

    XIic_Reset(&iic0);
    XIic_DynamicInitialize(&iic0);

    send_data[0] = 4;
    rv = XIic_DynRecv(iic_config0->BaseAddress, ZC706_I2C_MUX_ADDR, recv_data, 1);
    printf("%d\n", rv);
    rv = XIic_DynSend(iic_config0->BaseAddress, ZC706_I2C_MUX_ADDR, send_data, 1, XIIC_STOP);
    printf("%d\n", rv);
    rv = XIic_DynRecv(iic_config0->BaseAddress, ZC706_I2C_MUX_ADDR, recv_data, 1);

    printf("xrecv_data = %d\n", recv_data[0]);

    cleanup_platform();
    return 0;
}

実行結果
f:id:ryos36:20180216133529p:plain

追伸

情報としては
I2Cについて
ここが正確なようだ。

当初、picfun com というサイトをみていたのだが、
LSB から送信しているように見える図。NACK に関しての記述がない。などから不正確なことが分かった。