Open6

flink: Hello worldへの作戦を考える

okuokuokuoku

DA14531MOD は、そもそも開発用の拡張ボードと一緒に使うことが想定されているため、単体ではプログラムを書き込む手段が無い。

とりあえず:

  1. JTAGを開通させる
  2. メモリマップを調べ、SDKとその辺のgccを使ってプログラムをリンクする -- 公式SDKではKeil(本家SDK https://pages.switch-science.com/mdkarm/ )を前提にしている
  3. JTAG経由でプログラムを送りこみ、動作を確認する

というステップで行きたい。

prev

https://zenn.dev/okuoku/scraps/900375b9fbbd3f

今見たら700円以上に値上っている。。円安というわけではなく、そもそもモジュールの卸値がかなり上がっているようだ。

https://zenn.dev/okuoku/scraps/44f8a7684e47f8

https://zenn.dev/okuoku/scraps/af9a19a41bbac0

okuokuokuoku

配線

適当に配線。。Raspberry Pi Pico側は、

  • 4 = SWDCLK
  • 5 = SWDIO
  • 6 = NC(UART TX)
  • 7 = UART RX
okuokuokuoku

JTAGの開通

OpenOCDを適当に設定する。

source [find target/swj-dp.tcl]
set _CHIPNAME da14531

set _ENDIAN little

# FIXME: Source?
set _CPUTAPID 0x0bc11477

swj_newdap $_CHIPNAME cpu -irlen 4 -expected_id $_CPUTAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap

こういう感じにTCLを書いて、

./src/openocd -f interface/cmsis-dap.cfg -c "adapter speed 5000" -f target/da14531.cfg -s tcl

のようにすることで、ちゃんと認識された。

Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: Atomic commands supported
Info : CMSIS-DAP: Test domain timer supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x0bc11477
Info : [da14531.cpu] Cortex-M0+ r0p1 processor detected
Info : [da14531.cpu] target has 4 breakpoints, 2 watchpoints
Info : starting gdb server for da14531.cpu on 3333

...データシートにこの辺の情報が無い。。Cortex側のconfig情報くらい載せてくれても良いと思うんだけど。。

okuokuokuoku

GCC_EXEC_PREFIX が設定されない問題

"environment variable 'GCC_EXEC_PREFIX' not defined"

これはCrosstool-ng側の問題な気がする。。とりあえず手で設定してからビルドする。

export GCC_EXEC_PREFIX=/opt/yuniboard/arm-m0p/lib/gcc/
okuokuokuoku

ビルド結果がでかい

とりあえず https://github.com/dialog-semiconductor/BLE_SDK6_examples/tree/1be8e291bbbdf1c56724667ac876e318b6ee8706/connectivity/active_scanner のサンプルをビルドしてみる。

   text    data     bss     dec     hex filename
  23080    4324    2716   30120    75a8 /home/oku/repos/flink-priv/build/flink_531.elf

... でかい。。あと、そもそもサンプルのビルドシステムをパッチしないと正常にビルドできなかった。

https://community.renesas.com/wireles-connectivity/f/bluetooth-low-energy/33295/error-l6218e-undefined-symbol-arch_asm_delay_us/118028#118028

diff --git a/build_utils/gcc/dialog-sdk.cmake b/build_utils/gcc/dialog-sdk.cmake
index 042ba679..c25a1575 100644
--- a/build_utils/gcc/dialog-sdk.cmake
+++ b/build_utils/gcc/dialog-sdk.cmake
@@ -280,6 +280,8 @@ set(DIALOG_SDK_SOURCES_531
     ${DIALOG_SDK_PATH}/sdk/platform/arch/boot/system_DA14531.c
     ${DIALOG_SDK_PATH}/sdk/platform/arch/boot/GCC/ivtable_DA14531.S
     ${DIALOG_SDK_PATH}/sdk/platform/arch/boot/GCC/startup_DA14531.S
+
+    ${DIALOG_SDK_PATH}/sdk/platform/system_library/src/DA14531/system_library_531.c
 )

 set(DIALOG_SDK_SOURCES_58x_BLE

まぁそのうち直るかな。

okuokuokuoku

動いてるんだけどデータが化けている

ちょっと配線がダメすぎるか。。?ロードは単にCPUをhaltしてメモリに書き込み、レジスタ SYS_CTRL_REG の15ビット目に1を設定してリセットを掛ける。( SYS_CTRL_REG の残りのビットはJTAGのポートとメモリのremap。)

halt
load_image /home/oku/repos/flink-priv/build/flink_531.hex
write_memory 0x50000012 16 0x81a2

Debuggerの配線を抜くと正常になる。なのでPicoprobe側のUARTは正常で、問題はUARTのGPIOを正常に設定できていないというところだろうか。

だいたい1周期6msくらいで、ピークが3mA程度。仕様の範囲内だな。