思いつきメモ Linux
ZYBOのSDカードブート
引き続き、SDカードからのLinuxブートを試してみた。
Digilentのu-bootのxilinx-v2013.4をチェックアウトしたものでは、ZYBOのu-bootはSD起動にジャンパ設定されていると、SDカード内にuImage, devicetree.dtb, uramdisk.image.gzというファイルを探して、それをメモリに展開、Linuxをブートしてくれるようになっている(printenvで確認可能)。
したがって、BOOT.binにはカーネルやramdisk, devicetreeは必要ではなくて、FSBLと(必要であれば)FPGAのbitstream, u-bootだけが入っていればよい。BOOT.binの作り方については、基本的にこちらに記載されている方法に従えばよい。
以上でSDカードからのブートが出来るようになった。
ZYBOでLinux (使用メモリを制限)
Zynq上でPLにロジックを自作してDMA処理を行う場合、アプリケーションからレジスタを操作するために最も手軽 なのは、以前書いたとおり UIOを使用することだと思う。
このような場合、ロジックで使用するメモリ領域はLinuxが使用する領域と完全に分けておいた方が (少なくとも自分のような初心者には)楽だ。このためには、実装されているメモリより少ない領域を 使用するようにLinuxを構成しないといけない。
今回は、ZYBOで512MB実装されているところを256MBだけLinuxに割り当てた。しかし、結構これにはまった。 やり方は、以前の通りXilinx純正gitをcloneしてxilinx-v2014.1をcheckout。zynq-zed.dtsを編集し、 ps-clk-frequencyを変更するまでは同じ。bootargsを
console=ttyPS0,115200 root=/dev/ram rw earlyprintk
となっているのを、
console=ttyPS0,115200 mem=256M root=/dev/ram rw earlyprintk
とする。また、ps7_ddr_0: memory@0をreg = <0x0 0x20000000="">;からreg ...
more…ZynqのPLを操作するLinuxドライバ (ユーザプログラム編)
ZynqのPLを操作するLinuxドライバ (DTS設定編)の続き。これは見た方が早いと思うので、コードを示す。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <errno.h>
int main()
{
int uiofd;
int err;
int i;
unsigned icount;
unsigned int* map_addr;
unsigned int cnt;
unsigned int ...
ZynqのPLを操作するLinuxドライバ (DTS設定編)
LinuxにおいてZynqのPL部に作成したレジスタを操作するための方法について調査したところ、カーネルドライバを作成する以外に、UIOという枠組みを使用することで簡易に行うことができるということが分かった。これを使用すると、ユーザプログラムでレジスタの読み書きだけではなく、割り込みの検出も行うことが出来る。
まず、カーネルコンフィグにおいてUIOを有効にしてビルドする必要がある。
CONFIG_UIO=y
CONFIG_UIO_PDRV_GENIRQ=y
あたりが最低限必要と思われる。(自分の場合は元から有効になっていたので、カーネルの再ビルドは不要だった。)
次に、デバイスツリーに次のような記述を追加する。自分の場合では、arch/arm/boot/dts/zynq-zed.dtsのamba@0ノードの一番下に追加した。
foo_bar_device: foo-bar-device@44000000 {
compatible = "generic-uio";
reg = < 0x44000000 0x4000 >;
interrupts = < 0 29 4 >;
interrupt-parent = <&ps7_scugic_0>;
};
まず、compatibleでgeneric-uioと記述する。これが、あらかじめ用意されているカーネル側のUIOドライバを使用するための文字列。こうすることで、drivers/uio/uio_pdrv_genirq.cが使用される。
次に、regにおける ...
Zynq上でのLinuxアプリケーションのデバッグ方法
やっとZYBO上でLinuxが(Ethernetも含めて)動作するようになった。これについては別の記事でまとめることにするが、一番気になっていたのは、LinuxアプリケーションのデバッグがXilinxのSDKから簡単に可能かどうかだった。
現在(2014.1)のSDKにはGDB, System Debuggerという2種類のデバッグ方法が用意されている。GDBでのデバッグは可能だったが、System Debuggerでは出来なかった。こちらのビデオによると、System DebuggerでLinuxアプリケーションをデバッグしている。スレッド単位でブレークを掛けたりすることもできる様子で、なかなか強力だと思う。
一方、System Debugger Limitations, Known Issues, and FAQsによると、2013.4の時点ではSystem DebuggerでのLinuxアプリケーションのデバッグはできないように思われる。2014.1については情報は見つからなかった。
上記のビデオでは実現できていることからすると、これが可能になったのはごく最近のことであると思われる。ビデオをよく見てみると、Yocto Linuxが起動しているのが分かる。また、TCF(System Debuggerが使用するフレームワークの仕様)のためのagentが最後の方で起動しているのも分かる。
とりあえず自分の要件としてはGDBでも良いが、System Debuggerについても時間があるときに調査してみたい。
また ...
Linux on Zynq (ZYBO)
今度はZYBOにてLinuxを動作させてみようと挑戦した備忘録。
まとまった情報がなかなか見つからなくて苦労したが、基本はMasahiro Yamadaさんの、"U-Boot と Linux Kernel のメインラインで Zynq を動かす"を参考にした。
STEP0: DTCの準備 はそのまま実施した。
STEP1: U-Bootのビルド ではまった。結論としては、ARMのクロスコンパイラとしてCodeSourcery Liteを使用した(単にXilinxからgccをダウンロードするのが面倒だったので。Xilinxのgccで動くかは試していないため不明)。
最初はLinaroのGCCでU-Bootをビルドしていたが、どうしても動作しなかった。U-Bootはlibcにも依存しているようで、LinaroのGCCだとダメだと思われる。
さらに、肝心のU-Bootは、オリジナルのものだと動かなかったので、DigilentのU-Bootを使用した。この手順は、Ryuzさんの"ZYBO(Zynq)のu-bootのビルドまで"に従った。CROSS_COMPILEのところは、(CodeSourceryなので)arm-none-eabi-にした。makeでu-boot.binができた(上記手順だとDTBはできないが、Linuxのブートは可能)。
STEP2 ...
OpenSolaris -> Ubuntu Linux
これまでメインのデータストレージはVM上のOpenSolaris 2009.6のZFSファイルシステムであったが、Solarisの今後を考えると少し不安なので(FreeBSD+ZFSという手もあるが)、Ubuntu Linux 10.04LTS上のLVM2+ext4に移行した。ZFSの先進性からすると、ファイルストレージとしては後退した感はあるが、いろいろなオープンソースソフトウェアは、なんだかんだいってLinuxが主なターゲットになっているのが現実であるので、メリットもある。
btrfsは安定性を考慮して、今のところ見送り。FreeBSD+ZFSもメモリを食うという情報が多かったので見送り。
なかなか現状オープンソースで満足のゆく解はなさそうだ。