月別アーカイブ: 2016年2月

オフセットホルダー45で視界確保

久し振りにGROMのカスタマイズの話題です。

冬場は厚手のライディングジャケットを羽織る訳ですが、そうするとバックミラーに腕〜肩が映ってしまって後方が確認し辛くなります。ステーやミラーの角度を調整して何とかしようとしましたが、何ともなりませんでした。そこでTANAXのオフセットホルダーを取り付けることにしました。

取り付けは簡単で、まずミラーとその下のアダプタ(スペーサ)を外し、オフセットホルダーにアダプタとミラーを仮止めしてからオフセットホルダーをハンドルに取り付けます。右側はスロットルケーブルがあるために真横に出せませんので、干渉しないよう斜め前方にホルダーを向けて固定し、アダプタとミラーも固定します。左側も同様に斜め前方に出しておきます。

前方と左右にそれぞれ3cm程度ミラーの位置が出ただけですが、全然違います。後方視界がかなり開けました。逆に、これまでよくあんな状態でバイクに載っていたのかと思うと、今更ながら怖い思いがしてきます。

ZyboをTutorialで試す 番外編3 Debian起動

前回作成したmicroSDからDebianを起動します。

  1. J4にmicroSDを挿入
  2. JP5を "SD" に変更
  3. J11にmicroUSBケーブルを接続、もう片方の端をPCに接続
  4. J3にLANケーブルを接続
  5. J15に5V 3AのACアダプタを接続
  6. SW4で電源ON
  7. PCでTera Term等を立ち上げ、COMポートを指定して接続
  8. ブートメッセージが表示され、rootユーザで自動ログインすることを確認

となれば成功です。COMポート番号はWindowsのデバイスマネージャで確認できます。ifconfigコマンドを見るとDHCPからIPアドレスを取得できていることが分かります。

ただ、このまま使うにはいくつか課題が残っています;

  • 起動時の立ち上げに失敗しているデーモンがあるっぽい
    • acpidの起動後、一時的にメッセージが文字化けを起こしてた?
  • 時計が狂っている (要NTPクライアント)
  • /etc/resolv.confがない
  • rootユーザで自動ログインしたくない

/etc/resolv.confについては(乱暴ですが)手動でnameserver 8.8.8.8とか設定してしまえば解決します。DNSが引けるようになったらapt-getで最新のパッケージに更新できます。まずはNTPクライアント(ntpdate等)を入れておきましょう。不要なデーモンはパッケージごと削除してよいと思います。その次に日本語化でしょうか。この辺の作業はまた別途整理します。

ZyboをTutorialで試す 番外編2 microSDの作成

前回の続きです。チュートリアルはまだこの先がありますが、ここから脱線します。チュートリアルではram diskを使うようにしていますが、microSDのパーティションを切って、Debianを入れてみようと思います。

参考にするのは、今回もFPGAの部屋です。

まずmicroSDカードを用意します。class 10で8GBもあれば十分だと思いますが、32GBのが手元にあったのでこれを使います。gpartedやcfdisk等を使って、ブート用の基本パーティションに1GB割り当て、残りをrootfs用の基本パーティションに割り当てました。私の環境ではそれぞれ/dev/sdb1と/dev/sdb2になりました。

ブート用のパーティションはWindowsからも読み書きできる必要があるのでFAT32、rootfsはLinuxから読めれば問題ないのでext4でフォーマットします。ラベルは前者をZYBO_BOOT, 後者をrootfsとしました。

これまでの作業で作成済みのuImageBOOT.binをZYBO_BOOTパーティションにコピーします。

Linux KernelソースのあるLinux-Digilent-Devの下、arch/arm/boot/dtsにあるデバイスツリーのソースファイルzynq-zybo.dtsを修正します。bootargsはLinuxブート時のカーネルオプション、operating-pointsは動作周波数とコア電圧の組み合わせだそうで、この値を修正しない時計が狂うとのこと。修正が済んだらscripts/dtc/dtcコマンドで変換します。

$ cd arm/boot/dts
$ cp zynq-zybo.dts zynq-zybo.dts.orig
$ vi zynq-zybo.dts
...
 /* bootargs = "console=ttyPS0,115200 root=/dev/ram rw earlyprintk"; 下記のように変更 */
 bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfs=ext4 rootwait devtmpfs.mount-1";
...
 /* operating-points = <666667 1000000 333334 1000000 222223 1000000>; 下記のように変更 */
 operating-points = <650000 1000000>;
...
$ ../../../../scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts

生成されたdevicetree.dtbはmicroSDのZYBO_BOOTパーティションにコピーします。さらに、u-bootの設定ファイルuEnv.txtを作成します。

$ vi uEnv.txt
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

これもmicroSDのZYBO_BOOTパーティションにコピーします。この時点でZYBO_BOOTパーティションには以下のファイルが配置されているはずです;

  • BOOT.bin
  • uImage
  • devicetree.dtd
  • uEnv.txt

以上でブートのための準備は完了です。次にrootfsを用意します。rootfsには選択肢がいくつかあります;

  • どこの配布物を使うか? Linaro / ARMhf / etc...
  • どのディストリビューションにするか? Debian / Ubuntu / etc...
  • どのイメージ(パッケージ)を使うか? nano / developer / alip / etc...

今回は、Linaroの配布するDebian 8.3のdeveloperイメージの最新版を利用することにしました。普通にtarで展開するとbinaryディレクトリが生成されるので、これを削除するために "--strip-components=1" を渡します。展開先のmicroSDのrootfsパーティション (ここでは/media/USERNAME/rootfs) は環境に合わせて適宜変更して下さい。

$ wget https://releases.linaro.org/debian/images/developer-armhf/latest/linaro-jessie-developer-20160126-11.tar.gz
$ sudo tar --strip-components=1 -C /media/USERNAME/rootfs -xzvpf linaro-jessie-developer-20160126-11.tar.gz
...

これでmicroSDから起動する準備が完了しました。

ZyboをTutorialで試す その7 uImageの生成

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

ここからまたLinuxに戻り、Linux Kernelをリビルドします。まずはkernel sourceをgit gloneしてきます。ここでもmaster-nextブランチです。また、ほぼ1GBあるので時間が掛かるのでご注意下さい。DLが済んだらmakeしていきます

$ git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git
...
$ cd Linux-Digilent-Dev
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
...
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

ビルドに足りないツールがあった場合はコンパイルエラーになります。私の環境では bc コマンドを追加でインストールしました。Debianであれば事前にkernel-packageを入れておけば無難かも知れません。

$ sudo apt-get update
$ sudo apt-get install bc
...
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

インストール後に再度makeを実行しましょう。私の手元の環境では約20分でビルドが完了しました。ビルドしたイメージは arch/arm/boot/zImage として生成されています。

次にuImageを生成しますが、それにはmkimageコマンドが必要です。mkimageが見つからない場合は、以前u-bootをコンパイルしたディレクトリ内のtoolsディレクトリにPATHを通します (ディレクトリは環境に合わせて適宜変更して下さい)。

$ export PATH=$PATH:~/zynq/u-boot-Digilent-Dev/tools
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

arch/arm/boot/uImageが生成されました。

ZyboをTutorialで試す その6 BOOT.binの生成

続きです。引き続きTutorialFPGAの部屋を参考にします。

ここからまたWindowsに戻ります。Vivadoでzybo_bsd.xprを開きます。FileメニューからExport→Export Hardwareを選択するとExport Hardwareダイアログが表示されます。Include bitstreamにチェックを入れてOKをクリックします。

続いてFileメニューからLaunch SDKを選択します。Launch SDKダイアログが表示されるので、デフォルトのままOKをクリックします。しばし待つとEclipseベースらしきSDKのIDE (GUI)が立ち上がります。セキュリティの確認ダイアログが表示された時はプライベートネットワークのアクセスを許可して下さい。

SDKの真ん中のペインにsystem.hdfが表示されていると思います。Address Mapの一覧にmyLed_0があることが確認できます。

FileメニューからNew→Application Projectと選択すると、Application Projectダイアログが表示されます。Project Nameに "FSBL" と入力し、他の項目はデフォルトのままNextで次へ進みます。Template一覧からZynq_FSBLを選択し、Finishをクリックします。しばらく待つとSDKの真ん中のペインに system.mss タブが追加されます。

さて、ここで、電源on/offの前後でもZyboのMACアドレスが変わならいようにするため、ファイルを一つ差し替えます。Zynq Base Systemのsource/vivado/SDK/fsbl/fsbl_hooks.cを適当なエディタで開いて全体をクリップボードにコピーします。続いてSDKの左側ペインからFSBL→src→fsbl_hooks.cと選択してファイルを開き、全体を選択して丸々ペーストして保存します。

編集後の保存時に自動でリビルドされますが、気になるようであればProjectメニューからClean...を選択し、表示されたダイアログのOKをクリックするとクリーン後に自動ビルドされます。ビルドされたファイルは source\vivado\hw\zybo_bsd\zybo_bsd.sdk\FSBL\Debug\FSBL.elf として出力されています。

SDK左側ペインのProject ExplorerからFSBLを右クリックし、Create Boot Imageを選択すると、Create Zynq Boot Imageダイアログが表示されます。Boot image partitions一覧にデフォルトでFSBL.elfとsystem_wrapper.bitは入っていますので、右側のAddボタンでAdd partitionダイアログを開き、LinuxでビルドしてWindowsにコピーしてきたu-boot.elfを選択します。Partition Typeが(デフォルトの)datafileになっていることを確認してOKでダイアログを閉じ、Boot image partitions一覧にu-boot.elfが追加されたことを確認します。

Output pathのBrowseボタンをクリックして出力先をZybo Base Systemのsd_image/BOOT.binに変更し、"Create Image"ボタンでBOOT.binを生成します。

ZyboをTutorialで試す その5 U-Bootのビルド

前々回の続きです。引き続きTutorialFPGAの部屋を参考にします。

LinuxへのSDKのインストールが完了したら、環境変数の設定をしておきます。SDKを使う都度、設定してもよいのですが、 面倒なので ~/.bashrc の末尾に追記しておきます。

$ vi ~/.bashrc
...
source /opt/Xilinx/SDK/2015.4/settings64.sh

2016/02/08追記: この設定を行うと、LD_LIBRARY_PATHも変更されます。その影響で、apt-get等の一部のコマンド実行時にリンカのエラーが表示されるようになります。ご注意下さい。

続いて、ビルドに必要なコマンド, パッケージ類をインストールしましょう。ビルドに必要なmakeの他に、64bit環境で32bitアプリを動かすためのライブラリも必要です (SDK同梱のバイナリは64bit版ではなく32bit版のようです)。これをしないと、クロスコンパイラはインストールされてあるのに "no such file or directory" のようなエラーが吐き出されます。

$ sudo apt-get update
$ sudo apt-get install make
...
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6:i386

では、U-Bootのコンパイルを行います。チュートリアルのセクション名にもあるように、master-nextブランチからgit cloneしてくるのがポイントです。

$ git clone -b master-next https://github.com/DigilentInc/u-boot-Digilent-Dev.git
...
$ cd u-boot-Digilent-Dev
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config
...
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
...

特にエラー等が表示されずにmakeが終了されたらu-bootのコンパイルに成功しています。makeを実行したディレクトリ内にu-bootが生成されていると思います。これをZybo Base Systemの中のsd_imageディレクトリに u-boot.elf というファイル名でコピーしておきます。

ZyboをTutorialで試す 番外編1 Vivadoセットアップ(Debian)

番外編(?)です。

前回、ビットストリームを生成できましたので、次はU-Bootのコンパイルなのですが、ここからはLinuxのクロス環境で作業します。Debian testing環境上にVivado WebPACKをインストールしようとしたところ、64bit環境なのが正しく検出されずインストールできません。

これに対応するには、インストーラの起動オプションに--confirmを付けて、展開されたインストールスクリプトを手動で編集する必要があります。詳細はXilinxのフォーラムを参照して下さい。

2016/02/07追記: sudoでrootとしてインストールするとMATEのアプリケーション一覧に登録されないので、sudoを使わず一般ユーザ権限でインストールするように変更しました;

$ chmod +x ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin
$ sudo chmod 777 /opt
$ ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin
...
ERROR: This installation is not supported on 32 bit platforms.
$ ./Xilinx_Vivado_SDK_2015.4_1118_2_Lin64.bin --confirm
...
About to extract 19 KB in /tmp/xxxxxxxxxx ... Proceed ? [Y/n]
...
OK to execute: ./xsetup   ? [Y/n]

最初の確認メッセージで、インストーラの展開先が分かります。二つ目の確認メッセージでエンターを押して先に進める前に、別のターミナルを開くあるいはCtrl-Zでインストーラを中断して、インストールスクリプトを編集します。

$ vi /tmp/xxxxxxxxxx/xsetup
...
# ERROR out if this installation is running on 32 bit OS
# and does not support 32 bit installation
if [ "$(uname -m)" != "x86_64" ]; then
...

unameコマンドのオプションを -i から -m に変更して保存し、インストーラに戻ってxsetupを実行します。インストーラを進めていくと、インストールするコンポーネントの選択画面が表示されます。どうやらデフォルトでは "Software Development Kit" (SDK)が選択されていませんので、これにチェックを忘れず入れて、インストールを進めましょう。

続きを読む

ZyboをTutorialで試す その4 ビットストリームの生成

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

zybo_bsd.xprを開いているVivadoの画面に戻り、"Flow Navigator"の"IP Integrator"から"Open Block Design"を選択してダイアグラムを開きます。適当に空いている箇所を右クリックして"Add IP..."を選択するとダイアログが表示されます。検索窓に"my"と入力すると、先ほど作成したmyLed_v1.0が表示されますのでこれを選択し、エンターを押すとダイアグラム上にmyLed_0が追加されます。

先の手順でLEDを削除したあたりにドラッグします。チュートリアルでは "Run connection automation" が表示されるとありますが、表示されませんので、"myLed_0"の"S_AXI"を右クリックして"Make Connection..."を選択します。表示されたダイアログで "M00_AXI" を選択して"OK"をクリックすると、ダイアログ上でも結線されます。

"myLed_0"の"s_axi_aclk"と"s_axi_aresetn"も結線します。ダイアログ上の"myLed_0"のそれぞれから出ている横線の上にカーソルを移動すると鉛筆アイコンになるので、その状態でそれぞれ他のIPのaclkとaresetnが接続されている配線までドラッグして結線します。

ダイアグラム上に残っている"LEDs_4Bits"を右クリック→"Delete"で削除します。

"myLed_0"の"led[3:0]"を右クリックし、"Create Port..."を選択します。デフォルトの入力値のまま"OK"をクリックするとダイアグラムに"led[3:0]"というポートが作成され、"myLed_0"の同名のポートに自動的に接続されます。

※ここの記述はチュートリアルにはありません。この時点で、"myLed_0"にアドレスが割り当てられていないそうです。ダイアグラムのペインの"Address Editor"タブを開いてみますと、確かに"Unmapped Slaves"に表示されています。この"myLed_0"を右クリックして "Auto Assign Address" を選択すると自動でアドレスが割り当てられ、割り当て完了のダイアログが表示されますので"OK"で閉じます。

ここで一旦保存します。

続いて、"Sources"ペインの"Sources"タブを選択して"Constraints"→"constrs_1"→"base.xdc (target)"と選択してbase.xdcをダブルクリックして開きます。右側のペインにソースコードが表示されますので、7行目から11行目の"leds_4bits_tri_o"を"led"に置換します。

set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
set_property PACKAGE_PIN G14 [get_ports {led[2]}]
set_property PACKAGE_PIN D18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

編集を終えたら保存し、ビットストリームを生成します。"Flow Navigation"ペインの"Program and Debug"にある"Generate Bitstream"を選択します。"No Implementation Results Available"ダイアログが表示されますので"Yes"を選択すると、"Generate Bitstream"ダイアログが表示されてビットストリームの生成が始まります。

少し待つと"Launch Run Critical Messages"ダイアログが表示されますが、気にせず"OK"で閉じます。ここからしばらく時間が掛かります。動いているか分からないと不安な時は、下部ペインの"Log"タブを開いてログを眺めてみましょう。

ビットストリームの生成に成功すると、"Bitstream Generation Completed"ダイアログが表示されます。"Open Implemented Design"にチェックを入れて"OK"をクリックして内容を確認してみます。

ZyboをTutorialで試す その3 IPコアの作成2

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

edit_myLed_v1_0プロジェクトを開いた状態で Sourcesペインで myLed_v1_0_S_AXI_inst - myLed_v1_0_S-AXI (myLed_v1_0_S_AXI.v) をダブルクリックするとエディタで、myLed_v1_0_S_AXI.vが開かれます。

18行目の "// Users to add ports here" に続けて "output wire [3:0] led, "を追記します。

 // Users to add ports here
 output wire [3:0] led, // 追記
 // User ports ends

393行目の "// Add user logic here" に続けて assign led = slv_reg0[3:0]; を追記します。

 // Add user logic here
 assign led = slv_reg0[3:0]; // 追記
 // User logic ends

上記の編集が終わったら、次はSourcesペインの myLed_v1_0 (myLed_v1_0.v) をダブルクリックしてエディタで開きます。同様に、18行目に追記します。

 // Users to add ports here
 output wire [3:0] led, // 追記
 // User ports ends

51行目に ".led(led)," を追記(挿入)します。

 ) myLed_v1_0_S_AXI_inst (
 .led(led), // 追記 (挿入)
 .S_AXI_ACLK(s_axi_aclk),

続いて、"Flow Manager"ペインの"Project Manager"から"Package IP"を選択します。"Packaging Steps"の"Customization Parameters"を選択して、右ペイン最上部に"Merge changes from Customization Parameters Wizard"というリンクが表示されますので、これをクリックしておきます。"Pack"Ports and Interfaces"を選択して右ペインに"led"があることを確認し、"Customization GUI"を選択して右ペインに今回作成中のIPのGUIが表示されることを確認します。

最後に"Review and Package"を選択します。右ペイン最下部の"Re-Package IP"ボタンを押してIPを作成します。"Finished packaging 'myLed_v1.0' successfully' というダイアログが出たらIPの作成に成功です。"OK"をクリックしてダイアログを閉じます。

ZyboをTutorialで試す その2 IPコアの作成1

前回の続きです。引き続きTutorialFPGAの部屋を参考にします。

Vivadoでzybo_bsd.xprを開いたら、左側の "Flow Navigator" ペインから "IP Integrator" の"Open Block Design" を選択して "Dialog" ペインを開きます。ダイアログを拡大表示し、"LEDs_4Bits" を選択して右クリック→Deleteでダイアログから削除します。

Toolsメニューの "Create and Package IP..." を選択すると "Create and Package New IP" ダイアログが表示されます。"Next" をクリックし、"Create AXI4 Peripheral" にチェックを入れて "Next" で "Peripheral Details" が表示されます。"Name" に "myLed" 等を入力して詳細設定を入力して "Next" で "Add Interfaces" になります。"Name" を "S00_AXI" から "S_AXI" に変更し、"Next" で "Create Peripheral" になります。

"Next Steps" から "Edit IP" を選択し、"Finish" で "Create and Package New IP" ダイアログが閉じます。"Create Peripheral IP" ダイアログが開いて閉じると、edit_myLed_v1_0 プロジェクトが開かれます。"Package IP - myLed" ペインがハイライトされています。