Linux Kernelクロスコンパイル環境：Host(Debian9)/Target(Raspberry Pi3)の環境構築

# 前書き
GitBookを使用しなくなったため、GitBookに書いていた環境構築手順を転記しました。
この記事で説明する環境は、Raspberry Pi3を用いてLinux Kernel(Device Driver)を
勉強するために構築しています。

# 目次
- Raspberry Pi 公式サイト・ツール
- Raspberry Pi3 HARDWARE仕様
- 開発環境
- Device Driver動作検証用機器
- HOST開発環境構築
- Target開発環境構築(無線設定、周辺機器設定など)
- Raspberry Piの環境構築関連の自作記事

# Raspberry Pi 公式サイト・ツール

| **項目** | URL |
| :--- | :--- |
| 公式サイト | [https://www.raspberrypi.org](https://www.raspberrypi.org) |
| 公式Linux OS | [https://www.raspberrypi.org/downloads/raspberry-pi-desktop/](https://www.raspberrypi.org/downloads/raspberry-pi-desktop/) |
| 公式Linux Kernel | [https://github.com/raspberrypi/linux](https://github.com/raspberrypi/linux) |
| 公式Toolchain | [https://github.com/raspberrypi/tools](https://github.com/raspberrypi/tools) |

# Raspberry Pi3 HARDWARE仕様
詳細は、公式サイト[「RASPBERRY PI HARDWARE」](https://www.raspberrypi.org/documentation/hardware/raspberrypi/README.md)を参照。

| **項目** | **仕様** |
| :--- | :--- |
| 名称\(モデル\) | Raspberry Pi3\(Model B\) |
| SoC | Broadcom BCM2836 |
| CPU\(コア数、周波数\) | ARM Cortex A53\(4コア、1.2GHz\) |
| ARMアーキテクチャ | ARMv8\(64bit\) |
| RAM | 1GB |
| GPU | Broadcom VideoCore Ⅳ |
| 映像入力 | 15ピンMIPIカメラインターフェース\(MIPI CSI-2\) |
| 映像出力 | コンポジットRCA、HDMI1.3/1.4 |
| 音声入力 | I2S |
| 音声出力 | 3.5mmジャック、HDMI、I2S |
| Network | Broadcom BCM43143、IEEE802.11 b/g/n2.4GHz、Bluetooth4.1、BLE |
| Peripheral Interface | GPIO40ピン\(SPI、I2S、UART\) |
| ストレージ | microSD |

# 開発環境
Raspberry Pi3以外の機器は、以下の表に記載していない機器で代用可能です。

| **項目** | **機器/Version** | **用途・備考** |
| :--- | :--- | :--- |
| ホストPC | Intel NUC\(BOXNUC613SYK、Cortex i3、メモリ32GB\) | Raspberry Pi3向けのLinux Kernelソースコード解析およびクロスコンパイルに使用 |
| ホストOS | Debian9.4\(stretch\) | Raspberry Pi3と同じDebian系ディストリビューション\(Ubuntu、Debian等\)が望ましい |
| モニタ    | ASUS VZ249H | ―|
| ターゲット環境 | Raspberry Pi3 Model B | 各種Deviceの検証に使用 |
| ターゲット OS | RASPBIAN STRETCH WITH DESKTOP\(Ver September 2017\) | 2017年10月時点の最新版を選定 |
| ターゲットOS Linux Kernel version | 4.9 | ホストOSと同様のVersion |
| ストレージ\(ターゲット\) | MicroSDカード\(Silicon Power、16GB\) | Class10、容量8GB以上を推奨 |
| MicroSDカードリーダ | マルチカードリーダ\(ELECOM\) | ー |
| 電源\(ターゲット\) | microUSB - USBケーブル、iPad mini2用のUSB充電器 | ー |
| 映像/音声 | HDMIケーブル\(PS4付属品\) | ー |
| 入出力装置 | キーボード、マウス| ホスト環境、ターゲット環境向けに用意 |

# Device Driver動作検証用機器
以下は、個人的な検証用の機器であり、本記事の環境構築に必要ではありません。

| **項目** | **機器名称** | **販売元** | **参考価格\(送料別\)** |
| :--- | :--- | :--- | :--- |
| シリアル通信 | Adafruit PiUART | Pimoroni | 約800円 |
| カメラ | Raspberry Pi Camera V2 | Amazon | 約3,500円 |
| USBガジェット | Cluster HAT v2 | Pimoroni | 約3,200円 |

# HOST開発環境構築
HOST環境向けの手順は、/home/pi/以下で実施していると仮定します。

・Linux Kernel開発に必要な各種パッケージのインストール

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential libncurses5-dev device-tree-compiler trace-cmd git bc
```
・Raspberry Pi3向けLinux Kernelの取得

```
$ git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-4.9.y
```
・Raspberry Pi3向けToolchainの取得

```
$ git clone https://github.com/raspberrypi/tools
```
・ToolchainへのPATHを設定

```
$ echo "export PATH=$PATH:/home/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin" \
>> /home/pi/.bashrc
```
・ビルド速度を早めるため、ccacheをインストール・設定

```
$ sudo apt-get install ccache
$ echo "export USE_CCACHE=1"         >> ~/.bashrc   (注釈) ccacheの使用宣言
$ echo "export CCACHE_DIR=~/.ccache" >> ~/.bashrc   (注釈) キャッシュの格納先
$ ccache -M 10G                                     (注釈) キャッシュサイズの変更
```
・クロスコンパイル実施\(任意\)

```
$ source ~/.bashrc        (注釈) 前手順で追加した設定を反映します。通常、.bashrcはターミナル起動時に読み込まれます。
$ cd /home/pi/linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
$ make -j2 ARCH=arm CROSS_COMPILE="ccache arm-linux-gnueabihf-" zImage modules dtbs
```

# Target開発環境構築
ホスト環境およびターゲット環境における手順は、/home/pi/以下で実施していると仮定します。

・[Raspberry Pi公式サイト](https://www.raspberrypi.org/downloads/raspbian/)より、RASPBIAN\(OS\)をZIP形式で取得
![Screenshot from 2018-03-24 16-57-55.png](https://qiita-image-store.s3.amazonaws.com/0/99011/5524a47b-6e13-6858-abe6-442be34211a0.png)

・MicroSDカードをカードリーダに挿入し、カードリーダとホストPCを接続

```
$ sudo dmesg   (注釈) dmesgのmicroSDのデバイスファイル名を確認(通常、mmcblk[0-9]か/dev/sd[a-z])
(省略)
[ 2282.788314] mmc0: new ultra high speed SDR104 SDHC card at address 59b4
[ 2282.792324] mmcblk0: mmc0:59b4 SPCC  14.7 GiB
```
・ホストPC上で、microSDをフォーマットし、VFATファイルシステムを作成

```
$ sudo fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/mmcblk0: 14.8 GiB, 15836643328 bytes, 30930944 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       8192 30930943 30922752 14.8G  c W95 FAT32 (LBA)

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-30930943, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-30930943, default 30930943): 

Created a new partition 1 of type 'Linux' and of size 14.8 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo mkfs.vfat /dev/mmcblk0p1
```
・ホストPC上で、RASPBIAN\(OS\)をmicroSDにコピー(注：前述の画像とOS Versionが異なります)

```
$ ls
2017-09-07-raspbian-stretch.zip  Documents  Music     Public                       Templates  linux
Desktop                          Downloads  Pictures  SetupDevelopmentEnvironment  Videos     tools

$ unzip 2017-09-07-raspbian-stretch.zip 
$ sudo dd bs=4M if=2017-09-07-raspbian-stretch.img of=/dev/mmcblk0
$ sync
```

・Raspberry Pi3にmicroSDカードを挿入し、電源を投入\(電源 &lt;-------microUSB-------&gt; Rapberry Pi3\)
・Raspberry Pi3のPasswordを変更\(初期設定：user=pi、password=raspberry\)

```
$ sudo passwd pi
Enter new UNIX passwd:
Retype new UNIX passwd:
passwd: password updated successfully

$ sudo passwd root
Enter new UNIX passwd:
Retype new UNIX passwd:
passwd: password updated successfully
```
・Raspberry Pi3の無線環境を設定

```
$ su
Password:

# vi /etc/dhcpcd.conf    (注釈) 以下の内容を追記
interface wlan0
static ip_address=<設定したい固定IPアドレス(例：192.168.1.100)>/24
static routers=<デフォルトゲートウェイ(例：ルータ)のIPアドレス(例：192.168.1.1)>
static domain_name_servers=<DNSサーバ(例：ルータ)のIPアドレス(例：192.168.1.1)>


# wpa_passphrase <SSID> <PASSWORD> >> /etc/wpa_supplicant/wpa_supplicant.conf
  (注釈) <SSID>、<PASSWORD>は、無線ルータの設定値に変更する事
```
・Raspberry Pi3の言語設定、タイムゾーン、Wi-Fi Countryを変更

```
# raspi-config
  [言語設定]
   4 Localisation Options Set up language and regional settings to match your location
   --> I1 Change Locale        Set up language and regional settings to match your location
      --> ja_JP.UTF-8 UTF-8 を選択

  [タイムゾーン]   
 　4 Localisation Options Set up language and regional settings to match your location
   --> I2 Change Timezone      Set up timezone to match your location
       --> Asia
           --> Tokyo を選択

  [Wi-Fi Country]
 　4 Localisation Options Set up language and regional settings to match your location
   --> I4 Change Wi-fi Country Set the legal channels used in your country 
       --> JP Japan を選択
```
・Raspberry Pi3の周辺機器設定を変更

```
# raspi-config
  [周辺機器]
   5 Interfacing Options  Configure connections to peripherals
   --> Camera、SSH、SPI、I2C、Serial、Remote GPIOを有効化
```
・Raspberry Pi3のmicroSDの使用可能領域を拡大

```
# raspi-config
  [ファイルシステム]
  7 Advanced Options     Configure advanced settings
  --> A1 Expand Filesystem Ensures that all of the SD card storage is available to the OS
```
・Raspberry Pi3のパッケージを最新版に更新し、設定変更を反映するために再起動

```
# apt-get update
# apt-get upgrade
# rpi-update
# reboot
```

# Raspberry Piの環境構築関連の自作記事
- [Raspberry Pi2　Linuxカーネルのクロスコンパイル方法(仮想環境Ubuntu14.04による)](https://qiita.com/Nao1215/items/f4cf7988281fd807951c)
- [Raspberry Pi3 with Yocto Project：環境構築](https://qiita.com/Nao1215/items/399b24bf5d9d81ac087d)