WinnerMicro W806なるCPUの載ったボードをAliExpressで買ってみたは良いのですが…
開発環境とか、どう揃えたら良いんでしょうかね。中国語で書かれた資料だのを読み漁ってどうにかするしかないのは確かなのですが。とりあえず、【联盛德W806-KIT开发板试用体验】兵马未动,粮草先行(linux_环境搭建产出fls)に記されていたcsky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gzをダウンロードして、見てみることにします。
アーカイブに含まれるファイルはこんな感じで、C-SKY向けに設定されたbinutils-2.27, gcc-6.3.0のようです。strings(1)でcsky-abiv2-elf-gccを覗いてみると、/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/source//gcc/configure x86_64-linux --enable-languages=c,c++ --disable-threads --enable-sjlj-exceptions --disable-shared --enable-libssp --target=csky-elfabiv2 --prefix=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/install/ --with-headers=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/install//csky-elfabiv2/include --with-lib=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/install//csky-elfabiv2/lib/ --with-mpfr=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/lib-for-gcc-x86_64-linux/ --with-gmp=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/lib-for-gcc-x86_64-linux/ --with-mpc=/ldhome/software/toolsbuild/slave2/workspace/Toolchain/release-csky-1/lib-for-gcc-x86_64-linux/ --with-cskyabi=abiv2 --with-pkgversion='T-HEAD C-SKY Tools V3.10.29 Minilibc abiv2 B20210423' --disable-tls --enable-threads=posixなんて文字列が埋まっていたのでこれに近い形でconfigureすれば良いのだと思います。
とはいえ、gccのC-SKYサポートは9以降という話がGCC Patches Posted For Port To Chinese "C-SKY" CPU ArchitectureやNEW: devel/csky-elf(openbsd-ports)で出ているので、そこそこ新し目のgccをいつもの手順でC-SKY向けにビルドすれば良いのでは?という気もします。newlibについても、newlib-4.0.0以降であれば対応しているようですし。あとは、wm-sdk-w806で書き込みツールが揃うかどうか。
という訳で、まずはクロスコンパイラの用意。wm-sdk-w806/tools/W806/wconfigに従い、(newlibを使ってはいますが)csky-abiv2-elfで進めます。
・csky-abiv2-elf
- binutils-2.34
- ../configure --target=csky-abiv2-elf --prefix=/usr/local --disable-nls
- gcc-9.4.0 + newlib-4.1.0
- ../configure --target=csky-abiv2-elf --enable-languages=c,c++ --prefix=/usr/local --with-newlib --disable-nls --disable-libssp --disable-libgomp --with-gmp=/usr/local --disable-lto --with-cskyabi=abiv2 --disable-threads --disable-tls
csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gzに含まれるgccと全然違う設定ですが、困った時に見直すことにします。Arch LinuxではAUR(csky-elf-noneabiv2-tools-bin)で揃うようなので、こちらの設定も調べておけば良かったかな…
インストール後、csky-abiv2-elf-gcc -c hello.c -S -o hello.sでなんとなくコードも生成できているようなので、コンパイラは一応用意できたということにします。
届いたボードが壊れていても困りますので、簡単に動作チェックをするとしても、何をすれば良いか分かりません。とりあえずPCにつないで、LEDは点滅しませんが…通信ソフトを起動しておくとリセットする度に「enter main」なるメッセージが飛んできます。
また、BOOTボタンを押しながらリセットを行うと、W806がひたすらCの文字を送信してくるのですが、書き込みプログラムか何かからのコマンドを待っているのかもしれません。何かしらの反応がある以上、ボードは壊れていないと判断して良さそうです。
あとはwm-sdk-w806をgit cloneして足掻けば良いはず…だったのですが、どうもビルドしたコンパイラが-mcpu=ck804efオプションに対応していないらしく、どうにもなりません。ck804efの代わりに使えそうなオプション(ck803ef?)に変えてごまかすか、ck804efに対応したコンパイラを作り直す必要があります。
という訳で、表題の「失敗編」にあるように、今日の日記の内容では全然進みません。ごめんなさい。52.3kg(21:05)
11-Dec-2021補足:binutils-2.36以降ではck804のサポートがありますが、ck804efは無いようです。gccは現在の最新版(11.2)でもck804の対応はありません。binutilsを見るに、ck804はck803(R3)相当のようですがこれに対応するオプションは無いのでck803r1とし、これにDSP(e)とFPU(f)を付けてck803efr1とするのが良さそうに見えます。
ちょっと足掻いてオブジェクトが得られるところまでは来たのですが、libglossにあるlibnosysあるいはlibsemi(にあるsbrk.o)が必要になります。これはRTEMS 4.5.1-pre3 On-Line Libraryにあるように、gccを作成する際においてnewlibだけでなくlibglossのソースコードへシンボリックリンクを張った状態でビルドすれば作成できます。
ちょっと悩んだのがMAP := -Wl,-ckmap=$(IMAGEODIR)/$(TARGET).mapの部分。ldの-ckmapオプションはT-HEAD(C-SKY)拡張のようで、これは-Mapオプションに置き換えるしかなさそうです。
12-Dec-2021補足:別記事ではなく、補足で進めます。wm_toolによる書き込みがOpenBSDだと上手くいかないようで、その問題を解決しないといけないのですが…原因が掴めないので一旦棚に上げて、野良ビルドしたbinutils+gcc+newlibでwm-sdk-w806を使えるようにすることを優先しました。これは既に実現できており、pull requestとして投げています。既に書いたことの再掲も含みますが、
- -lc -lnosysによるsbrk.oへの対応(-lsemiは使用できません)
- -ckmap/-Mapと-mcpuオプションの違いへの対応
- -mistackオプションの追加(__attribute__((isr))への対応)
が必要です。ここまでの作業で、wm-sdk-w806のapp/src(中身はdemo/pwm/led_fade_independentと同じ)が動作することを確認しています。
なお、#include "wm_hal.h"を行い、SystemClock_Config(CPU_CLK_160M)を呼び出す際は注意が必要です。wm_it.cに記述される、CORET_IRQHandler()を実装しないとundefined exception 57が発生して途方に暮れることになります。
ASCIIアートベンチマークをとりあえず載せてみたものの、40MHz設定でもかなり高速で、一瞬で結果が出てしまいます(タイマーの使い方が分からないため、正確な時間測定は行えていません)。単精度とはいえ、FPUを搭載していることが効いているのでしょうか。
あとはmake menuconfigおよびwm_toolのOpenBSD対応が残っています。とはいえ、状況次第ではこのままで放り投げるかもしれません。