前回はアセンブリで適当にLチカしましたが、今回は本格的に Hack するのに備えてライブラリの導入をします。こちらも地味に面倒くさかったです。
使用するライブラリ - SoftDevice由来のnrfx
このモジュールは太陽誘電のものなのですが、元々これには Nordic 社の nRF51822 SoC が搭載されています。Nordic 社のページからは SoftDevice と呼ばれるライブラリが配布されているので、これに同梱されている nrfx という低レイヤライブラリを使えばよいのです。
ダウンロードまで至った経緯は不明ですが、こちらから最新版の 17.0.2 をダウンロードしました。
プロジェクトを作ろう
ここでは自己主張をしておきますが、ヘッダのインクルードパス指定とコンパイルエラーを駆使して色々と時間を掛けました。
ではやっていきましょうかね。
まず、プロジェクトのディレクトリを作ります。僕はいつものように Register という(レジスタ手打ちをするぞ!的な)名前にしました。ついでにサブディレクトリを作っておきましょうか。
$ mkdir Register
$ cd !$
$ mkdir src inc
ライブラリの導入
必要なファイルを持ってきましょう。
まずは先程ダウンロードした SoftDevice。zip ファイルを展開したら、その中の modules/nrfx
をプロジェクトルートにコピーします。
更にこのライブラリ、CMSIS が必要になるので git
コマンドで clone しておきます。master ブランチだけでいいですかね。
$ git clone -b master https://github.com/ARM-software/CMSIS_5
その他編集
必要なファイルを持ってきます。
nrfx/mdk/nrf51_xxaa.ld
をプロジェクトルートにコピーします。中身を次のように編集してください。ここではメモリマップを指定しています。具体的な値は太陽誘電のデータブリーフから調べてきました。
/* Linker script to configure memory regions. */
SEARCH_DIR(./nrfx/mdk)
GROUP(-lgcc -lc -lnosys)
MEMORY
{
FLASH(xra): ORIGIN = 0x00000000, LENGTH = 256K
RAM(xwa): ORIGIN = 0x20000000, LENGTH = 32K
}
INCLUDE "nrf_common.ld"
これでリンカスクリプトの準備は完了。続いてライブラリに必要なヘッダファイルを扱います。
プロジェクトルートの nrfx/templates/nRF51
の nrfx_config.h
、nrfx/templates
の nrfx_log.h
, nrfx_glue.h
があるので、こちらもコピーしておきます。
取り敢えず nrfx_glue.h
でエラーが出るので適当に編集しておきましょう。
ここの編集はとりあえずコンパイルエラーを無くすために施した編集に過ぎません。今後修正する可能性がありますのでご注意ください。
#define NRFX_IRQ_IS_ENABLED(irq_number) 1
Makefile
ビルドできるようにするためのスクリプトファイルですが、コンパイルエラー→ find | xargs grep
の繰り返し→スクリプト編集をやった結果で説明すかなり面倒ですので、結果を示します。こちらからどうぞ。
動作テスト
それでは皆様、導入の操作お疲れ様でした。実際にライブラリを動かしてみましょう。取り敢えずのソースはこちらです。src/main.c
に記入してください。
#include <nrf.h>
#include <nrf_gpio.h>
#define LED_GPIO_NUM 5
int main(void) {
nrf_gpio_cfg_output(LED_GPIO_NUM);
while(1) {
nrf_gpio_pin_set(LED_GPIO_NUM);
for(volatile int i = 0; i < 300000; i++);
nrf_gpio_pin_clear(LED_GPIO_NUM);
for(volatile int i = 0; i < 300000; i++);
}
return 0;
}
そうしたら make
します。nrfx ライブラリも含めてビルドがされますね。え??どうやってこの関数を呼んだのか??困りますねえ、当然ライブラリのソースコードを読んだんですよぉ。
冗談はさておき、以下のように動作します。基板上のシルク (P005) が PIN5 にそのまま対応するようです。
Nordic社のライブラリを手探りでビルドして、なんとかLチカまで漕ぎ着けた pic.twitter.com/0LHzlYo7sb
— しまじゃき (@obknt) March 9, 2021