最近はたくさんの ARM のシングルボードコンピュータ(SBC)が市販されています。嬉しい時代になりました。これからのお買い物の参考としてリストアップしました。値段は変動するので参考です。
少し古い世代の SoC を採用したボード達です。
以前(2018年 8月 12日の日記参照)載せた情報も含んでいます。
最近 GCC のコードを書き換えたり、デバッガで追ったり、GCC とお友達になろうとしています。まだ仲良くなれていませんが、入り口に立つまでが色々大変だったのと、間違いなく数カ月後に手順を忘れるので、方法を書き残しておこうと思います。
GCC のコードを書き換えて、結果を反映させるには、何らかの方法で GCC をビルドする必要があります。クロスビルド用ツールチェーンの構築は、昔の日記(2019年 4月 28日の日記参照)に書いたとおりです。コンパイラを追うだけで、ルートファイルシステムが必要なければ、おそらく crosstool-NG を使うのが無難です。差分ビルドがうまく行かないので、何か変更した後に再ビルドするのがちょっと面倒ですが、それ以外は簡単で便利です。
私は再ビルドが遅くてイライラしたのと、ビルドの仕組みにも興味があったので、以前の日記(2019年 4月 29日の日記参照)に書いたとおり、昔作ったクロスコンパイラをビルドする Makefile(GitHub へのリンク)を改造して使っています。ブランチは origin/develop/separate-makefile です。もうこちらを本線にしても良い気がしてきたな。
これも使い方を忘れるのでメモしておきます。手動でビルドするのとあまり変わりません。
#### ビルド用ディレクトリ $ mkdir build_my_toolchain $ cd build_my_toolchain #### 環境構築用のリポジトリ $ git clone https://github.com/katsuster/crosstool-builder $ cd crosstool-builder $ git checkout -t origin/develop/separate-makefile $ cd ../ #### GCC だけリポジトリで取得する(git diff したいから) $ git clone https://gcc.gnu.org/git/gcc.git ## GCC-8.3.0 を使う、他のバージョンでもある程度ビルドできるはず $ cd gcc $ git checkout gcc-8_3_0-release $ cd ../ #### その他の依存モジュールは tarball を使用する $ mkdir tmp $ cd tmp $ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.19.1.tar.xz $ wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.bz2 $ wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz $ wget https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.lz $ wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz $ wget https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.xz $ cd ../ #### ツールチェーンに必要なモジュール $ tar xf tmp/linux-4.19.1.tar.xz $ tar xf tmp/binutils-2.31.1.tar.bz2 $ tar xf tmp/glibc-2.28.tar.xz $ ln -s linux-4.19.1 linux $ ln -s binutils-2.31.1 binutils $ ln -s glibc-2.28 glibc #### GCC に必要なモジュール $ tar xf tmp/gmp-6.1.2.tar.lz $ tar xf tmp/mpc-1.1.0.tar.gz $ tar xf tmp/mpfr-4.0.2.tar.xz $ cd gcc $ ln -s ../gmp-6.1.2 gmp $ ln -s ../mpc-1.1.0 mpc $ ln -s ../mpfr-4.0.2 mpfr $ cd ../
自分で書いていて面倒くさいなあと思いました。スクリプトにしたほうが良かったかもしれない。もし binutils も変更したりデバッグしたければ、tarball の代わりにリポジトリをチェックアウトしてくると良いです。
$ source crosstool-builder/env.sh $ cd crosstool-builder $ make -j4 install
デフォルトでは RISC-V 64bit Linux 向けのクロスコンパイラをビルドします。env.sh を書き換えれば AArch64 や ARM 向けもビルド可能です。RISC-V 32bit 向けは gcc-static(ベアメタル用コンパイラとして使用可能)までしかビルドできません。以降は glibc のビルドでエラーになり Linux 用のクロスコンパイラはビルドできません。
$ cd crosstool-builder $ make -f gcc-static.mk -j4 install
GCC に何か修正を入れてビルドし直すときは、ビルドし直したい *.mk ファイルを指定して make します。
ROCKPro64 の PCIe が動かなくて、しばらく放置(2019年 3月 16日の日記参照)していたのですが、今日久しぶりに見てみたところ、意外とあっさり直せました。
PCIe が動かなかった理由は単純で、PERST# 信号を全く制御しておらず、PCIe カードのリセットを解除していなかったためでした。それは動かないわ。
不思議なことに linux-next では ROCKPro64 以外の RK3399 搭載ボードは PCIe が使えるように対応が入っているのに、ROCKPro64 だけハブられています。悲しいので、作ったパッチを LKML にぶん投げておきました。誰かの役に立てば嬉しいですね。
ちなみに ROCKPro64 の PCIe PERST# 信号は、こんな経路で来ていました。
RK3399 GPIO2_D4 -> PCIE_PERST_L -> PCIE_PERST_3V3_L -> PERST#
我が家には PCIe のカードが 3つあります。あります、というか、わざわざ ROCKPro64 の PCIe 接続テストのために買ったという方が正しいです。
リセットを制御していない場合、基本的にはどのボードも動きません。しかし USB 拡張カードだけはたまに動きます。不思議な挙動です。カードが PERST を無視しているのか、偶然か、深追いしていないのでわかりません。
PERST# の制御をするように直したところ、USB 3.0 カードと、SATA カードはバッチリ認識するようになりました。PCIe - PCI ブリッジカードは起動中になぜか ROCKPro64 にリセットが掛かってしまい、うまくいきませんでした。
ROCKPro64 からの給電では足りないのかと疑って、外部からブリッジカードに電源を供給してみましたが、ダメでした。PC でも使えたり使えなかったりする、割と特殊なカードらしいので、ROCKPro64 では動かないのかもしれません。
さらに調べるにせよ、何にせよ、また次の機会ですね。
メモ: 技術系の話は Facebook から転記しておくことにした。多少修正。
合計:
本日:
< | 2019 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 | - |
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2016.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)