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です。

docs.zephyrproject.org

DEVICE_INIT(dev_name, drv_name, init_fn, data, cfg_info, level, prio)

このマクロ(と引数に使うマクロ)を使うために、init.hdevice.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

いけるやん。