DE0-Nano-SoC(Cyclone V SoC(FPGA))でベアメタルチャレンジ(環境構築編)

# はじめに
書いてる人のスペックは非常にポンコツなので恐らく完遂できないけど
完遂できるスペックの人たちがいると信じて書き残すだけのメモ

というか、[ここに書いて有ること](https://rocketboards.org/foswiki/view/Documentation/YoctoDoraBuildWithMetaAltera)を日本語で劣化コピーしてるだけ。

# 概要
DE0-Nano-SoC（SoCFPGA）でベアメタルしたくない？
したいよね。

だから、やってみたことをメモしながら記録していく。

## やること
YoctoプロジェクトのLinuxカーネルをブートできる環境を構築する。

ブートシーケンス
1. ROMからブートローダが読み込まれる
2. ブートローダがUbootを読み込む
3. Ubootがカーネルを読み込む
4. Linuxカーネルが起動して色々出来るようになる

このシーケンスの4番はベアメタルチャレンジしたいので、要らない。
というわけで、Ubootをビルドしてカーネルの代わりに自分の作ったプログラムが起動するようにする

# 開発環境の構築
Ubuntu16.04 LTS上に構築していく。

ディレクトリを作ってその中に入る

```
mkdir ~/crossFPGA
cd ~/crossFPGA
```

リポジトリのアップデートと多分必要なツールのインストール

```
sudo apt-get update
sudo apt-get install -y build-essential libffi-dev gcc-multilib lib32z1 
sudo apt-get install -y lib32ncurses5 lib32bz2-1.0 libssl-dev git socat
sudo apt-get install -y texinfo gawk chrpath gcc git 
```

bitbakeにパスを通す。

```
git clone -b jethro git://git.yoctoproject.org/poky.git
pushd poky
git clone -b jethro git://github.com/kraj/meta-altera.git
git clone -b jethro git://git.linaro.org/openembedded/meta-linaro.git
popd
PATH="$PATH:~/crossFPGA/poky/bitbake/bin/"
```

とりあえず初期化する

``` 
source poky/oe-init-build-env ./build
```

ディレクトリが一つ下がって、buildってディレクトリに入る
上のコマンド打ったら
``` ~/crossFPGA/build/```
がカレントディレクトリになる。
あと以下のようなメッセージが出る

```
### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-toolchain-sdk
    adt-installer
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
```

コレが無事見れたら、CycloneV SoC用の初期値を設定してやる

```
vi conf/bblayers.conf
```

デフォルト値はこんな感じ

```
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/segfo/crossFPGA/poky/meta \
  /home/segfo/crossFPGA/poky/meta-yocto \
  /home/segfo/crossFPGA/poky/meta-yocto-bsp \
  "
BBLAYERS_NON_REMOVABLE ?= " \
  /home/segfo/crossFPGA/poky/meta \
  /home/segfo/crossFPGA/poky/meta-yocto \
  "
```

meta-altera と
meta-linaro/meta-linaro-toolchain を書き足す

```
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/segfo/crossFPGA/poky/meta \
  /home/segfo/crossFPGA/poky/meta-yocto \
  /home/segfo/crossFPGA/poky/meta-yocto-bsp \
  /home/segfo/crossFPGA/poky/meta-altera \
  /home/segfo/crossFPGA/poky/meta-linaro/meta-linaro-toolchain \
  "
BBLAYERS_NON_REMOVABLE ?= " \
  /home/segfo/crossFPGA/poky/meta \
  /home/segfo/crossFPGA/poky/meta-yocto \
  "
```

終わったら閉じて、保存。
更にlocal.confを編集
ここでCyclone V用にlinaroツールチェインの設定をする

```
vi conf/local.conf
```
こうする（追加するだけ。qemux86については特にいじらない）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/cfc9d80f-19d9-e2ad-329f-63b402e1c57d.png)

コピペ用
```
MACHINE = "cyclone5"
```

ASSUME_PROVIDEDなんちゃらをコメントアウト
（自分の環境ではコメントアウト済みだったので何もしてない）

これを
```
ASSUME_PROVIDED += "libsdl-native"
```
こうする

```
#ASSUME_PROVIDED += "libsdl-native"
```

また、この記述も変更する（パッケージ化するときのエラー回避）
```
PACKAGE_CLASSES ?= "package_rpm"
```
rpmからipkへ変更
```
PACKAGE_CLASSES ?= "package_ipk"
```

以下をファイルの最後にペーストして終わり
（ここに書いてある通りにやった：https://github.com/kraj/meta-altera ）
カーネルとファイルシステムのビルドらしいけど、カーネル使わないしなんでもいい

```
PREFERRED_PROVIDER_virtual/kernel = "linux-altera"
PREFERRED_VERSION_linux-altera = "4.3%"
GCCVERSION = "linaro-5.2"
SDKGCCVERSION = "linaro-5.2"
DEFAULTTUNE = "cortexa9hf-neon"
```

コア数の2倍で並列ビルドする為の設定

```
BB_NUMBER_THREADS = '8'
PARALLEL_MAKE = '-j 8'
```

あとは、下記コマンドを叩いて終るまで待つ。長いので寝る前とかご飯食べる前とか。
ていうか今ここやっていて、終わってないからこの先のことはこれからやることになる
(2017/06/17 / 23:00 現在)
```
bitbake virtual/kernel
```

最後に

```
bitbake core-image-minimal
```

以上。何かあったら追記しようと思う。