Pi版MicroPythonでRAMディスクが使えるようになって喜んでいたのですが、やはりSDカードも使えるようにしたいという欲が出てきます。スクリプトをPCから転送する用途には、シリアルポートとRAMディスクの組み合わせで実用上は十分ですが、データを扱おうとするとSDカードがあるほうが便利です。RAMディスクを動作させる際にMicroPythonのファイルシステムについていろいろ調べましたので、その記憶が薄れないうちにSDカードへのアクセスも実装することにしました。以下のリンク先にはESP8266でSDカードを利用する場合の利用方法が記載されています。machine.SD(ピン番号)でブロックデバイスのインスタンスをつくり、それをmountしています。ブロックデバイスを実装しているクラスがRAMディスクと違っています。逆に言うと違いはそれだけです。documentationハードウェア的には、ESP8266にはeMMCインタフェースはありませんので、SPI接続になっています。Piのハードウェアに合わせてSDカードをブロックデバイスとしてアクセスするクラスを作ればいいことになります。●起動時のSDカードの扱いこれまでMicroPythonが移植されたボードでは、MicroPythonは内蔵フラッシュから起動します。PiのようにMicroPython自体がSDカードから起動するデバイスはありませんが、MicroPythonが起動後最初に実行する「boot.py」「main.py」をSDカードから読み取る実装は存在します。STM32シリーズだとpyboardも含め、microSDカードスロットが搭載されているものも結構あります。そのようなボードでは、起動時にSDカードを自動マウントする場合があります。以下のリンク先にはpyboardでの動作が記載されています。documentationSDカードがあればSDカードを/sdにマウント、無ければ内蔵フラッシュのストレージを/flashにマウントし、そのマウントしたフォルダへcdで移動します。boot.pyとmain.pyを実行します。このあたりは、Cで実装しなくても、Pythonで書いてフローズンモジュールとして入れておけば良さそうです。PiのコントローラとSDカードのコントローラの両方の知識が必要です。Associationからダウンロードできます。言って後者の英語のドキュメントを読み解くのはちょっと荷が重そうで、SDカードの制御を知るには以下のChaNさんのページが役に立ちます。インタフェースはSPIが使われていますが、コマンド体系自体が異なるわけではありません。MMC/SDCの使いかたとはいえ、実際にこれらを読み解いて実装するのはかなり大変ですので、ネット上の先人の成果を使わせていただくことにします。Piフォーラムの以下のスレッドでhldswrthさんが公開しているもののようです。Forumsライセンスは特に記載されていません。これをリライトしたものがLdB-ECMさんのもので、ライセンスはCCです。LdB-ECM/Raspberry-Piこれは2500行もありますが、FATの実装を含んでいます。オリジナルにあったバグが対策されているようです。オリジナルのライセンスが不明なので、こちらもsdcard.cについてはライセンスが不明です。Piの非公式?ブートローダであるjncroninさんのrpi-bootにもSDカードの実装があります。MITライセンスです。Pi3用のベアメタルチュートリアルには、SDカードへアクセスする例題が含まれています。」にはセクタを読み出すだけの実装があります。400行足らずとコンパクトで、ライセンスはMITライセンスです。結論から言うと、上記の最後のbztsrcさんの実装をMicroPythonに移植してみることにしました。Licenseで実装されていますので、これと互換性のあるライセンスのコードを用いるのが良さそうです。すると、ライセンスが記載されていないものは避けるべきです。FSの実装は含まれていますので、必要なのは低レベルのI/Oだけです。この条件で見てみると、rpi-bootの実装とbztsrcさんの実装がマッチします。rpi-bootの実装はrpi-bootのファイルシステム実装から呼び出す想定の作りになっていて、これをMicroPythonのvfsに合わせて作り変える必要があります。bztsrcさんの実装は単体でほぼ完結しており、移植しやすそうでした。書き込みはできませんが、ファイルシステムをマウントしてファイルを読み出すことができれば、かなり役に立ちそうです。書き込みが必要になった場合でも、他の実装を参考にセクタを書き込む関数を作るのは、それほど難しくないだろうと思われました。3用ではありますが、レジスタのアドレスが変わるだけで、大きな違いはありません。レジスタの名称がこれまで私が実装したもの(マニュアル記載の名称をそのまま使っています)と同じになっているのは助かりました。このチュートリアルは64bitのチュートリアルなので、long型は64bitです。longに変更します。他にはメッセージをUARTへ出力している部分を書き換えれば、コンパイルは通るようになります。sd.cと、MicroPython用にポーティングしたものとの差分はこんな感じです。boochow/micropython-raspberrypi@c1d43b5●先頭セクタを読んでみる試しに、MicroPythonのmain関数の中で以下のようなコードを実行して、先頭セクタを読んで内容をダンプさせてみました。すると、以下のような感じでちゃんと読み取れました。aaWindows系のシステムでは、容量2TBまでのストレージはMBRと呼ばれる方式で管理されています。0xAAと決まっており、その直前には4つのパーティションテーブル(16バイト×4)が入ります。MBRについては、例えば以下のリンクに詳しく解説されています。