なんとかなるさね

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


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

今回、HIDも追加し、HID + マスストレージ + 仮想COMポートの組み合わせで、実際に動作するようにして
みました。HIDの動作確認用のアプリケーションは、Renesas MCU Software Libraryからダウンロードした
RX62Nグループ ルネサススタータキット サンプルコードに同梱されていたRSK_HID.exeを使用しました。
(現在、あまりに酷いやっつけ作業で改造してしまったところを見直し中です。)





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

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

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

ファイル: HIDFW\PHID\r_usb_phid_driver.c

void R_usb_phid_task( USB_VP_INT_t stacd )
{
。。。途中省略。。。
            /* Configuration Discriptor address set. */
            cfgtbl = (uint8_t*)usb_gphid_Configuration;

            /* Set HID Discriptor address from Configuration Discriptor. */
            cfgtbl = (uint8_t *)( (uint32_t)cfgtbl + (uint32_t)18 );
            /* Set HID Discriptor length from Configuration Discriptor. */
            reqlength = (uint16_t)( *(uint8_t*)cfgtbl );
。。。途中省略。。。
}


さらに、USBフレームワーク内で、HIDのインタラプト転送で使用されるパイプ番号(RXマイコンのUSB周辺
回路のリソース)が6であること、およびHIDのインターフェイス番号が0であること、も仮定していました。

(1) パイプ番号(RXマイコンのUSB周辺回路のリソース)が6であると仮定しているところ

ファイル: HIDFW\include\r_usb_phid_define.h

#define USB_PHID_USE_PIPE               USB_PIPE6

ファイル: HIDFW\PHID\r_usb_phid_driver.c

void R_usb_phid_task( USB_VP_INT_t stacd )
{
。。。途中省略。。。
            /* USB Transfer request */
            err = usb_phid_data_trans( mess, USB_PHID_USE_PIPE, mess->tranlen, mess->tranadr );
。。。途中省略。。。
}   /* eof R_usb_phid_task() */

void R_usb_phid_TransferEnd( USB_UTR_t *ptr )
{
    /* End of data transfer(USB0-IP peripheral function) */
    R_usb_pstd_TransferEnd( ptr, USB_PHID_USE_PIPE, USB_DATA_STOP );
}   /* eof R_usb_phid_TransferEnd() */


ファイル: HIDFW\PHID\r_usb_phid_ansi.c

int16_t usb_open_phid( USB_UTR_t *ptr, struct usb_fninfo *p_fnstr, uint8_t devadr, uint8_t speed )
{
。。。途中省略。。。
        /* When Data Class resource is Pipe6 */
        start_pipe_no = USB_PHID_USE_PIPE;
        end_pipe_no = USB_PHID_USE_PIPE;
。。。途中省略。。。
}   /* eof usb_open_phid() */


(2) インターフェイス番号が0であると仮定しているところ(他にも何箇所かあります)

ファイル: HIDFW\PHID\r_usb_phid_driver.c

void usb_phid_ControlSetReport2( USB_UTR_t *ptr )
{
    /* Check Setup packet Request Index and Request Value */
    if ( (usb_gphid_Request.ReqIndex == 0 ) && ( ( usb_gphid_Request.ReqValue & USB_DT_INDEX ) == 0 ) )
    {
        /* Class Request == SET_REPORT */
        if( (uint8_t)USB_GET_DT_TYPE( usb_gphid_Request.ReqValue ) == USB_DT_TYPE_SETREPORT )
        {
            usb_phid_send_message( ptr, (uint16_t)USB_SET_REPORT );           /* Message send for PHID Task */
        }
        else
        {
            /* Set pipe USB_PID_STALL */
            usb_pstd_SetStallPipe0( ptr );      /* Req Error */
        }
    }
    else
    {
        /* Set pipe USB_PID_STALL */
        usb_pstd_SetStallPipe0( ptr );          /* Req Error */
    }
}   /* eof usb_phid_ControlSetReport2() */


追記 : 補足

その後、気になり始めたのですが、てっきり、FW\PHIDフォルダのソースコードは、HIDの共通処理を抽出
したUSBフレームワークの一部だと思い込んでいたのですが、もともと設計方針として、フレームワークの
外部であり、そもそもユーザが書き換えるソースコードである、という位置付けのような気もして来ました。

関連記事

2013/07/23   blog-entry-313   category: RX /* 32bit CISC */

go page top