手動Maix Amigo
マジでドキュメントが無いな。。
Native SDKのコードサンプルは https://github.com/kendryte/nncase/tree/master/examples/facedetect_landmark/k210/facedetect_landmark_example あたりに有るようなので、その辺を見つつ。。
SRAMからのプログラム起動
前回見てみたArduinoサンプル を直接実行してみる。
- https://github.com/sipeed/kflash.py をクローン
- 短辺側のUSBポートに接続
- 増えるCOMポートのどちらかを指定してロード
./kflash.py -p /dev/ttyS12 -b 115200 -B goE -s -t Blink.ino.sipeed_maix_amigo.bin
これでCygwinから正常に起動できた。(COM12とCOM13が認識され、COM13が正解だった。)
オンボードJTAGは諦めた
Maix AmigoにはSTM32 ...のクローンであるGD32が載っていて、このGD32が 0403:6010 FT2232C/D/H Dual UART/FIFO IC
をエミュレートするようになっている。
ファームウェアのリポジトリ https://github.com/rgwan/open-ec を見る限りJTAGを実装したい気持ちはありそうだけど誰もフォーラムで触れなくなってから数年という感じ。そもそもFTDIのMPSSEを真面目にエミュレーションしているように見えないので、専用のbitbangロジックを書いてやる必要があるだろう。
K210の開発元は専用のOpenOCDフォークを持っているが、こちらも長いこと更新されていない https://github.com/kendryte/openocd-kendryte 。
_lock_t
の定義が公開されていない
どういう事だってばよ。。
memcpy
と memset
が無い
libbsp.a(dmac.c.obj): in function `dmac_irq_callback':
lib/drivers/dmac.c:847: undefined reference to `memcpy'
libbsp.a(fpioa.c.obj): in function `fpioa_init':
lib/drivers/fpioa.c:4689: undefined reference to `memset'
これは -lc
でlibcをリンクする必要がある。
リロケーションでエラー
main.c:8:(.text.startup+0x0): relocation truncated to fit: R_RISCV_HI20 against `.LC0'
これはmemory modelが合ってなかった。 -mcmodel=medany
が正解らしい のでツールチェーンビルドしなおし。。(newlibにも同じオプションを与える必要がある)
とりあえずリンクまで通した
crosstoolで -mcmodel=medany
を含むようにツールチェインを作った。
CT_TARGET_CFLAGS="-mcmodel=medany"
CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY="--with-cmodel=medany --with-abi=lp64f --with-arch=rv64imafc"
CT_CC_GCC_EXTRA_CONFIG_ARRAY="--with-cmodel=medany --with-abi=lp64f --with-arch=rv64imafc"
この辺の構成は https://github.com/kendryte/kendryte-gnu-toolchain/blob/37b9dd4d776aaf2c7dfef3011b7099ea985125ed/README.md から拾った。
いやちょっと待てよ。。 https://github.com/kendryte/kendryte-doc-datasheet/blob/822026850598e05c1d6fd7e3c60462f8ea3219cd/en/003.md では、
Based on RISC-V 64-bit IMAFDC (RV64GC), suitable for general tasks
With multiply, divide and square root operations; supports single-precision and double-precision floating-point calculations
みたいに double
もサポートしてるって書いてるのに、なんで公式のSDKが double
をサポートしてないんだ。。?遅い。。?エラッタがある。。?
いきなりクラッシュする
8000aa90: 4b0050ef jal ra,8000ff40 <__errno>
あ、 __errno
って関数か。
ばっちり( https://github.com/okuoku/amigotest/blob/fca185e8902f492ee37433b49a2c85744c58cbe9/main.c#L13 )。
... というか、ちゃんとBSPのレベルでダンプが用意されていて偉いね。。 https://github.com/kendryte/kendryte-standalone-sdk/blob/06a2ea71f250e91d66fa156ff82ae1f5b9fc6e56/lib/bsp/include/dump.h#L112 で実装されている。