SNSへはこちら

AE-TYBLE16をHack(1) - 取り敢えずLチカ

秋月で販売されている、太陽誘電の BLE モジュールを使ってLチカしてみました。

これは基本的にマイコン等から UART を接続してコマンドを実行するためのモジュールとして存在します。つまりこれ自身は単純な BLE デバイスなのです(普通に使えば)。
こちらの Qiita の記事が有名かと思いますが、この記事のように Hack していきます。

ただし、私のように改造を行うと、ひょっとしたら元のファームに戻せないかもしれません。多分そんなことはないと思いますが(未検証)、その辺はご了承した上で楽しみましょう。

また、改造を行うので技適違反が気になるところですが、RADIO ペリフェラルを見る限りどうやっても出力電力等が出過ぎたり規定外の周波数帯に出る事はなさそうなので、その辺は気にしなくてもいいかと思います。
まあレジスタ手打ちで色々やるのがこのブログの特徴ですので、あくまでもホビーユースということで行きましょう。

搭載している SoC は nRF51822 という有名なものですので、Hack 自体は Arduino でサクッと出来るようです。というのも、これには ARM Cortex-M0 マイコンが搭載されているのです。ただ、それだけじゃ面白くないので、反吐が出るように大嫌いな憎き Arduino IDE を使わずにLチカをやってみたいと思います。

参考

  • nRF51 シリーズのリファレンスマニュアル
    • レジスタのアドレスはやはりこれで調べました。
  • EYSGJNAWY-WX データレポート
    • 太陽誘電公式のやつ。秋月で買ったパック内に付属の紙から資料のダウンロードのための申請を行ってください。
  • AE-TYBLE16備忘録 - Tomiya's blog (3DCG & Photo etc.)
    • 配線とかの参考に。

回路接続

  • SWDI(SWDIO) と SWDC(SWDCLK) をデバッガに接続。
    • SWDI はアクティブ Low のリセットピンも兼ねているため、プルアップ抵抗で吊っておく
  • V+ は 3.3V、GND は 0V。言うまでもない。

...つまり SWD を使うということです。書き込みソフトは OpenOCD です。

プログラムと書き込みコマンド

今回は面倒くさいので、C言語での実装はやめてアセンブリを書き書きします。リンカスクリプトとか面倒だしね。

Lチカのプログラム

では書いたものがこちらです。すごい適当な実装ですがねえ。

.text
.word 0x60000000
.word _start

.type wait,%function
wait:
    LDR r5, =0x2FFFFF
1:
    sub r5, r5, #1
    bne 1b
    bx lr

.type _start,%function
.global _start
_start:
    LDR r0, =0x50000000
    LDR r1, =0x714
    mov r2, #1
    str r2, [r0, r1]

    mov r3, #(1 << 5)
mainloop:
    LDR r1, =0x504
    eor r2, r3
    str r2, [r0, r1]
    bl wait

    b mainloop

なんてことはない実装ですね。それでは以下でコンパイルしましょう。

$ arm-none-eabi-as -mcpu=cortex-m0 -mthumb -c -o start.o start.s
$ arm-none-eabi-ld --gc-sections -nostartfiles -Ttext 0x00000000  -o output.elf start.o

今回はオブジェクトファイル生成と最終的な実行バイナリの生成を分けていますが、一緒にしてしまっても勿論OKです。

書き込みコマンド

これで認識されます。

$ openocd -f interface/cmsis-dap.cfg -f target/nrf51.cfg

早速書き込みをしたいんですが、デフォルトのバイナリに戻したいこともあると思いますので吸い出しておきます。flash コマンドの実行には、事前に init をしておく必要があります。

$ openocd -f interface/cmsis-dap.cfg -f target/nrf51.cfg -c 'init;flash read_bank 0 default.bin;exit'

ではでは、書き込みを一発で行うコマンドを、ログとともに以下に示しておきます。

$ openocd -f interface/cmsis-dap.cfg -f target/nrf51.cfg -c 'program output.elf;reset;exit'
Open On-Chip Debugger 0.10.0+dev-01266-gd8ac0086-dirty (2020-05-28-17:49)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "swd". To override use 'transport select <transport>'.
Info : CMSIS-DAP: SWD  Supported
Info : CMSIS-DAP: FW Version = 1.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x0bb11477
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for nrf51.cpu on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x00000010 msp: 0x60000000
** Programming Started **
Info : nRF51822-CFAC(build code: A0) 256kB Flash, 32kB RAM
Warn : Adding extra erase range, 0x00000038 .. 0x000003ff
** Programming Finished **

こんな感じで動きます!やりました〜

おまけ

以下に telnet を経由した OpenOCD コマンド実行のログを残しておきます。

$ telnet localhost 4444
> init
> reset halt
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
> nrf51 info

[factory information control block]

code page size: 1024B
code memory size: 256kB
code region 0 size: 0kB
pre-programmed code: not present
number of ram blocks: 4
ram block 0 size: 8192B
ram block 1 size: 8192B
ram block 2 size: 8192B
ram block 3 size: 8192B
config id: ffff0087
device id: 0xc0c134dc4931ff38
encryption root: 0xc4b8a546325a63cf7da37fca8cf1b296
identity root: 0xe676cf714233bb708eb760c890ab950b
device address type: 0xffffffff
device address: 0x11dcfe92035d08b7
override enable: fffffff6
NRF_1MBIT values: 78005000 5400004e 600c8005 726424 821b423e
BLE_1MBIT values: 7d005200 5c000050 680e8806 726424 8257423e

[user information control block]

code region 0 size: 0kB
read back protection configuration: ffff
reset value for XTALFREQ: 0
firmware id: 0xffff
> flash read_bank 0 AE-TYBLE16_default.bin
wrote 262144 bytes to file AE-TYBLE16_default.bin from flash bank 0 at offset 0x00000000 in 5.507254s (46.484 KiB/s)

> program AE-TYBLE16_default.bin
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
** Programming Started **
** Programming Finished **
> reset
> exit
Connection closed by foreign host.