GR-MANGOを使って、FreeRTOS上でGR-USB/HOST#を動かしてみる

つぶつぶコラム

今回はコア社より発売されているGR-MANGOボードを使って、当社のGR-USB/HOST#を動かしてみようと思います。

GR-MANGOにはルネサス エレクトロニクス社より発売されている、RZ/A2Mチップが搭載されています。RZ/A2Mの詳細はルネサス エレクトロニクス社のホームページなどでご確認ください。

GR-MANGOのコネクタの位置などはRaspberry Pi4と似ていますので、Raspberry Pi4をお持ちの方はケースなどを流用できるかもしれません。

今回はGR-MANGOを使ってUSBメモリにアクセスしてみようと思います。

使うもの

  • GR-MANGOボード
  • USBケーブル(電源、仮想シリアル用 GR-MANGO側はMicroBコネクタ)
  • J-LINK(本体とUSBケーブル、GR-MANGOと繋ぐ変換ケーブル)
  • USBメモリ
  • e2studio(Ver.202104)
  • TeraTerm
  • ブリンクサンプルプロジェクト
  • USBマスストレージ統合キット(GR-USB/HOST# for RZ/A2M用)

GR-MANGOボードですが、デバッガ用の10ピンコネクタを付ける必要があります。シルクでは「JTAG」と印刷されている部分です。(Type-Cコネクタの付近です。)

ハーフピッチの5×2のピンヘッダーをはんだ付けする必要があります。(お使いのケーブルによってはキーのピンを抜いておく必要があるかもしれません。)

e2studioとブリンクサンプルプロジェクトはルネサス エレクトロニクス社のホームページからダウンロードしました。(ブリンクサンプルプロジェクトはr01an5595xx0200-rza2m-swpkg-grmango-gccに含まれるrza2m_blinky_sample_freertos_gcc.zipを使用します。)

ブリンクサンプルプロジェクトはすでにFreeRTOSが実装されているので手間を省くために使用しました。(e2studioでもFreeRTOSのプロジェクトを生成できますが、デモなどの余計なコード類が入ってくるので今回は使いません。)

※2023年1月現在、r01an5595xx0200-rza2m-swpkg-grmango-gccはRenesas社HPから削除されていてDLできません。

ブリンクサンプルプロジェクトの動作確認

使うものが揃ったら繋げて早速ブリンクサンプルプロジェクトの動作確認を行います。動作確認と言ってもe2studioにインポートして、ビルドしてデバッガで書き込むだけですが…

正常に動作するとボードのLEDが点滅すると思います。

技術者
技術者

筆者は rza2m_blinky_sample_freertos_gcc.zip をインポートしていますが、やりやすい方法で良いと思います。

GR-USB/HOST# for RZ/A2Mのポーティング

当社のRZ/A2M用のGR-USB/HOST#は、実はFreeRTOS環境で動作確認を行っていますですので、FreeRTOSへのポーティングは省略できます。

技術者
技術者

これがあったので今回の記事にしています(^^;)

ですが、動作確認を行ったのはGR-MANGOではないので、このあたりのポーティングは必要になります。

回路図の確認

今回はRZ/A2MのUSBのうちUSB0側を使用しようと思います。ですのでUSB0がGR-MANGOのコネクタにどのように繋がっているかを確認します。

GR-MANGOの回路図はコア社のホームページからダウンロードできます。

技術者
技術者

アンケートには答える必要がありますが(^^;)

回路図を確認するとUSB0はGR-MANGOのUSBコネクタのうち下段側に繋がっていることが分かります。また、VBUSとオーバーカレントの信号がP1_0とPJ_5に繋がっていることも分かります。あと確認するのはクロックの入力です。RZ/A2MのUSBではクロックソースをEXTALかUSB_X1かを選択できます。

GR-MANGOの回路図を見るとUSB_X1はGNDに接続されているためクロックソースとしては使えないことが分かると思います。必然的にEXTALを使うことになります。

プロジェクトの作成

早速e2studioを起動してプロジェクトを作っていきます。

今回は当社製品ごとにライブラリを作っていき、最終的にはブリンクサンプルプロジェクトをベースにしたアプリケーションプロジェクトとリンクします。

技術者
技術者

もちろん1つのプロジェクトにソースファイルを入れてビルドすることもできます。


USBマスストレージ統合キットは以下の当社製品が含まれています。

GR-VOS(FreeRTOS用):OSの違いを吸収するモジュール。使用するOSごとにポーティングが必要。
GR-USB/HOST# for RZ/A2M:RZ/A2M内臓のUSBコントローラを操作するUSBドライバ。
GR-USB/HOST# Mass Storage Class Driver:USBのマスストレージ機器を操作するクラスドライバ。
FSIF(File System I/F) modules:クラスドライバとファイルシステムの橋渡しを行うモジュール
GR-FILE:FATファイルシステム

それぞれ、必要なソースをプロジェクトに追加します。(この辺りは各製品のドキュメントを見てください。)

当社製品は機能モジュールごとにディレクトリが分かれているため、インクルードパスの設定が多くなります。この設定を簡単にしたい場合は、一つのディレクトリにソースファイルをまとめて入れておくことで設定数を減らせます。この辺りはお好み次第でOKです。

最後にGR-FILEに付属しているサンプルアプリケーションを使ってライブラリではなく実行可能なプロジェクトを作成します。

技術者
技術者

もしかしたらサンプルアプリだけ別ディレクトリに移してプロジェクトを作成する方が楽かもしれません。

各プロジェクトの変更

GR-VOS

GR-VOSはOSの違いを吸収するための処理を実装します。本来はGR-VOSのすべてがサンプルで、お使いになるOSに対応した処理をお客様に実装していただくモジュールですが、既に当社で動作確認を行った処理が実装されています。(当社で動作確認しているものはITRON、μC3、AzureRTOS ThreadX、FreeRTOSがあります。これ以外は作成する必要があります。)

ですので、実装されている処理は変更の必要はありませんが、設定値を変える必要があります。

GR-VOSには、GR-VOSが使うOSの資源数を管理しています。今回の構成ではGR-VOSのデフォルトの設定値では足りない為変更が必要です。

と言っても難しいことは無く、grp_vos_cfg.hファイルのGRP_VOS_MAX_SEMの値を30程度まで増やすだけです。少し乱暴ですが余る分には少しのRAMを使用するだけなので、大きめに設定する方が最初の動作開始まで早く作業できると思います。(RAMが少ない環境ではギリギリで設定する場合もあります。)

GR-USB

GR-USBもFreeRTOSでの動作確認を行っているのであまり変更はありませんが、使用するUSBコントローラや端子などの処理が変更になります。

動作確認はルネサス エレクトロニクス社から発売されているRSKボードで行っていますが、今回はGR-MANGOを使用するため、この違いを修正する必要があります。

このあたりの違いに関しては、回路図の確認の際にも出てきていますので少し前に遡って確認してみてください。

変更するソースファイルはgrp_rza2m_target.cです。grp_rza2m_target.cは2つ見つかると思いますが、片方は処理が実装されていないスケルトンのファイルです。これは、RSKボード以外の、例えばお客様が作成されたカスタムボードなどに対する処理を記述していただくためのファイルです。もう一つはRSKボード用にポーティングされたファイルです。今回使うGR-MANGOはRSKボードと大きな違いがないのでこちらのファイルを流用します。

変更する箇所は以下のようになります。

クロック設定をGRP_RZA2M_PHYCLK_USB_X1からGRP_RZA2M_PHYCLK_EXTALに変更

r_usbh0_tusb320hi_host_setting関数内の処理を削除(RSKボードではVBUSなどの制御にi2cが必要でしたのでこの関数にi2Cの初期化処理が記載されています。)

usbh0_cstd_PortInit関数内のピン設定をP1_0とPJ_5に変更(設定値はRZ/A2Mのハードウェアマニュアルを参照ください。元の値ではダメです。)

なお、usbh0_cstd_PortInit関数先頭のIRQ6の処理は当社の動作確認時のデバッグ用の処理なのでコメントアウトして構いません。

GR-FILE

GR-FILEではいくつかのファイルに変更が必要ですし、不要なファイルもありますので、ファイルを削除するか、e2studioの機能でビルド対象から外してください。

先に不要なファイルを書いておきます。

\gr_file_v1.31-201229\src\mdep_itron

\gr_file_v1.31-201229\src\mdep_vos

\gr_file_v1.31-201229\src\mdep_vos2.xx\lib\grp_time\grp_time_set.c

これらのディレクトリ、ファイルは、今回は不要です。何のためのファイルなのか知りたい方はGR-FILEのマニュアルに記載があるので確認してみてください。

次に変更の必要なファイルを書いておきます。

\gr_file_v1.31-201229\src\mdep_vos2.xx\base\grp_fs_mdep_if.c

\gr_file_v1.31-201229\src\mdep_vos2.xx\lib\grp_time\grp_time_get.c

grp_fs_mdep_if.cではgrp_fs_printf関数の出力先をポーティングする必要があります。これはGR-FILEからのエラー文字列出力先でもありますし、grp_fs_printf関数をアプリケーションでも使います。システムに依存する部分なので必ずコンパイルエラーが発生するようにしています。今回はコメントのみコメントアウトします。(cons_putchar関数はアプリケーションで別途用意します。)

grp_time_get.cではファイルのタイムスタンプのために現在の時刻を返す関数です。この関数もシステムに依存するのでコンパイルエラーが発生するようにしています。今回は、タイムスタンプは使わないことにしますのでpiTimeと関数の戻り値として-1を設定します。(コメント部分をコメントアウトします。)

アプリケーション

ブリンクサンプルプロジェクトをベースにしてUSBマスストレージ統合キットのソースを追加します。

もちろん、ブリンクサンプルプロジェクトをコピーして別名のプロジェクトを作成してもOKです。

ブリンクサンプルプロジェクトにはmain.cがありますので、これを改造することにします。

GR-FILEに付属しているサンプルアプリケーション(\gr_file_v1.31-201229\src\sample\app\vos2.xx\gr_file_sample_no_console\test_main.c)とmain.cをマージします。(マージした後、\gr_file_v1.31-201229\src\sample\app\内のファイルはビルド対象外とするか、削除します。)

os_main_task_t関数にR_OS_TaskCreate関数でタスクを作成している部分がありますので、これをコメントアウトし、代わりにtest_main.cにあるGR製品の初期化関数のGRUSB_Test_Stack_Init関数を呼ぶようにします。

この時、GRUSB_Test_Stack_Init関数から戻ってきた後os_main_task_t関数を抜けてしまうと上位関数で無限ループに入りますのでos_main_task_t関数から抜けずタスクが休止するようにします。

GR-FILEに渡すメモリプールと読み書きするバッファを非キャッシュ領域に割り当てます。

非キャッシュ領域に割り当てるものは他にGR-USBのCMEM領域も割り当てる必要がありますが、こちらはすでにセクションの記述が入っていますのでlinker_script.ldファイルにセクションを設定するだけになります。ですがアプリケーションで使用するバッファやGR-FILEに渡すメモリプールはセクションの記述がないので記述する必要があります。

記述したセクション名とCMEMのセクション名をlinker_script.ldのUNCACHED_RAMに割り当てるようにlinker_script.ldを書き換えます。

ここで注意したいのはlinker_script.ldとe2studioのMMU設定が対応していることです。linker_script.ldはビルド時にリンカに渡されますが、linker_script.ldの内容がMMU設定に反映されるわけではないので、もし異なっていると想定外の動作をしかねません。

linker_script.ldに新しくセクションを追加する変更箇所
スマートコンフィグレータのMMU設定の様子

次にUSB0コントローラを使う設定を行います。r_startup_config.hのSTARTUP_CFG_DISABLE_USB0の定義値を0に変更します。少しわかりにくいですが、使用する場合に0にするようです。

最後に割り込み優先度の最大設定値を変更します。FreeRTOSConfig.hのconfigMAX_API_CALL_INTERRUPT_PRIORITYを20に変更します。

その他、ヘッダーファイルのインクルードの追加などの細かいマージと、プロジェクトのインクルードパスの設定等を行います。

ポーティングでの変更は以上ですが、printfの出力先としてシリアルが使えます。Mbed経由での出力ですが情報を出力できるのはありがたいのでスマートコンフィグレータでrsci4が有効になっているか確認しておきます。(ブリンクサンプルプロジェクトではすでに有効になっています。)

修正は以上になります。

ビルドを行い実行可能ファイルが生成されていることが確認出来たらOKです。

動作確認

では、GR-MANGOに書き込んで動作を確認してみます。

GR-MANGOにJ-LINKを繋ぎ、パソコンにJ-LINKとGR-MANGOをUSBケーブルで繋ぎます。この時、GR-MANGOにUSBケーブルを繋ぐとすぐに電源投入となるので扱いには注意してください。(ブリンクサンプルプロジェクトの動作確認を行っていればすでに接続されていると思います。)

正常に繋がるとPCにエクスプローラが立ち上がると思います。これはGR-MANGOがMbedに対応しているためです。今回はJ-LINKを使うのでエクスプローラを閉じてOKです。

GR-MANGOからの文字列がprintf関数により、シリアルで出力されます。実際にはMbedのUSBを介してですがPCの仮想シリアルポートに入ってきます。ですので、TeraTermなどのソフトで表示することができます。通信速度は115200bpsです。

E2studioでデバッグを開始するとGR-MANGOにビルドした実行可能ファイルが書き込まれて初期位置でブレイクした状態となると思います。今回のアプリケーションは、あるグローバル変数の値を変更して実行することでUSBメモリにファイルを作成したり読み込んだりするものです。ですので、どこかでブレイクする必要がありますので、この段階でブレイクポイントを設置しようと思います。マージしたmain.cに_usb_test_AppTask関数がありますが、初期化が正常に行われアプリケーションタスクが実行されると、この関数内のwhileループに入ります。Whileループ内のswitch-caseでファイルの読み書きなどの処理を実行します。ですので、switch文の位置にブレイクを設定したいと思います。

実行するとswitch文でブレイクすると思います。ここまで実行できれば初期化などは通っていることになります。ここまで来ない場合は何らかのポーティングがうまくできていないと思いますので見直してみてください。

USBメモリをGR-MANGOに接続します。回路図の確認時も書きましたが、下段のUSBコネクタに接続します。

USBメモリを接続した後、何度か実行を行います。(ブレイクした状態では接続を認識できませんので何度か実行して接続を認識させます。)USBメモリを認識するとシリアルに接続した旨の文字列が出力されます。

接続出来たらブレイク中にグローバル変数(g_ulTestNum)の値を変更して実行することでUSBメモリにアクセスできます。

例えば、g_ulTestNumの値を次のように変更し、実行してみます。

「1」、「20」、「3」、「2」

すると、シリアルへは、マウント、ファイルオープン、ファイル書き込み、ファイルクローズ、ファイルのリスト、アンマウントを行った表示が出力されると思います。(アンマウント実行後、表示が出なかったり中途半端な場合は何度か実行してみてください。シリアル出力の途中でブレイクするため、メッセージが途中までしか送られていないことがあります。)

アンマウントまで出来たら、USBメモリを抜き取り、PCなどで内容を確認します。TEST1.TXTファイルが作成されていると思います。

このように、g_ulTestNumの値を変更して実行することでUSBメモリへのアクセスを行うことができます。

以上で今回の話は終わりです。

それほど苦労することなくFreeRTOSを使ってUSBにアクセスできることがご理解いただけたかと思います。

もし、RZ/A2Mを使ってUSBにアクセスしたい方は当社までお問い合わせください。

■ GR-USB/HOST 製品詳細