Open8

手動Maix Amigo

okuokuokuoku

SRAMからのプログラム起動

前回見てみたArduinoサンプル を直接実行してみる。

  1. https://github.com/sipeed/kflash.py をクローン
  2. 短辺側のUSBポートに接続
  3. 増えるCOMポートのどちらかを指定してロード
./kflash.py -p /dev/ttyS12 -b 115200 -B goE -s -t Blink.ino.sipeed_maix_amigo.bin

これでCygwinから正常に起動できた。(COM12とCOM13が認識され、COM13が正解だった。)

okuokuokuoku

オンボード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

okuokuokuoku

memcpymemset が無い

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をリンクする必要がある。

okuokuokuoku

リロケーションでエラー

main.c:8:(.text.startup+0x0): relocation truncated to fit: R_RISCV_HI20 against `.LC0'

これはmemory modelが合ってなかった。 -mcmodel=medany が正解らしい のでツールチェーンビルドしなおし。。(newlibにも同じオプションを与える必要がある)

okuokuokuoku

とりあえずリンクまで通した

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 をサポートしてないんだ。。?遅い。。?エラッタがある。。?

okuokuokuoku

いきなりクラッシュする

    8000aa90:   4b0050ef                jal     ra,8000ff40 <__errno>

あ、 __errno って関数か。

https://github.com/okuoku/amigotest/commit/fca185e8902f492ee37433b49a2c85744c58cbe9

ばっちり( 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 で実装されている。