Jetson Nano インストール中 (Yocto ver.)

jetson nanoに、yoctoを導入するhow-toの記事がないので、書いてみました。

# bitbakeするまで

## sourceのダウンロード

- poky (https://git.yoctoproject.org/git/poky)
- ~~meta-tegra (https://github.com/madisongh/meta-tegra)~~
- meta-tegra (https://github.com/OE4T/meta-tegra)
- ~~meta-linaro (https://git.linaro.org/openembedded/meta-linaro.git)~~
- meta-arm (https://github.com/jonmason/meta-arm.git)
- meta-openembedded (https://git.openembedded.org/meta-openembedded)

この2つと、nvidia developperからbspをダウンロードします。
これがないと、bitbakeがエラーですすみません。

それぞれのフォルダにて、気になるバージョンに揃えること。たとえば、dunfellを利用するなら、dunfellに揃える。poky/meta-tegra/meta-armsそれぞれで実行。

```
$ git checkout -b dunfell origin/dunfell
```

TegraのBSPは、ここからダウンロード (R32.3.1) (ログインが必要かも)
https://developer.nvidia.com/l4t-3231-archive
もしくは、sdkmanagerを利用してダウンロード


## 環境設定

### bblayer.conf

```
BBLAYERS ?= " \
  /home/ubuntu/xxx/yocto/poky/meta \
  /home/ubuntu/xxx/yocto/poky/meta-poky \
  /home/ubuntu/xxx/yocto/poky/meta-yocto-bsp \
  /home/ubuntu/xxx/yocto/poky/meta-arm/meta-arm-toolchain \
  /home/ubuntu/xxx/yocto/poky/meta-tegra \
  "
```

ここでは、poky指定のものに加えて、tegraとlinaroを追加しています。
linaroを追加したのは、[ここの記事](https://github.com/madisongh/meta-tegra/wiki/Using-linaro-gcc7-for-CUDA-support)に基づいて、gcc7.xでビルドするためです。
https://github.com/madisongh/meta-tegra/wiki/Using-linaro-gcc7-for-CUDA-support


### local.conf

最後に、以下を追記

```
MACHINE = "jetson-nano-devkit"
LICENSE_FLAGS_ACCEPTED = "commercial"
GCCVERSION = "7.%"
require contrib/conf/include/gcc-compat.conf
CUDA_VERSION = "10.0"
NVIDIA_DEVNET_MIRROR = "file:///home/ubuntu/xxx/nvidia/downloads"

CORE_IMAGE_EXTRA_INSTALL += " openssh "
PACKAGE_EXCLUDE += " packagegroup-core-ssh-dropbear " <-- core-image-satoにおいてdropbearとopensshとのconflictを回避するために必要

TEGRAFLASH_SDCARD_SIZE = "2G" 
IMAGE_OVERHEAD_FACTOR = "1.0"
IMAGE_CLASSES += " image_types_tegra "
IMAGE_FSTYPES = "tegraflash"
```

NVIDIA_DEVNET_MIRRORに、sdkmanagerを利用して、nvidiaからダウンロードした一式(debだらけ)があるフォルダを指定します。うちの環境は、nvidia/downloadsに落としたので、そこを指定しました。

**解説**

**TEGRAFLASH_SDCARD_SIZE**: デフォルトは、16Gです。大きくしたければ大きな数字、小さくしたければ、小さい数字を入れます。サイズが大きくなると、dd時間がかかるなど、弊害が出ます
**IMAGE_ROOTFS_SIZE**: 教科書には、ファイルサイズを司ると書かれていますが、TEGRAFLASH_SDCARD_SIZEが優先される模様。したがって、指定せず。
**IMAGE_OVERHEAD_FACTOR**: 空きスペースの指定。
**MACHINE**: meta-tegra/conf/machine 配下にある(machine名).confのmachine名を設定する。ここにあるファイル名と異なるとsanity checkでエラーではじかれる。


### bitbake.conf

fmacro-prefix-mapがあると、ビルドが通らないので、削除。

```poky/meta/conf/bitbake.conf
# GCC 7 doesn't support fmacro-prefix-map, results in "error: cannot compute suffix of object files: cannot compile"
# Change the value from bitbake.conf DEBUG_PREFIX_MAP to remove -fmacro-prefix-map
DEBUG_PREFIX_MAP = "-fdebug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
                    -fdebug-prefix-map=${STAGING_DIR_HOST}= \
                    -fdebug-prefix-map=${STAGING_DIR_NATIVE}= \
```


## bitbake中

```
$ source poky/oe-init-build-env nano-build
$ bitbake core-image-minimal
```

教科書通り。sourceして、bitbakeです。

## やり直しの手順

```
$ bitbake -c cleanall core-image-minimal
$ rm -Rf tmp/*
$ bitbake core-image-minimal
```

# 試してみよう!!

## SD Cardへの展開
https://github.com/OE4T/meta-tegra/wiki/Flashing-the-Jetson-Dev-Kit
ここに本家のやり方がかかれています。そのままトレースします。

なお、tegraflash.tar.gzに一式詰め込まれているので、ビルドしたPCと書き込むPCは、別々でも大丈夫です。例えば、クラウドでビルドして、ローカルPCで焼く、ということが可能です。

### 必要ツールの展開

build dir -> tmp -> deploy -> images -> jetson-nano-devkit -> *-jetson-nano-devkit.tegraflash.tar.gz を解凍します。

```
$ mkdir ~/tegraflash
$ cd ~/tegraflash
$ tar -x -f $BUILDDIR/tmp/deploy/images/${MACHINE}/<image-type>-${MACHINE}.tegraflash.tar.gz
```

### 書き込みの実行

```
$ sudo ./dosdcard.sh /dev/<sdcard>
```

途中、以下のように聞かれるので、yes/noで答えましょう。

```
About to make an SDcard image on /dev/sdg. OK?
```


## SD Cardへの展開 古い情報 (残しておきます)
いつものおまじないです。gzip形式が多い中、".sdcard"という拡張子のimageファイルです。細工せず、DDします。

```
$ sudo dd if=core-image-minimal-jetson-nano.sdcard of=/dev/sdx bs=4M conv=fsync status=progress
```

なお、デフォルトでは、17GBあるので、32Gのmicro SDカードが必要です。
上記の設定は、2Gにしたので、適当なサイズのSDカードでOKです。


## 起動

SD CardをJetson Nanoに装着し、起動。
ID: root, PW:なし

```
root@jetson-nano:~# cat /proc/version
Linux version 4.9.140-l4t-r32.2.1+g7467bde43b5d (oe-user@oe-host) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11) ) #1 SMP PREEMPT xxx Oct xx xx:xx:xx UTC 2019
root@jetson-nano:~# df
Filesystem     1K-blocks   Used Available Use% Mounted on
none             1782740      0   1782740   0% /dev
/dev/mmcblk0p1   1887056 166920   1601352  10% /
tmpfs            2025568    216   2025352   1% /run
tmpfs            2025568    156   2025412   1% /var/volatile
```

## 起動 part2

core-image-satoも作ったので、起動してみた。
なお、TEGRAFLASH_SDCARD_SIZE ?= "2G"では、起動せず。4Gにしても、92%の使用率でした。

起動画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/cc77e8cc-5484-c627-47fd-c81c9c92e983.png)

メニュー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/b1ab836b-8bc9-d217-4803-f2019023d08a.png)


おしまい