Zephyr×Rustのインテグレーションにチャレンジ!④~RustでDriverを書くための調査~
はじめに
ZephyrとRustのインテグレーションに挑戦しています。
tomo-wait-for-it-yuki.hatenablog.com
これまでで、アプリケーションをRustで書いてきました。 ここからは、Driverを書く方法を調査していきます。
最低限必要なことは何か?
まずは、ここからです。 Zephyrのビルドプロセスを解析し、device driverのライブラリを作るプロセスがあることが分かっています。
tomo-wait-for-it-yuki.hatenablog.com
理想的には、このプロセスにRustで書いたdriverがビルドできると良いです。 ですが、いきなりこれをやるのはハードルが高そうです。
そこで、まずアプリケーションプロジェクト内device driverが作れるかどうか、試してみます。
external driver project
hello_world
サンプルアプリケーションをコピーして、device driverを作ってみます。
driverを登録するマクロは、DEVICE_INIT
です。
DEVICE_INIT(dev_name, drv_name, init_fn, data, cfg_info, level, prio)
このマクロ(と引数に使うマクロ)を使うために、init.h
とdevice.h
とをincludeします(init.h内でdevice.hをincludeしているので、device.hは明示的にincludeしなくても大丈夫です)。
#include <init.h> #include <device.h>
最低限、初期化関数は必要なので、初期化関数内で文字を表示するようにしておきます。
static int my_init(struct device *dev) { printk("Hello from MY_DRIVER.\n"); return 0; } DEVICE_INIT(my_device, "MY_DRIVER", my_init, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT );
ビルドしてみます。
$ mkdir build && cd $_ $ cmake -GNinja -DBOARD=qemu_cortex_m3 .. $ ninja [3/100] Preparing syscall dependency handling [95/100] Linking C executable zephyr/zephyr_prebuilt.elf Memory region Used Size Region Size %age Used FLASH: 7680 B 256 KB 2.93% SRAM: 4032 B 64 KB 6.15% IDT_LIST: 8 B 2 KB 0.39% [100/100] Linking C executable zephyr/zephyr.elf
いけるやん。実行してみましょう。
$ ninja run [1/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: cortex-m3 qemu-system-arm: warning: nic stellaris_enet.0 has no peer Hello from MY_DRIVER. # !!!!!!! ***** Booting Zephyr OS 1.13.99 ***** Hello World! qemu_cortex_m3
いけるやん。