e-tipsmemo

ごった煮

zybo ethernet Ubuntu 17 ipv4

0からzyboのLinux起動を試しており、イーサネットがつながらなかった。
e-tipsmemo.hatenablog.com
大体ここをベースに今回はUbuntu 17 (Artful)を利用する。

①デザイン

zyboのイーサネットピンをMIOから出す。MDIOを忘れないようにする。
f:id:katakanan:20180207210954p:plain
参考
f:id:katakanan:20180205235840p:plain:w200

②bitstreamをつくる。

省略

SDKを立ち上げてFSBLを作る。

省略

④Device treeをつくる。

ここが一番バージョンによって変わっているのか、ドライバが違うからだめなのかよくわからないが
とにかく、Digilentgithubにある書き方では動かなかった。(いままでは動いていた気がする)
動かなかった。。?書き方。
linux-Digilent-Dev/zynq-zybo.dts at master · Digilent/linux-Digilent-Dev · GitHub

ps7_ethernet_0: ps7-ethernet@e000b000 {
	#address-cells = <1>;
	#size-cells = <0>;
	clock-names = "ref_clk", "aper_clk";
	clocks = <&clkc 13>, <&clkc 30>;
	compatible = "xlnx,ps7-ethernet-1.00.a";
	interrupt-parent = <&ps7_scugic_0>;
	interrupts = <0 22 4>;
	phy-handle = <&phy0>;
	phy-mode = "rgmii-id";
	reg = <0xe000b000 0x1000>;
	xlnx,eth-mode = <0x1>;
	xlnx,has-mdio = <0x1>;
	xlnx,ptp-enet-clock = <108333336>;
	mdio {
		#address-cells = <1>;
		#size-cells = <0>;
		phy0: phy@1 {
			compatible = "realtek,RTL8211E";
			device_type = "ethernet-phy";
			reg = <1>;
		} ;
	} ;
} ;

これでも一応、eth0は出現するが

$ sudo ip link set eth0 up

でエラーが出る。

xemacps e000b000.ps7-ethernet: XEMACPS mii bus mii_probe fail.
xemacps e000b000.ps7-ethernet: eth0: no PHY found

device-tree-generatorを使ってみる。
xilinxの最新のdevice-tree-generatorを利用すると、全く違う構成になっている。

gem0: ethernet@e000b000 {
	compatible = "cdns,zynq-gem", "cdns,gem";
	reg = <0xe000b000 0x1000>;
	status = "disabled";
	interrupts = <0 22 4>;
	clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
	clock-names = "pclk", "hclk", "tx_clk";
	#address-cells = <1>;
	#size-cells = <0>;
};

status="okay"に変更。
phy-modeを設定しているのは、pcw.dtsiにある。

&gem0 {
	phy-mode = "rgmii-id";
	status = "okay";
	xlnx,ptp-enet-clock = <0x6750918>;
};

ここはどうやらgem0本体と最終的に中身がマージされる。

あとはmdioの設定があるべきでそれは
system-top.dtsに置く?

mdio  {
	compatible= "cdns,macb-mdio";
	reg= <0xe000b000 0x1000>;
	clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
	clock-names = "pclk", "hclk", "tx_clk";
	#address-cells = <1>;
	#size-cells = <0>;
	eth_phy0:phy@1 {
		compatible = "realtek,RTL8211E";
		device_type = "ethernet-phy";
		reg = <0x1>;
	};
};

これを追加して(cpuなどと同じ階層)みたところ、なんかうまくいった。
compatibleの値はプローブされるときに必要になる気がしているが
それが違うということはなんかドライバが別なのだろうか・・?

bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1";
も忘れないようにする。

Ubuntu ipv6の無効化

ここから先はUbuntuの設定

$ sudo ip link set eth0 up

をすると、NICが起きる(?)。
qiita.com
これをすれば無効にはなった。

ipv4 dhcp

なぜかipv4が降ってこなくて、ネットに繋がらなかった。
エトセ・ネットワーク・インターフェースはもういらないらしく、代わりにnetplanなるもので設定するらしい。
websiteforstudents.com

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
 version: 2
 renderer: networkd
 ethernets:
     eth0:
     dhcp4: yes

コマンドによって適用されるが、文法チェックを行ってくれるので安心。

sudo netplan apply

これでipv4が降ってきてpingが通った。
もしかしたら、
/etc/systemd/network/25-eth0.network

[Match]
Name=eth0

[Network]
DHCP=ipv4

が追加で必要かもしれない。

Rust レイトレーシング ④ 球体


sphereとshape_opを追加した。

shpereは色を持つ。ついでにColorにnewメンバ関数を追加ておく。


光が当たったところを記録する。hit関数によって返される。当たった点pと法線ベクトルnと光源からの距離t。


後々のためにHIT Traitを定義。「HIT Traitを実装しているものを引数にとる。」のようにできる。
hitはhitヒットしていないかもしれないので、Option型で返す。
rustbyexample.com
ダメそうだったらNoneを返す。


HIT Traitの実装。球と直線が交わるか計算。
使わない引数・変数は _hogeとするか、そのものを_にするかしないと、コンパイラから警告がでる。


matchを使うことで、Optionで帰ってくるものを綺麗に書ける。いちいちboolを返してtrueなら~という二度手間感がない。



球を追加する。

実行結果。
f:id:katakanan:20180130105946p:plain:w300
f:id:katakanan:20180130110736p:plain
よさそう。


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

EZ-USB FX2 Bulkloop ③

e-tipsmemo.hatenablog.com


BulkloopのTD_pollを見ていく。

BulkloopではPCからinのEPに送られてきたデータをoutのEPからPCに送り返すものであった(はず)

読み取り先のEPのステータスをチェックして


書き込み先のEPのステータスをチェックする。

EPのバッファー間でコピーする方法として、AUTOPTRを利用している。
EPのFIFOの先頭アドレスを、読み込み書き込みするたびにさしているアドレスがインクリメントされる、AUTOPTRセットしてforで回している。

互換性保持のために冗長にしている?
16bitなので

EP8のバッファのカウンタをコピーしたサイズ値にする

EP4BCLの8bit目はSKIPビットというもので
p93による。

Rust レイトレーシング ③ マルチスレッド

e-tipsmemo.hatenablog.com

続き。

見通しをよくするためにcolor構造体を利用することにした。

各色は0.0~1.0しか取らないので適当にclampしてやる必要があるのでそういった細かい関数は

へ書くことにした。



色は基本的にシーン内で計算することにした。



マルチスレッドになっているものを可変にする。
実行時引数を利用する。


それほど難しいことはなく、以下を参考にすればよい。
rustbyexample.com

ついでに時間を測り始めた。

time crateが必要。
Rust multithread 実行時間測定 - e-tipsmemo

cargoで引数を渡すには--を付ける。

$ cargo run -- 1
    Finished dev [unoptimized + debuginfo] target(s) in 0.26 secs
     Running `target/debug/rust_ray01 1`
Hello, world!
thread:1
time:5031427000 ns
$
$ cargo run -- 3
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/rust_ray01 3`
Hello, world!
thread:3
time:1781288000 ns

速くなっている。。?

結果は変わらない。
f:id:katakanan:20180121110300p:plain:w300


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

EZ-USB FX2 Bulkloop ②

e-tipsmemo.hatenablog.com

の続き。


CPUのクロックを48MHzに設定
http://www.cypress.com/file/126446/download
p83にクロックツリーの・ようなものがある。

The slave FIFO interface can be clocked from either an
internal or an external source. The EZ-USB’s internal clock
source can be configured to run at either 30 or 48 MHz, and
it can optionally be output on the interface clock (IFCLK) pin.
If the EZ-USB is configured to use an external clock source,
the IFCLK pin can be driven at any frequency between 5
MHz and 48 MHz. On a hard reset, the EZ-USB defaults to
the internal source at 48 MHz, normal polarity, with the
IFCLK output disabled. See Figure 9-6

IFCONFIGの8bit目はリセット時に1なので以下のようなクロックとなる。外部のロジックはIFCLK(かIFCLKの反転したもの)と同期して動かす。
f:id:katakanan:20180114143435p:plain

f:id:katakanan:20180103104645p:plain
この設定のいずれかになるように設定する。バッファのサイズが足りない場合は無視される。
EPを設定する場合は使うものから設定する
Config 11ならEP2(enable, size:1024 :Buf:3)->EP8(enable, size:512, Buf:2)->EP4(disable)->EP6(disable)
各設定の間にはレジスタに値が設定されるまで待つためのクロックサイクルが必要なので
SYNCDELAYを入れる。

AUTOPTRとは

■Set APTRnINC=0 to freeze the address pointer, APTRnINC=1 to automatically increment it for every read or write of an XAUTODATn register. This bit defaults to ‘1’, enabling the auto increment feature.
■To enable the autopointer, set APTREN=1. Enabling the Autopointers has one side-effect: any code access (an instruction
fetch, for instance) from addresses 0xE67B and 0xE67C return the AUTODATA values, rather than the code-memory values at these two addresses. This introduces a two-byte ‘hole’ in the code memory.

XAUTODATnを読んでいくとアドレスをインクリメントしてくれる機能らしい。

SlaveFIFOで使うならクロックの設定とEPの設定以外変更の必要はなさそう。(EPの設定もデフォルトで十分かもしれない)

Rust レイトレーシング ② レイを飛ばす

e-tipsmemo.hatenablog.com


前回は画像を表示することが可能になったのでRayを飛ばす。
必要なものはカメラとスクリーンとそれらをまとめるシーンとレイ

レイトレーシングをいろいろと検索すると何故かz軸正の方向から原点を見下ろすシーンが多いようだが理由がよくわからない。
なので今回はカメラをどの位置においても良いように書いた。

座標・方向・右手方向・fov
Vector3やPoint3の型をTとしてジェネリックに書くこともできるが、
今回はシンプルにするためにとりあえずf64で行う。

デフォルトコンストラクタなどはないので自分でそれ用のメソッドを実装する。
(たいていnewという名前で実装してあったりする。)
カメラ位置と見ている点からカメラを決定するようにした。



スクリーンはカメラの視線と直行していてほしいので角度を求めてその分だけ傾ける。
f:id:katakanan:20180113233357p:plain
Rotation3で指定したベクトルを軸として、thetaだけ回転する回転行列を計算でき、それをz軸正方向ベクトルに掛けることで
スクリーンの3次元空間中でのyベクトルを求める。xベクトルはカメラの視線とyの外積をとった。(rightと平行でもある)

nalgebraのdocument
nalgebra

fovはググればたくさん説明があるので省略。
スクリーンとカメラの距離が1であることを前提にしている。


それらをまとめるシーンと指定されたスクリーン上の座標からレイを求める関数。


特筆すべきことはない。

同じscene構造体を複数のスレッド間で共有するためには

のArcが必要


宣言時にArcポインタ?でくくって
スレッド引数時にcloneする。
(よってArcによって共有されるオブジェクトはClone Traitを実装していなければならない(ような気がする))

レイを飛ばす部分

projectionはRayをスクリーンへ投影したときのu,v座標を得る関数で結局tはvと同じである。
v座標の割合によってグラデーションさせた(lerp関数)色を書き込みreturnする。

結果は以下のようになった。
スレッド数を複数にしても同じである。

f:id:katakanan:20180114103130p:plain:w300

Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

Rustでレイトレーシング 1.5 画像出力

e-tipsmemo.hatenablog.com

の補足。

後々にレイトレーシングをマルチスレッド化していこうと思っているので
まずは画像出力をマルチスレッド化した。

階層はこのような感じ
f:id:katakanan:20180105233635p:plain
実行結果は以下の様になる
f:id:katakanan:20180105002231p:plain:w300
上から3つのスレッドがそれぞれ画素を計算している事がわかる。

最終的なイメージも渡してmutexのlockをして各スレッドから一枚絵を作る方法もあるが、
とりあえず今回の方向性では採用しないことにした。

画像の分割は縦のピクセルを等分して余った分は最後に含めているので
スレッド数が7のときは
画像サイズが
800x85が6個と800x90を1個計算して
最後にまとめる。

Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development