livaの雑記帳

HiKey960のM.2コネクタがSSDを認識するようになった

この記事の続き。

raphine.hatenablog.com

この記事を書いた時点では、AOSP(Hisilicon謹製のクローズドソースなブートローダから起動する)ではPCIバイスが認識されるけど、UEFIからDebianを起動すると認識されなかった。UEFIがきちんとPCIを初期化しないからっぽい、と。

 

で、結論としては、昨日hisiliconの中の人が出したUEFIへのパッチによってDebianでも認識するようになりました。

 

手元にあるSSDのうち、NVMe SSDとして使えたのは、

逆に、Samsung 960 EVOは lspci でPCIバイスとして表示されるし、/dev/nvme0も現れてNVMeコントローラとしても認識されるのだけど、/dev/nvme0n1が現れなかった。(正確には最初は現れてたのだけど、いろいろ実験してたらなぜか現れなくなった)

 

 

 

というわけで、以下やり方。

 

まず、キモとなるのはhisiliconの中の人から出てきた以下のPull Request。github.com

 

この記事執筆時はこのPull Requestはmergeされていない(追記:マージされてた!)が、たぶんそのうち最新のUEFI prebuild imageを使えば動くようになるはず。

とりあえず現時点ではprebuild imageが無いので、自分でUEFIをビルドする。

 

やり方は基本的にこれと同じ。

github.com

 

僕はUbuntuが提供しているg++-aarch64-linux-gnuパッケージを使っていたのだけど、これだとコンパイルがこけるっぽいので、linaroが提供している最新のコンパイラをインストールする。

 

まずは以下を実行して、出てきたパッケージを全て消す。

$ dpkg -l | grep aarch64-linux-gnu

 

次に、以下からそれっぽいtar.xzファイルをダウンロード。展開してパスを通す。

Linaro Releases

 

UEFIコンパイルをする。

# apt install uuid-dev -y

$ git clone https://github.com/hzhuang1/arm-trusted-firmware.git -b fix_psci --depth=1

$ git clone https://github.com/96boards-hikey/edk2 -b testing/hikey960_v2.5 --depth=1

$ git clone https://github.com/96boards-hikey/OpenPlatformPkg -b testing/hikey960_v1.3.4 --depth=1

$ git clone https://git.linaro.org/uefi/uefi-tools --depth=1

$ git clone https://github.com/96boards-hikey/l-loader -b testing/hikey960_v1.2 --depth=1

$ BUILD_PATH=$(pwd)

$ cd ${BUILD_PATH}/edk2

$ ln -sf ../OpenPlatformPkg

$ BUILD_OPTION=RELEASE

$ export AARCH64_TOOLCHAIN=GCC5

$ export UEFI_TOOLS_DIR=${BUILD_PATH}/uefi-tools

$ export EDK2_DIR=${BUILD_PATH}/edk2

$ EDK2_OUTPUT_DIR=${EDK2_DIR}/Build/HiKey960/${BUILD_OPTION}_${AARCH64_TOOLCHAIN}

$ cd ${EDK2_DIR}

$ ${UEFI_TOOLS_DIR}/uefi-build.sh -b ${BUILD_OPTION} -a ../arm-trusted-firmware hikey960

赤文字にしている部分がポイント。hisiliconの中の人による修正済みブランチを落としてくる。

 

公式のマニュアルでは、tools-images-hikey960のルートのファイルを用いてるが、partition tableの整合が取れてなくてUEFIから自動でgrubを起動できないので、以下で配布されている物を使うのが良いと思う。

builds.96boards.org

 

適当なディレクトリ上に、上のページから全てファイルを落としてくる。

同じディレクトリにビルドしたUEFIも置く。

$ ln -sf ${BUILD_PATH}/l-loader/l-loader.bin

$ ln -sf ${BUILD_PATH}/l-loader/fip.bin

 

recovery mode(よく分からない人はこれでも読んで)で起動し、以下のコマンドを実行する。hikey_idtを実行途中、裏のpicocomで「Press ESCAPE for boot options」と出た瞬間に「f」を押さなければいけない事に注意。

./hikey_idt -c config -p /dev/ttyUSB1

fastboot flash ptable prm_ptable.img

# fastboot flash xloader sec_xloader.img

# fastboot flash fastboot l-loader.bin

# fastboot flash fip fip.bin

 

あとはbootやお好みでsystem、userdataとか焼く。Debianのビルド方法についてはこれとか参考になるかと。(注:この記事ではSDカードにOSを焼いているが、UFSに焼きたければ、この記事の参照元のブログの記事とか参考になるかと)

あと、この記事で解説しているパッチを当てる事。リポジトリ同じ

 

ところで、Debianをビルドした際の個人的ハマリポイントを書いておく。

コンパイラを適当なディレクトリに落として、.bashrcで$PATHを追記するという雑なやり方をしていた所、Debianのビルド時にコンパイラが見つからなくてこけた。

visudoで「Defaults       secure_path="〜〜〜(略)〜〜〜"」という行をコメントアウトすると上手く行く。

 

 

Debianが上手くインストールできたら、M.2 SSDを挿してHikey960を起動する。

この時点で、/dev/nvme0は見えているはず。

 

# apt update

# apt install nvme-cli -y

 

これで/dev/nvme0n1が見えるようになる。(再起動が必要かも)