Raspberry PiベアメタルでMicroPythonの調査

Raspberry PiをOSを介さずに直接プログラミングすることを「ベアメタル・プログラミング」と呼ぶそうです。
マイコンだと、プログラミングといったらベアメタルが標準だと思いますが、Linuxを使っているとハードウェアは隠蔽されているので、プログラミングといったらカーネルを叩くことがせいぜいで、ハードウェアを直接触るプログラミングには別の名前をつけた、ということでしょうか。

Raspberry Piは、手元に1、2、W Zeroの3台があるのですが、現状ではほぼ積みボードになっていることもあり、MicroPythonをベアメタル・プログラミングでRaspberry Piの上で動かせないのかな? と思って少し現状を調べてみました。

まず、試みている人はいて、おそらく現状で一番進んでいるのはこちらです。

Porting Micropython to the Raspberry Pi – Part 2 – Stefan Naumann

言語のコア部分の動作は確認できていて、移植に際してアンアラインド・アクセスの設定が必要だった等の苦労話も書かれています。
同じ方の、MicroPythonフォーラムでの投稿です。

Raspberry Pi Port – MicroPython Forum

Wrong label-calculation for JUMP-Bytecode on Raspberry Pi, due to unaligned access · Issue #3201 · micropython/micropython

現状としては、main()から文字列をMicroPythonインタープリタに与えてLチカさせるところまではできているようです。

その先ですが、同じくRaspberry Piベアメタルプログラミングで動かしているIchigoJamのように、HDMIとUSBキーボードでMicroPythonのREPLが使えるようにするには入出力デバイス周りの実装が必要になります。

画面表示については、Raspberry PiのGPUを叩けばいいわけで、こちらにいろいろ先人の事例が紹介されています。

RaspberryPiのVideoCore IV(GPU)を使ってOS無し(ベアメタル)からポリゴン出して遊ぶ – Qiita

一方USBキーボードについては、USBプロトコルスタックを実装しなければならないわけで、これは「経験のある人でも半年かかる仕事」だそうです。

USB peripherals in bare metal? – Raspberry Pi Forums

とはいえ、先人の作ったものが使えればそんな苦労はないわけで、上記のリンクにも3つほどそういったものが紹介されています。
もっとも、マイコンと同様にUARTを使うのであれば、そのような苦労はしなくて済みます。
おそらくステップとしてはまずUARTからREPLを叩けるようにし、そのあと画面出力、次にUSBへと進んでいくべきでしょう。

さらにその先はどうでしょう? EthernetやBluetoothが使えるようになれば、ESP32版MicroPythonを凌駕したと言えそうです。
しかし、Raspberry PiではEthernetは内部的にUSB接続になっているので、まずUSB Host機能、さらにUSB Ethernetドライバが必要になると思われます。
そこまで実現しているプロジェクトとして、上記のリンクでも紹介されているultibo coreがあります。

Ultibo core a bare metal environment for Raspberry Pi – Raspberry Pi Forums

こちらはしかし、なんと全てPascalで書かれているそうです。別の意味ですごいです。

また、同じく上記のリンクで紹介されているcircleもUSBやEthernetのサポートがあります。こちらのほうは、C++です。

rsta2/circle: A C++ bare metal environment for Raspberry Pi with USB

MicroPythonをベアメタルで、かつキーボード、画面、ネットワークが使えるようにしようとすると、circleの上で動かせると良さそうではあります。
ただ、なかなか大きなシステムになってしまいそうです。
ちょっとcircleをダウンロードして見てみましたが、libだけで33000行、includeが1万行くらいです。
また、ライセンスがGPL3.0なので、MicroPythonのライセンスとは合わない感じです。

既存のコードを使わないとすると、自前で最低限のI/Oを実装しなければなりませんが、そういった点で参考になりそうなのは、上にも挙げたQiitaの記事を初めとしたネット上の記事と、以下の書籍です。

BareMetalで遊ぶ Raspberry Pi – 達人出版会

2017年2月号目次|Interface

両方とも購入してみましたが、上の書籍ではベアメタルで開発したバイナリをU-bootを使ってネットワークブートする手法が書かれているのが面白いと思いました。
下のほうはInterface誌ですので丁寧ですし、開発環境をインストールしたVMが入ったDVDが付属しています。

ただ、どちらもUSB Hostの実装まではたどりついていません。HIDデバイスだけなら、Arduino用のライブラリとかを見ながらやれば何とかなるのかもしれませんが・・・。

felis/USB_Host_Shield_2.0: Revision 2.0 of USB Host Library for Arduino.

というわけで、今のところ「USBキーボードとUSB経由のイーサネットをどうするか」が一番の課題のような気がします。

コメント