Azure Sphere 19.02がリリース

Azure Sphere 19.02がリリースされました。

azure.microsoft.com

このブログ記事から気になる点のピックアップと、リリースノートを確認したいと思います。

ブログ記事

わたしが気になったところだけ抜粋。

Expect to see additional silicon announcements in the near future,

今はMT3620一択ですが、近いうちに別のチップが発表されることを示唆しています。

organizations will be able to use new peripheral classes (I2C, SPI) from the A7 core.

A7(Cortex-A7)から、I2CとSPIが使えるようになりました。
I2CはSeeed製Grove Shield併用で通信できたので気になりませんが、SPIは出来なかったので、SPI使いたい人には朗報ですね。

adding new platform support for critical networking services (DHCP and SNTP)

プライベートイーサネットDHCPとSNTP追加されました。
プライベートイーサネット、、、ゲートウェイ用途が多いのかなぁ。IIoTとか。

by leveraging our new reference solutions and hardware modules,

リファレンスソリューションとハードウェアモジュールが増えました。
リファレンスソリューションはこれ。AzureIoTとI2C, SPIは気になるので後で見る。
ハードウェアモジュールは、、、具体的に何だろう?ブログからは分かりませんでした。

リリースノート

docs.microsoft.com

新機能と変更

SPI

MT3620のSPIサポートが追加されました。(BetaAPI) (^^)/
APIこちら

I2C

MT3620のI2Cサポートが追加されました。(BetaAPI) (^^)/
APIこちら

DHCPサーバとSNTPサーバ

プライベートイーサネットDHCPサーバとSNTPサーバのサポートが追加されました。
(プライベートイーサネット試している人って、どれくらいいるんだろう??)

アプリケーションサイズとストレージ

フラッシュメモリの1MBを、アプリケーションを展開するイメージパッケージで使えるようになりました。
Flash、RAMに関して、詳しくはこちら
アプリケーションのメモリ使用状況を知ることができるようになりました。こちら。これはかなりうれしい。
また、azsphere device sideload show-quotaコマンドでmutable storageの使用量を表示できるようになりました。

アプリからread-only flash storageが読めるようになったっぽい。18.02でも出来たのかな?

Azure IoTサポート

Azure Sphere OSに入っているAzure IoT SDKを2018/10 LTSバージョンに更新しました。
Azure IoT CentralやAzure IoT Hubに繋ぐことができます。

ぱっと見、Azure IoT Centralは未だ辛そう... 要調査。

OSアップデートのリカバリ

Azure Sphere OSは、デバイス起動に失敗する可能性があるアップデートを検知して、ロールバックします。

CMake

CMakeのプレビューを公開しました。

BLE経由のWi-Fi設定

BLEからWi-Fiを設定するリファレンスソリューションを更新しました。

OSフィード

OSフィードをPreview MT3620から、

  • Retail Azure Sphere OS
  • Retail Evaluation Azure Sphere OS <- 追加

にしました。

くわしくはこちら

将来、Retail Evaluation Azure Sphere OSRetail Azure Sphere OSよりも2週間前にリリースされる予定。(いまは同時リリース)

旧リリースとの互換性

(省略。Previewなんだから、最新の19.02で再構築しましょう。)

既知の問題

詳細はリリースノートを見てください。

  • Visual Studio 2017とVisual Studio 2019 Previewの両方をインストールしているとき
  • azsphere device wifi show-statusdevice error 13.1
  • パスにASCII以外(日本語とか)が含まれているのは未サポート
  • C++コードでビルドエラーは発生しないが未サポート。(C言語のみサポート)

Seeed ReButtonでメール送信

この記事の続きです。

matsujirushi.hatenablog.jp

ReButtonを押すとAzure IoT Centralにメッセージが飛んで記録されるところまで出来たので、今回はAzure IoT Centralにメッセージが来たらEメールを送信する、、、バックエンドの設定をやってみたいと思います。

ボタンを押すとAzure IoT Centralに表示される

まず、前記事の設定が正しく動いているか確認します。

ボタンをシングルクリックして、Azure IoT Centralにメッセージが届くことを確認。

f:id:matsujirushix:20190128211401p:plain

よしよし、ちゃんと動くぞ。

ルールを追加

メッセージが届いたときにEメール送信するにはルールというものを追加します。

まず、ルールを選択して、テンプレートの編集をクリックしてください。

f:id:matsujirushix:20190128211545p:plain

次に、新しい規則をクリックしてください。

f:id:matsujirushix:20190128211625p:plain

テレメトリイベントが表示されるので、イベントをクリックしてください。

f:id:matsujirushix:20190128211920p:plain

名前を適当に入れて、条件+をクリック、測定メッセージを選んでから、保存をクリックしてください。

f:id:matsujirushix:20190128212227p:plain

ちょっと分かりにくいですが、、、
ここまでの操作で、

  • ルールを追加(イベントルール)
  • ルールに、条件を追加(メッセージが発生)

が出来上がりました。

ようするに、

「イベントの”メッセージ”が来たら、なにかやるぞ!」

が設定できた状態です。

次に、Eメール送信を設定します。

アクション+をクリックして、電子メールをクリックしてください。

f:id:matsujirushix:20190128212819p:plain

そして、終了(!?)に、Eメールアドレスを入力してから、保存をクリックしてください。
このEメールアドレスは、Azure IoT Centralにサインインしたメールアドレスを入力してください。

終了ってなんだ??と思うでしょうが、、、英語表示にするとToですw

f:id:matsujirushix:20190128213212p:plain

最後に、テンプレートの編集のDoneをクリックしてください。

f:id:matsujirushix:20190128213317p:plain

ボタンを押す!

ボタンをシングルクリックすると、、Eメールが届くようになりました!!

f:id:matsujirushix:20190128213616p:plain

Eメールの宛先を増やす

Eメールの宛先は、Azure IoT Centralに登録されていて、かつ、サインインしたアドレスしか指定することができません。

ユーザーは、管理 > ユーザー で追加することができます。

f:id:matsujirushix:20190128213914p:plain

Seeed ReButtonを動かしてみる

マイクロソフトが開催している、IoT in Actionというイベントシリーズがあるのですが、

iotinactionevents.com

私たちはパートナー企業やお客様とともにあり、IoTの導入によって企業が驚くほど革新的に変わっていく様子を何度も目撃してきました。IoT in Action イベントシリーズは、マイクロソフトのお客様とパートナーエコシステムを活用して、世界を変える新しいIoTソリューションを構築・展開するためのコラボレーションの機会を提供します。

一部地域で開催されたイベントで、アンケートに答えると、なななんと!マイクロソフトとSeeedが一緒に作った、ReButton(非売品)が配られていたんです!!

そして、昨日東京で開催されたイベントでも、ReButtonの配布がありました。

f:id:matsujirushix:20190123142727p:plain

何ができるのか?をざっくり(一例?)書くと、

  • ボタンのクリック(5種類)をAzure IoT Centralに通知
  • Azure IoT Centralでクリックしたタイミングを可視化
  • Azure IoT Centralから外部サービスに連携(メール通知とか)

で、単四電池2本で動くWi-Fi接続型のボタンです。

詳細は公式ドキュメントを見ていただくとして、ここでは、ボタンをクリックしたらAzure IoT Centralに表示されるまでのセットアップ方法を書いておきます。

ハードウェア

電池を入れる

裏蓋を外して、単四電池2本を入れてください。
蓋はシリコン製なのでグンニャリします。隙間にツメを突っ込んで引っ張り上げれば簡単に外れると思います。

f:id:matsujirushix:20190123144404p:plain

電池を入れるとこんな感じになります。

f:id:matsujirushix:20190123144522p:plain

電池を入れたら、裏蓋は元の状態に戻してください。

ボタン操作を練習する

ReButtonは、最初のクリックの反応が遅いです。これは、ボタンを押したときに回路の電源スイッチがONして動き出そうとしている時間です。
そのため、最初のプッシュはちょっと長めに押し続ける必要があります。「強く押す」ではありません!「長く押す」です

コツとしては、、、LEDが青色に点灯するまで押して、青色になったら離す。ちょっとコツが必要ですw

ボタンの内部プログラムでは、

  1. 押す→LEDが青色に
  2. 離す→LEDは青色のまま
  3. 1秒間放置→シングルクリックと判断
  4. クラウドへ通知しようとしてエラー(LEDが赤色で3回点滅)

とクリックを判定しています。

まだWi-FiやAzure IoT Centralが設定されていないため、エラー(LEDが赤色)になります。

また、3.の1秒間放置のときに押すと、ダブルクリック、トリプルクリックと変化して、LED表示が変わります。

クリック種類 LED色
シングルクリック
ダブルクリック
トリプルクリック

何回か試してみて、クリックのコツを掴みましょうw

10秒長押しすると、LEDが消灯しなくなります。(白色の点滅) そうなったときは、一度電池を抜いて電源を断ってください。

Azure IoT Central

Azure IoT Centralを用意する

Azure IoT Centralにアクセスして、マイクロソフトアカウントでサインインしてください。アカウントを持っていない場合は、作成を選んで、アカウントを作ってください。

f:id:matsujirushix:20190123150822p:plain

Azure IoT Centralのアプリケーションマネージャーが表示されたら、新しいアプリケーションをクリックしてください。

f:id:matsujirushix:20190123151124p:plain

アプリケーションの作成に必要な情報を入力します。
Azureサブスクリプションを持っているなら、重量課金制を。持っていないorまずは動くのを見たいだけなら、評価版を選択してください。
アプリケーションテンプレートはカスタムアプリケーションを。
アプリケーション名とURLは任意なので分かりやすいものを入れてください。

f:id:matsujirushix:20190123151509p:plain

このように表示されれば成功です。

f:id:matsujirushix:20190123151722p:plain

これを、Azure IoT Centralのアプリケーションと言います。

Azure IoT Centralアプリケーションにテンプレートを追加する

アプリケーションビルダー画面を表示してください。
右側にある下から3つ目のアイコンをクリックすると表示されます。

f:id:matsujirushix:20190123152401p:plain

バイステンプレートの作成をクリックしてください。

f:id:matsujirushix:20190123152448p:plain

カスタムをクリックしてください。

f:id:matsujirushix:20190123152920p:plain

バイステンプレートの名前に分かりやすい文言を入れて、作成をクリックしてください。

f:id:matsujirushix:20190123153103p:plain

これで、テンプレートが追加され、そこにシミュレートのデバイスが1つ追加された状態になりました。

バイスエクスプローラを見ると、テンプレートとデバイスを確認することができます。

f:id:matsujirushix:20190123153740p:plain

自動的に作成されたシミュレートのデバイスは、削除しても問題ありません。

バイスを追加する

テンプレートを作成すると、デフォルトでシミュレートのデバイスが1つ追加されますが、これをそのまま物理デバイスに紐づけることはできません。
物理デバイスを追加する必要があります。

バイスエクスプローラのデバイス一覧の上にあるプラスマークをクリックして、実際(英語だとReal)を選択してください。

f:id:matsujirushix:20190123155526p:plain

バイスを分かりやすい文言に変更して、作成をクリックしてください。

f:id:matsujirushix:20190123155706p:plain

このように表示されれば成功です。

f:id:matsujirushix:20190123160120p:plain

イベントにメッセージの項目を追加する

ボタンから送られてくるメッセージを、テンプレートに追加します。
テンプレートに追加ですが、、、実際の操作は、デバイスを選んでから、テンプレートの編集という流れになります。(ちょっと分かりにくい)

バイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、テンプレートの編集をクリックしてください。

f:id:matsujirushix:20190123160257p:plain

新しい測定をクリックして、イベントを選択してください。

f:id:matsujirushix:20190123160432p:plain

Display Nameにメッセージ、フィールド名にmessage、規定の重要度を情報にして、保存をクリック、最後にDoneをクリックしてください。
フィールド名は、必ずmessageと入れてください。

f:id:matsujirushix:20190123160701p:plain

イベントの欄に、メッセージが追加されていれば成功です。

f:id:matsujirushix:20190123160929p:plain

接続情報を取得

後でReButtonに設定する、Azure IoT Central(のデバイス)への接続情報を取得します。

バイスエクスプローラでデバイス一覧を表示して、デバイスをクリックしてください。
そして、右上の接続をクリックしてください。

f:id:matsujirushix:20190123161153p:plain

表示されたデバイス接続情報のうち、

を、後で使うのでメモ帳などにコピーしてください。

f:id:matsujirushix:20190123161258p:plain

ReButton

ReButtonをAccess Pointモードで起動して、パソコンからReButtonに接続、WebページでWi-FiアクセスポイントとAzure IoT Centralの接続情報を設定します。

ReButtonをAccess Pointモードで起動

ボタンを押し続けてください。10秒以上。 この間、LEDが青色→黄色→水色→白色と変化します。白色になったら、ボタンを離してください。

すると、ボタンがAccess Pointモードで起動して、LEDが白色の点滅になります。

ReButtonのアクセスポイントに接続

AZB-xxxxxxxxという名前のアクセスポイントがReButtonです。
パソコンからこのアクセスポイントに接続してください。

f:id:matsujirushix:20190123162130p:plain

接続操作すると、接続試行中で時間がかかりますが、接続試行中表示のまま、次の作業に進んでください。

Wi-FiとAzure IoT Centralの接続を設定する

任意のブラウザで、http://192.168.0.1/ にアクセスしてください。

f:id:matsujirushix:20190123162616p:plain

Wi-Fiをクリックして、SSIDパスフレーズを入力、Saveをクリックしてください。

f:id:matsujirushix:20190123163102p:plain

Homeをクリック、Azure IoT Centralをクリックしてから、

を入力して、Saveをクリックしてください。

f:id:matsujirushix:20190123163321p:plain

最後に、Shutdownをクリックしてください。

ボタン通知

ボタンをクリックすると、、、
Azure IoT Centralにメッセージが通知され、Webで確認することができます!

f:id:matsujirushix:20190123170510p:plain

Azure SphereのOSアップデートの挙動を調べた

以前から、OSアップデートするときにアプリケーションはどうなるのか気になっていた、、、

  • OSのダウンロード中にアプリは停止するのか?
  • アプリの停止は事前に通知されるのか?
  • アプリの停止時間は?

のですが、1/10にAzure Sphere OS 18.11.2のOSアップデートがOTA配信開始したので、挙動を調べることに。

挙動を調べるためのコード

アプリが再起動するため、Visual Studio(やgdb)でLog_Debugを見て確認することができません。 そこで、UARTに連続してデータを出力して、それをロジックアナライザでキャプチャすることにしました。
アプリは、起動時に"STX\n"を送信した後、0x00~0xffを連続して送信し続けます。SIGTERMを受けたら、"ETX\n"を送信して終了。

int main(int argc, char *argv[])
{
    Log_Debug("Application starting.\n");

    // Register a SIGTERM handler for termination requests
    struct sigaction action;
    memset(&action, 0, sizeof(struct sigaction));
    action.sa_handler = TerminationHandler;
    sigaction(SIGTERM, &action, NULL);

    UART_Config config;
    UART_InitConfig(&config);
    config.baudRate = 115200;
    config.flowControl = UART_FlowControl_None;
    int uartFd = UART_Open(MT3620_UART_ISU3, &config);
    assert(uartFd);

    write(uartFd, "STX\n", 4);

    char data = 0;
    while (!terminationRequired) {
        int ret = write(uartFd, &data, 1);
        if (ret == 1) data++;
    }

    wait_ms(100);  // easyio
    write(uartFd, "ETX\n", 4);
    wait_ms(100);  // easyio
    close(uartFd);

    Log_Debug("Application exiting.\n");
    return 0;
}

実行手順

色々と試しましたが、、、この流れがベストのようです。

  1. azsphere device recoverでOSを18.11にする。
  2. azsphere device prep-debug
  3. VSからアプリを実行して、停止。(Flashにアプリを入れる)
  4. ロジックアナライザを接続。
  5. resetボタンをクリック。
  6. ロジックアナライザがキャプチャできていることを確認。
  7. azsphere device wifi addして、azsphere device wifi listでconnectedになることを確認、すぐにresetボタンをクリック。←この操作は短時間に!
  8. 10分くらいキャプチャし続ける。

実行結果

  • アプリが起動してから(OSアップデートで)停止するまで、約377秒(約6分)
  • (OSアップデートで)アプリ停止時間、約83秒(約1分)
  • OSのダウンロードがアプリ稼働中か停止中かは、判断つかなかった。

f:id:matsujirushix:20190114102756p:plain

  • アプリ停止直前は、SIGTERMシグナルが来ていた。

f:id:matsujirushix:20190114103803p:plain

まとめ

実運用では、OSアップデートで1分くらい停止しても大丈夫なように、全体設計しておく必要がありそうです。

Azure Sphereの18.11がマイナーアップデート

Azure Sphere 18.11がマイナーアップデートされました。

azure.microsoft.com

リリースノートから、どんな変更点があったのか?確認したいと思います。

18.11,18.11.1,18.11.2リリースノート

リリースノートはこちらです。

docs.microsoft.com

18.11リリースノートを変更して、18.11.1と18.11.2が追加されています。

18.11.1と18.11.2が同時リリースってちょっとおかしくない?という感じですが、

  • SDKが、18.11 -> 18.11.1
  • (デバイスの)OSが、18.11 -> 18.11.2

ということで、OSの18.11.1は存在しないようです。

SDK 18.11.1 リリース

Private Ethernetの機能が追加されました。

これだけなので、この機能を使わないなら、SDKをアップデート不要です。

なお、SDK 18.11から18.11.1へアップデートは自動ではありません。SDK18.11.1をダウンロード、インストール操作してください。

OS 18.11.2 リリース

Azure SphereバイスWi-Fiに接続できない問題が解決されました。

OS 18.11から18.11.2はOTAで自動的にアップデートされます。更新は10分以内です。
18.11.2になると、azsphere device image list-installed --fullを実行して表示されるNW KernelのImage IDが44ed692e-ce49-4425-9aa6-952b84ce7b32になります。

感想

  • 通常、SDKのアップデートは不要でしょう。
  • OSのアップデートは、、、不要であっても、インターネットに接続していると勝手に更新しますねこれ。Wi-Fi接続できないのは稀にあったので大変嬉しい。
  • マイナーアップデートが出たことで、OSのアップデートの挙動を調べることが出来そう。後日、調べようと思う。

C#コードでMT3620を動かしてみた

Seeed UG Advent Calendar 2018の23日目に誰をも寄せ付けないクレイジー面白そうな記事が投稿されました。

www.kekyo.net

MT3620セットアップに始まり、Cサンプルコードの解説、C#で開発するためのビルド環境の整備、C#からCのInterop、疑似イベント駆動と、すげー長いので、、、

「とりあえず、ビルドして動かしてみたい」

というライトなユーザー向けに、ブログを書いておこうと思いました。

MT3620でC#を動かすテクノロジー「IL2C」

現在、MT3620の開発言語はC言語だけです。
じゃあ、どうやってC#を動かすのか?ですが、C#コードをビルドした結果のMSILを、IL2C.Coreを使ってCコードを生成して、そのCコードをCコンパイラでビルドして、実行のバイナリイメージを作成、MT3620で実行します。(下図の右側)

C#コード -> ビルド -> MSIL -> IL2C.Core-> Cコード -> ビルド -> バイナリイメージ

IL2C.Coreが生成したCコードは、それ単独をビルド、実行することができません。IL2C.CoreでCコードを生成するときに、IL2C.Runtimeを呼び出すCコードを出力しているからです。そのため、Cコードのビルド時にIL2C.Runtimeも加える必要があります。(下図の左側)

大きく、

  • IL2C.Core
  • IL2C.Runtime

の2つが重要!

f:id:matsujirushix:20181229155302p:plain

IL2C.CoreIL2C.Rumtimeがどこから来るのかというと、、、kekyoさんが鋭意開発していて、全ソースが彼のgithubに上がっています。

github.com

あと、上図の「IL2C」はIL2C.Buildという名前でnugetに上がっているので、実際に必要になるものは、

  • IL2C.BuildIL2C.Coreが含まれている)
  • IL2C.Runtime

ってことになります。

MT3620のサンプルコードを動かす

それでは、用意されているサンプルコードを動かしてみましょう。

MT3620の開発に必要な、ボード購入やらAzureSphereSDKインストール、デバイスのクレームなどは省略で。ググってください。Visual Studioを使って、(C言語で)MT3620を開発、実行ができている前提で。

必要なファイルをコピー

kekyo/IL2CリポジトリIL2C.Runtimeライブラリとサンプルコードが含まれています。ローカルにクローンしてください。

git clone https://github.com/kekyo/IL2C.git

サンプルコードのソリューションを開く

Visual Studioで、samples/AzureSphere/AzureSphere.slnを開いてください。
3つのプロジェクトが含まれているはずです。 f:id:matsujirushix:20181229171806p:plain

デフォルトでスタートアッププロジェクトが不適切なので、、、
Mt3620Appプロジェクトを右クリックして、スタートアッププロジェクトに設定を選択してください。Mt3620Appが太字で表示されればOKです。

ビルド&実行

PCにMT3620を接続して、デバッグ実行してください。

すると、自動的にnugetからIL2C.Buildをダウンロードしてきて、あれやこれやをやった後に、MT3620へデプロイ、プログラムが実行されます。

おまけ

C#コードでブレークポイントやステップ実行ができるぅ!!!
謎技術。 (さすがに、変数ウォッチはできません。) f:id:matsujirushix:20181229173449p:plain

<kekyoコメント>
デバッグ時の変数の参照は、プリミティブ型であれば見えると思う。オブジェクト参照は、frame__の下に入ってるけど、コードが抽象型で書かれていて、実際のインスタンスが具象型の場合は正しく見えない可能性がある あとラムダ式で変数キャプチャすると、クロージャ型の中を見ないと見えないけど、ローカルスタックフレームのどれがそのクロージャ型のインスタンスなのかを特定するには、いくつかツリーを開いて中身確認してみないとわからないかも知れない

今回、MT3620視点で書いていますが、、、 サンプルコードに、AzureSphere以外のmicro:bitやWio LTE、M5Stackもあるので、今後が楽しみですね。

ChibiOSを調べる

nanoFrameworkの土台がChibiOSなので、ChibiOSを調査します。

ドキュメントはこちら。 ChibiOS free embedded RTOS - ChibiOS Homepage

ソースはこちら。 GitHub - ChibiOS/ChibiOS: Read only mirror of SVN ChibiOS repository. Official forum http://forum.chibios.org Bugtracker http://sourceforge.net/projects/chibios

Product Information

  • ライセンスは、GPL3 or Apache 2.0。
  • ChibiOSは4つのプロダクトで構成されている。
    • RT ... fastest RTOS
    • NIL ... smallest RTOS
    • HAL ... set of abstract device drivers
    • ChibiStudio ... development environment

ChibiOS/RT 3.0 The Ultimate Guide

ChibiOS General Archietcture

  • ChibiOS/RT ... the RTOS scheduler.
  • ChibiOS/HAL ... the Hardware Abstraction Layer enclosing abstract drivers for most common peripherals.

The Big Picture

f:id:matsujirushix:20181225221606p:plain

  • Startup Code ./os/common.ports ... The code executed after the reset.
  • Application ... the user code. main()
  • ChibiOS/RT
    • RT Portable Kernel ./os/rt ... the RTOS kernel which is architecture and compiler independent.
    • RT Port Layer ./os/rt/ports ... the RTOS kernel specific. ←./os/common/portsを使ってる??
  • ChibiOS/HAL

    • HAL API Layer ./os/hal ... The HAL portable code.
    • HAL Port Layer ./os/hal/ports ... the device driver implementations for a specific MCU.
    • HAL Board Layer ./os/hal/boards ... all details of a specific board.
    • HAL OSAL Layer ./os/hal/osal ... the Operating System Abstraction Layer.
  • RT does not need HAL

  • HAL uses RT's services through the OSAL

ChibiOS products directory organization

*****************************************************************************
*** ChibiOS products directory organization                               ***
*****************************************************************************

--{root}                - Distribution directory.
  +--os/                - ChibiOS products, this directory.
  |  +--rt/             - ChibiOS/RT product.
  |  |  +--include/     - RT kernel headers.
  |  |  +--src/         - RT kernel sources.
  |  |  +--templates/   - RT kernel port template files.
  |  |  +--ports/       - RT kernel port files.
  |  |  +--osal/        - RT kernel OSAL module for HAL interface.
  |  +--nil/            - ChibiOS/NIL product.
  |  |  +--include/     - Nil kernel headers.
  |  |  +--src/         - Nil kernel sources.
  |  |  +--templates/   - Nil kernel port template files.
  |  |  +--ports/       - Nil kernel port files.
  |  |  +--osal/        - Nil kernel OSAL module for HAL interface.
  |  +--hal/            - ChibiOS/HAL product.
  |  |  +--include/     - HAL high level headers.
  |  |  +--src/         - HAL high level sources.
  |  |  +--templates/   - HAL port template files.
  |  |  +--ports/       - HAL port files (low level drivers implementations).
  |  |  +--boards/      - HAL board files.
  |  +--common/         - Files used by multiple ChibiOS products.
  |  |  +--ports        - Common port files for various architectures and
  |  |                    compilers.
  |  +--various/        - Various portable support files.
  |  +--ext/            - Vendor files used by ChibiOS products.