FIT USBモジュールをRX631用にコンパイルするとコンパイルエラーになる

RX631でルネサスさんのUSB PCDCサンプル(以下のURLのFIT版を選択する
ことになる)をRX63N用からRX631用にコンフィグレーションを変えてコンパイル
しようとしたところ以下の画面コピーのコンパイルエラーになってしまいました。

https://www.renesas.com/ja-jp/software/D6000454.html
USB Peripheral Communications Devices Class Driver (PCDC) Using Firmware Integration Technology Modules
対象製品名
RX71M
RX64M
RX65N, RX651
RX63N, RX631


エラーメッセージ
r_usb_basic/src/driver/inc/r_usb_extern.h(39):E0520020:Identifier "USB_NUM_USBIP" is undefined
など

対処法を考えているうちにFIT USBモジュールのバグである気がしてきました。

* RX631用の#if~#endifがソース全体に渡って欠落している?

具体的には、以下の流れでソースを追ってみて、そう思うように至りました。

(1) an_r01an2238jj0120_usb\workspace\RX63N\r_config\r_bsp_config.h

/* Group name.
   Character(s) = Value for macro = Description
   30           = 0x0             = RX630 Group
   31           = 0x1             = RX631 Group
   3N           = 0x2             = RX63N Group
   3T           = 0x3             = RX63T Group
*/
#define BSP_CFG_MCU_PART_GROUP          (0x1) // (0x2)

→ BSP_CFG_MCU_PART_GROUP に 0x1 を定義する

(2) an_r01an2238jj0120_usb\workspace\RX63N\r_bsp\mcu\rx63n\mcu_info.h

/* MCU Group name. */
#if   BSP_CFG_MCU_PART_GROUP == 0x0
    #define BSP_MCU_RX630           (1)
#elif BSP_CFG_MCU_PART_GROUP == 0x1
    #define BSP_MCU_RX631           (1)
#elif BSP_CFG_MCU_PART_GROUP == 0x2
    #define BSP_MCU_RX63N           (1)
#elif BSP_CFG_MCU_PART_GROUP == 0x3     
    #define BSP_MCU_RX63T           (1)
#else
    #error "ERROR - BSP_CFG_MCU_PART_GROUP - Unknown MCU Group chosen in r_bsp_config.h"
#endif

→ 上の項番(1)により BSP_MCU_RX631 が定義される

(3) an_r01an2238jj0120_usb\workspace\RX63N\r_usb_basic\src\driver\inc\r_usb_basic_define.h

/* The number of USBIP */
#if defined(BSP_MCU_RX64M) || defined(BSP_MCU_RX71M) || defined(BSP_MCU_RX63N)
    #define USB_NUM_USBIP           (2u)
#endif /* defined(BSP_MCU_RX65N) */

#if defined(BSP_MCU_RX65N)
    #define USB_NUM_USBIP           (1u)
#endif /* defined(BSP_MCU_RX65N) */

→ ところが BSP_MCU_RX631 の場合の#if~#endifが無い

(4) an_r01an2238jj0120_usb\workspace\RX63N\r_usb_basic\src\driver\inc\r_usb_extern.h

extern uint16_t g_usb_change_device_state[USB_NUM_USBIP];

→ ここで E0520020:Identifier "USB_NUM_USBIP" is undefined のコンパイルエラーになる
→ → 上の項番(3)で BSP_MCU_RX631 の場合の#if~#endifが無いので当然そうなる
→ → → ソース全体をgrepしても、そういう#if~#endifが全く無い
→ → → → それってバグなのでは?

なお、以下の2つのファイルの設定も変更しています。

(A-1) an_r01an2238jj0120_usb\workspace\RX63N\demo_src\inc\r_usb_pcdc_apl_config.h
(A-2) an_r01an2238jj0120_usb\workspace\RX63N\r_config\r_usb_basic_config.h

/** [USB module selection setting]
 *  USB_CFG_IP0         : Uses USB0 module
 *  USB_CFG_IP1         : Uses USB1 module
 */
#define USB_CFG_USE_USBIP           (USB_CFG_IP0) // (USB_CFG_IP1)

また、以下に手を入れていますがPLLクロック発振安定待機時間をGR-CITRUSに
合わせる(GR-CITRUSのUSBMSCファームウェアの設定に合わせる)変更です。

(B) an_r01an2238jj0120_usb\workspace\RX63N\r_bsp\board\rskrx63n\resetprg.c

Parents
  • がじぇっとるねさすコミュニティに投稿したブログから参照することにしましたので
    本文を少し変更しました。また、その為に、以下のソース変更内容を追記しました。

    (B) an_r01an2238jj0120_usb\workspace\RX63N\r_bsp\board\rskrx63n\resetprg.c

    このファイルに対しては以下の赤字箇所を追加しています。

    #if (BSP_CFG_CLOCK_SOURCE == 4)
        /* PLL is chosen. Start it operating. Must start main clock as well since PLL uses it. */
        /* Wait 65,536 cycles * 12 MHz = 5.46 ms */
        SYSTEM.MOSCWTCR.BYTE = 0x0C;        

        /* Set the main clock to operating. */
        SYSTEM.MOSCCR.BYTE = 0x00;          

      #if 1 // for GR-CITRUS
        /* Following value is obtained from HardwareSetup() of Web Compiler's sketch template. */
        /* PLL wait is 2,097,152 cycles * 192 MHz (12 MHz * 16) = 10.92 ms*/
        SYSTEM.PLLWTCR.BYTE = 0x0E;         
      #else
        /* PLL wait is 1,048,576 cycles * 192 MHz (12 MHz * 16) = 5.46 ms*/
        SYSTEM.PLLWTCR.BYTE = 0x0D;         
      #endif

        /* Set PLL Input Divisor. */
        SYSTEM.PLLCR.BIT.PLIDIV = BSP_CFG_PLL_DIV >> 1;

        /* Set PLL Multiplier. */
        SYSTEM.PLLCR.BIT.STC = BSP_CFG_PLL_MUL - 1;

        /* Set the PLL to operating. */
        SYSTEM.PLLCR2.BYTE = 0x00;          

        /* The delay period needed is to make sure that the main clock and PLL have stabilized. This delay period is
           tPLLWT2 when the main clock has not been previously stabilized. According to the Renesas Technical Update
           document TN-RX*-A021A/E this delay is defined as:
           n = Wait time selected by PLLWTCR.PSTS[] bits
           tMAINOSC = Main clock oscillator start-up time. From referring to various vendors, a start-up time of 4ms appears
                      to be a common maximum. To be safe we will use 5ms.
           tPLLWT2 = tMAINOSC + tPLL1 + ((n + 131072)/fPLL)
           */
      #if 1 /* for GR-CITRUS */
           /*
           tPLLWT2 = 5ms + 500us + ((2097152 + 131072)/192MHz)
           tPLLWT2 = 17.10ms
           A delay of 18ms has been used below to account for variations in the LOCO.
           18ms / 86us (per iteration) = 210 iterations */
        for(i = 0; i < 210; i++)             
        {
            /* Wait 18ms. See comment above for why. */
            nop() ;
        }
      #else
           /*
           tPLLWT2 = 5ms + 500us + ((1048576 + 131072)/192MHz)
           tPLLWT2 = 11.64ms
           A delay of 12ms has been used below to account for variations in the LOCO.
           12ms / 86us (per iteration) = 140 iterations */
        for(i = 0; i < 140; i++)             
        {
            /* Wait 12ms. See comment above for why. */
            nop() ;
        }
      #endif
    #else
        /* Set the PLL to stopped. */
        SYSTEM.PLLCR2.BYTE = 0x01;          
    #endif

    回避策としては、RX631用にコンパイルするのではなくRX63N用として以下の赤字
    箇所のようにしてコンパイルすればコンパイル出来ますし、そのようにビルドしても
    今回のサンプルプログラムはGR-CITRUSで動作しました。

    (I) an_r01an2238jj0120_usb\workspace\RX63N\r_config\r_bsp_config.h

    /* Package type. Set the macro definition based on values below:
       Character(s) = Value for macro = Package Type/Number of Pins/Pin Pitch
       FC           = 0x0             = LQFP/176/0.50
       BG           = 0x1             = LFBGA/176/0.80
       LC           = 0x2             = TFLGA/177/0.50
       FB           = 0x3             = LQFP/144/0.50
       LK           = 0x4             = TFLGA/145/0.50
       FP           = 0x5             = LQFP/100/0.50
       LA           = 0x6             = TFLGA/100/0.50
       FN           = 0x7             = LQFP/80/0.50
       FM           = 0x8             = LQFP/64/0.50
       FL           = 0x9             = LQFP/48/0.50
    */
    #define BSP_CFG_MCU_PART_PACKAGE        (0x5) // (0x0)



    /* ROM, RAM, and Data Flash Capacity.
       Character(s) = Value for macro = ROM Size/Ram Size/Data Flash Size
       E            = 0xE             = 2MB/128KB/32KB
       D            = 0xD             = 1.5MB/128KB/32KB
       B            = 0xB             = 1MB/128KB/32KB
       A            = 0xA             = 768KB/128KB/32KB
       8            = 0x8             = 512KB/64KB/32KB
       7            = 0x7             = 384KB/64KB/32KB
       6            = 0x6             = 64KB/8KB/8KB
       5            = 0x5             = 48KB/8KB/8KB
       4            = 0x4             = 32KB/8KB/8KB
       0            = 0x0             = 0/128KB/0
    */
    #define BSP_CFG_MCU_PART_MEMORY_SIZE    (0xE) // (0xF) // (0xB)

    /* Group name.
       Character(s) = Value for macro = Description
       30           = 0x0             = RX630 Group
       31           = 0x1             = RX631 Group
       3N           = 0x2             = RX63N Group
       3T           = 0x3             = RX63T Group
    */
    #define BSP_CFG_MCU_PART_GROUP          (0x2) // (0x1) // (0x2)

    以下は動作を確認した時の画面コピーです。(ちなみに、コマンドプロンプト
    (あるいはWindowsのスタートメニューの[プログラムとファイルの検索]入力)で
    devmgmt.mscと入力するとデバイスマネージャを直に開くことが出来ます。)








    なお、今回のサンプルプログラムですが、e2 studio用プロジェクトファイルを
    CS+で開く時にプロジェクト名を変更するとインクルードパスが合わなくなって
    コンパイルエラーになってしまったので、CS+上でインクルードファイルパスを
    修正しています。

    プロジェクトファイルを開く時にプロジェクト名を指定出来るものの、、、



    コンパイルエラーになるのでインクルードパスの修正が必要(元々存在しないr_dmaca_rxフォルダに関しては保留)
    修正前:

    修正後:

  • 2017/05/23 23:58

    使用したモジュールがバージョンアップされていて、以下のURLとファイル名に変わっていました。
    (すみません、まだダウンロードしていませんので投稿内容と変わっているかも知れません。)

    USB Peripheral Communications Devices Class Driver (PCDC) Using Firmware Integration Technology Modules
    https://www.renesas.com/ja-jp/software/D6000997.html
    an_r01an2238jj0121_usb.zip

    ルネサスサンプルコード検索で検索する場合

    an_r01an2238
    https://www.renesas.com/ja-jp/search/keyword-search.html#genre=sampleprogram&q=an_r01an2238


    2017/05/25 06:46

    ダウンロードして、バージョンアップされたモジュールのソースを確認したところ、DMA転送を使用する
    場合のUSBドライバの処理が変更されていました。ソースには以下の変更履歴が追加されていました。

    26.01.2017 1.21 Support DMAC Technical Update for RX71M/RX64M USBA.

  • NoMaYさん

    シェルティです、こんにちは。

    本件ですがRXマイコンのデバイスドライバを作っているメンバーに聞いてみました。
    このスレッドの指摘のおかげでRX631の抜けに気が付いたそうで、次の版(10月位)で直すと仰っていました。
    本当に貴重なフィードバックをいただきまして、参考になります。
    他にも変な挙動を見つけたら報告いただけましたら、
    (おもにRXマイコン関連だけですが)私が可能な限りメッセンジャーします。

    e2 studioのプロジェクトをCS+のプロジェクトにコンバートすると
    インクルードパス(ライブラリのパスも)が変になるのは私も引っかかりました。
    過去ツール開発のメンバーに聞いてはみたのですが、こちらは少し直る見込みが薄いかもしれません。
    私もいつも手作業でパス修正しています。

    以上です
Reply
  • NoMaYさん

    シェルティです、こんにちは。

    本件ですがRXマイコンのデバイスドライバを作っているメンバーに聞いてみました。
    このスレッドの指摘のおかげでRX631の抜けに気が付いたそうで、次の版(10月位)で直すと仰っていました。
    本当に貴重なフィードバックをいただきまして、参考になります。
    他にも変な挙動を見つけたら報告いただけましたら、
    (おもにRXマイコン関連だけですが)私が可能な限りメッセンジャーします。

    e2 studioのプロジェクトをCS+のプロジェクトにコンバートすると
    インクルードパス(ライブラリのパスも)が変になるのは私も引っかかりました。
    過去ツール開発のメンバーに聞いてはみたのですが、こちらは少し直る見込みが薄いかもしれません。
    私もいつも手作業でパス修正しています。

    以上です
Children
No Data