Renesas Synergy™

FAQ 1011904 : RSKのHIDサンプルコードでUSBストリング・ディスクリプタ(Product)データサイズを44byteから64byteに変更したところ、Product表示がUnknownになってしまう。

Q : 質問

RSKのHIDサンプルコードでUSBストリング・ディスクリプタ(Product)データサイズを44byteから64byteに変更したところ、Product表示がUnknownになってしまう。

A: 回答

HIDサンプルコード内USBストリング・ディスクリプタ(Product)のデータサイズは44byteとし、変更をしない仕様で設計されていることが原因です。
以下の条件が成立した場合、Renesas HID Sample ApplicationのProduct情報が"Unknown"と表示されます。

  • USB Hostからの要求データサイズが最大パケットサイズ以上
  • USBデバイスからの送信データサイズ = 最大パケットサイズのn倍

サンプルコードの場合、

 USB Host側からの要求データサイズ : 257byte
 USBデバイスからの送信データサイズ : 64byte
 最大パケットサイズ(CONTROL_IN_PACKET_SIZE) : 64byte

のため、前述の条件に当てはまります。

該当サンプルコードを含むアプリケーションノート

Renesas Starter Kit for RX630
  ・[CubeSuite+ & CC-RX] RSKサンプルコードアプリケーションノート(R20AN0276JJ0100)
  ・[HEW & CC-RX] RSKサンプルコードアプリケーションノート(R01AN1242JG0100)
  ・[e2 studio & CC-RX] RSKサンプルコードアプリケーションノート(R01AN1243EG0200) ※英語版
Renesas Starter Kit+ for RX62N
  ・[CubeSuite+ & CC-RX] RSKサンプルコードアプリケーションノート(R20AN0279JJ0100)
  ・[HEW & CC-RX] RSKサンプルコードアプリケーションノート(R01AN0318JG0100)
Renesas Starter Kit+ for RX63N
  ・[CubeSuite+ & CC-RX] RSKサンプルコードアプリケーションノート(R20AN0272JJ0100)
  ・[HEW & CC-RX] RSKサンプルコードアプリケーションノート(R01AN1395JG0100)
  ・[e2 studio & CC-RX] RSKサンプルコードアプリケーションノート(R01AN1396EG0100) ※英語版
Renesas Starter Kit+ for RX63N-256K
  ・[CubeSuite+ & CC-RX] RSKサンプルコードアプリケーションノート(R01AN2508EG0100) ※英語版

 

A : 回答

USBストリング・ディスクリプタ(Product)のデータサイズを64byteに変更する場合、USB Host側にデータの最後であることを知らせるため、最大パケットサイズのデータ送信後にNullパケットを送信する必要があります。Nullパケット送信は、BVALビットに"1"を設定することで実現できます。
変更したサンプルコードを以下に示します。①と②のソースコードの青太文字箇所を追加してください。

①最大パケットサイズデータ送信判定処理の追加
\Samples\HID\Target\USBStack\usb_hal.c
関数WriteControlINPacket() (抜粋)

static void WriteControlINPacket(void)
{
    uint16_t Count = 0;
    uint16_t req_wLength;

  ===== 省略 =====

    /*Wait for buffer to be ready*/
    while(USBIO.CFIFOCTR.BIT.FRDY == 0){;}
     /* Issue Zero-Length send request at Max packet size transmission */
     req_wLength = USBIO.USBLENG;
     if( g_Control.m_IN.m_DataBuff.NumBytes < (uint32_t)req_wLength )
     {
         if( CONTROL_IN_PACKET_SIZE == (uint16_t)g_Control.m_IN.m_DataBuff.NumBytes )
         {
             req_zero_length_send = 1;
         }
     }
    /* Write data to the IN Fifo untill have written a full packet
    or we have no more data to write */
    while((Count < CONTROL_IN_PACKET_SIZE) &&
     (g_Control.m_IN.m_DataBuff.NumBytes != 0))
    {
        ===== 省略 =====

②Nullパケット送信処理の追加
\Samples\HID\Target\USBStack\usb_hal.c
関数HandleBEMP() (抜粋)

static void HandleBEMP(void)
{
  ===== 省略 =====
        /*If we are performing a CONTROL IN DATA*/
        if(STATE_CONTROL_IN == g_Control.m_etState)

        {
            /* Request for Zero Length transmission after at Max Packet transmission */
            if( req_zero_length_send == 1 )
            {
                req_zero_length_send = 0;
                /*Wait for buffer to be ready*/
                while(USBIO.CFIFOCTR.BIT.FRDY == 0){;}
                /* Zero-length sending */
                USBIO.CFIFOCTR.BIT.BVAL = 1;
            }
            else
            {
                /*If there is more data to send*/
                if(g_Control.m_IN.m_DataBuff.NumBytes != 0)
                    WriteControlINPacket();
                }
                else
                {
                  ===== 省略 =====
                }
            }
        ===== 省略 =====

※ファイルの先頭で0サイズ(Nullパケット)送信要求フラグを以下のように宣言してください。
/* Request of Zero-Length Sending */
static uint16_t req_zero_length_send = 0;

 

適用製品

Renesas Starter Kit for RX630
Renesas Starter Kit+ for RX62N
Renesas Starter Kit+ for RX63N
Renesas Starter Kit+ for RX63N-256K
他にご質問がございましたら、リクエストを送信してください