なんとかなるさね

マイコンをネタにブログを始めてみました


RXマイコン基板(RX62N) | USBマルチファンクションファームウェアを作るには? (4) 

今回、マスストレージ + 仮想COMポートの組み合わせで、実際に動作するようにしてみました。RX62N基板の
ファームウェアのソースコードのデバイスディスクリプタやコンフィグレーションディスクリプタ、パソコン側の
INFファイルを書き換え、更に、RX600シリーズ用のUSBアプリケーションノート/ソースコードのUSBフレーム
ワークに手を入れました。結果、Windowsのデバイスマネージャに、マスストレージと仮想COMポートの両方が
表示されるようになり、それぞれ単体で試していた時と同じように動作しました。



なお、Renesas MCU Software LibraryからダウンロードしたUSBフレームワークのソースコードを改造して
いて、ルネサス社内のソースコードレビューをすり抜けてしまったと思われる変な箇所に気付きました。

USB通信では、コンフィグレーションディスクリプタと呼ばれるデータが必要になります。Renesas MCU
Software LibraryからダウンロードしたUSBフレームワークは、ユーザーがカスタマイズしたデータの配列
の先頭アドレスの配列をR_usb_pstd_DriverRegistration()という関数でUSBフレームワークに登録する
ようになっています。(つまり、ユーザーはデータの配列名や先頭アドレスの配列の配列名をユーザの事情で
変更しても構わないように受け取れます。) ところが、USBフレームワーク内で、フレームワーク外のアプリ
ケーション部分で定義されている先頭アドレスの配列の配列名を直接参照している箇所(以下の赤色の部分)
がありました。(それでは、せっかくR_usb_pstd_DriverRegistration()という関数でデータの配列(の先頭
アドレスの配列)を登録する意義が薄れてしまうような気がします。)

また、コンフィグレーションディスクリプタが単一ファンクションのUSBであると仮定している部分(以下の
紫色の部分)もありました。(これはUSBフレームワークの設計仕様だと思うので仕方がないのでしょうが。)
悩ましいのは、HIDも同じ仮定をしていますので、マスストレージと素直に併用することが出来ないことです。

ファイル: MSCFW\PMSC\r_usb_pmsc_pci.c

USB_ER_t R_usb_pmsc_Open(USB_UTR_t *ptr, uint16_t data1, uint16_t data2)
{
。。。途中省略。。。
    /* usb_gpmsc_CbwCbLength parameter set */
    conf_num = usb_pstd_GetConfigNum();
    cp = usb_gpmsc_ConPtr[conf_num - 1];
    /* Interface Descriptor bInterfaceSubClass */
    subclass = (*(uint8_t*)((uint32_t)cp + 15ul));
。。。途中省略。。。
}


関連記事

2013/07/22   blog-entry-312   category: RX /* 32bit CISC */

go page top