ベアメタルアプリのコンパイル環境を構築する手順のメモです。コンパイル環境は、既存のサンプルをベースに作成しました。参考にしたサンプルはこちらのものです。
http://www.altera.com/literature/an/cv_boot_guide.zip
readmeを読むと、Altera Cyclone V SoC Development Boardをターゲットとしたサンプルのようですが、DE0-Nano-SoCでも動作しました。具体的な構築手順は次のとおりです。コンパイル環境の構築には、SoC EDSのインストールが必要です。DS-5は利用していません。
コンパイル環境の構築手順
サンプル環境の準備
まずcv_boot_guide.zipを解凍します。次に、sourceディレクトリに格納されているAltera-SoCFPGA-HardwareLib-Unhosted-CV-GNU.tar.gzを適当なディレクトリに解凍します。解凍すると、次のようなファイルが生成されます。
このサンプルは、DS-5にインポートして利用するように作成されていますが、今回はDS-5を利用していません。
Makefileの修正
Quartus II 15.0の環境でコンパイルを行うと、エラーが発生するのでMakefileを修正します。
CFLAGS := -g -O0 -Wall -Werror -std=c99 $(MULTILIBFLAGS) -I$(HWLIBS_ROOT)/include # 次の3行を追加 ALT_DEVICE_FAMILY = soc_cv_av CFLAGS += -I$(HWLIBS_ROOT)/include/${ALT_DEVICE_FAMILY} CFLAGS += -D${ALT_DEVICE_FAMILY} # ここまで LDFLAGS := -T$(LINKER_SCRIPT) $(MULTILIBFLAGS)
コンパイル
Embedded Command Shellを起動します。Embedded Command Shellは、Quartus II(SoC EDS)のインストールディレクトリのembeddedに格納されています。
ディレクトリを変更してmakeを実行します。
arm-altera-eabi-gcc -g -O0 -Wall -Werror -std=c99 -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include/soc_cv_av -Dsoc_cv_av -c hello.c -o hello.o arm-altera-eabi-gcc -g -O0 -Wall -Werror -std=c99 -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include/soc_cv_av -Dsoc_cv_av -c io.c -o io.o arm-altera-eabi-g++ -TcycloneV-dk-ram-modified.ld -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon hello.o io.o -o hello.axf arm-altera-eabi-objcopy -O binary hello.axf hello.bin mkimage -A arm -T standalone -C none -a 0x100040 -e 0 -n "baremetal image" -d he llo.bin hello-mkimage.bin Image Name: baremetal image Created: Fri Jan 22 07:18:01 2016 Image Type: ARM Linux Standalone Program (uncompressed) Data Size: 15720 Bytes = 15.35 kB = 0.01 MB Load Address: 00100040 Entry Point: 00000000
ソースファイルの変更
ソースファイルのmain.cを少し変更してみます。
#include <stdio.h> int main(void) { //printf("Hello World!\r\n"); printf("Hello DE0-Nano-SoC!\r\n"); return 0; }
変更後、再度makeを実行して、hello-mkimage.binを更新します。
動作確認
ブート環境を構築したSDカードにhello-mkimage.binを格納します。ベアメタルアプリは、SDカードのFATパーティションに書き込みます。この例の場合は、Dドライブ直下にhello-mkimage.binを格納するだけです。
ベアメタルアプリの名前がhello-mkimage.binと異なる場合には、一致するようにhello-mkimage.binの名前を変更する必要があります。
SDカードをDE0-Nano-SoCに挿入し、電源をONにするとターミナルに実行ログが表示されます。
cycloneV-dk-ram-modified.ldについて
サンプルのディレクトリにはcycloneV-dk-ram-modified.ldというリンカ用のスクリプトが格納されています。このようなスクリプトは、Quartus II(SoC EDS)のembedded\host_tools\mentor\gnu\arm\baremetal\arm-altera-eabi\libに格納されています。cycloneV-dk-ram-modified.ldは、名前のとおりcycloneV-dk-ram.ldを修正したファイルのようです。修正内容はサンプルディレクトリのreadmeに記載されています。修正内容としては、SDRAMの先頭64BをブートPreloader用としてリザーブしているようです。2つのファイルのdiffをとると、次のような違いがあります。
$ diff cycloneV-dk-ram.ld cycloneV-dk-ram-modified.ld -h 3c3 < * Version: Sourcery CodeBench Lite 2014.11-13 --- > * Version: Sourcery CodeBench Lite 2013.11-67 28c28,29 < ram (rwx) : ORIGIN = 0x100000, LENGTH = 1023M --- > /* Need to have 64bytes available before start of program, to store the mkimage header */ > ram (rwx) : ORIGIN = 0x100000 + 0x40, LENGTH = 1023M - 0x40 91,94d91 < .note.gnu.build-id : ALIGN (4) < { < KEEP (*(.note.gnu.build-id)) < } >ram 261c258 < /* checksum: 1e31d42b79217b9ca44859 */ --- > /* checksum: 107f7843360731655cf27621 */
DS-5でのコンパイルについて
このサンプルのreadmeにはDS-5での実行方法(インポート方法)が記載されていますが、そのままではコンパイル時にエラーが発生しました。具体的には、makeの最後で実行されるmkimageコマンドでnot foundエラーが発生します。単にパスが通っていないだけのエラーなので、少し修正すればDS-5でもコンパイルできそうでした。