新T4FITでRX63Nが動作しない

イッシーと申します。

「RX63NでM3S-T4-Tinyの使い方について」のフォーラムでシェルティさんから教えていただいた方法で
M3S-T4-TinyモジュールをRX63Nに組み込みましたが、
先日ルネサスからRX63N対応のT4FITモジュールがリリースされましたので試してみました。
ところがpingコマンドが応答しません。
試行錯誤した結果「r_ether_rx」を従来のと差し替えると動作しました。
設定などが間違えているものと思いますが、RX63Nに新しいT4FITモジュールで動作した人がいたら教えてください

各モジュールのバージョンは以下の通りです。
r_bsp 3.40
r_cmt_rx 3.00
r_ether_rx 1.11
r_t4_driver_rx 1.05
r_t4_rx 2.05

従来のr_ether_rxは1.01

  • イッシーさん

    最新のT4から端子設定をAPIの外部でする仕様に変更されているみたいです。

    MPCとポートのPMRの設定を見てみてはいかがですか?

  • PONSUKEさん

    貴重な情報ありがとうございます。

    端子設定をしましたがまだpingが通りません。

    ドキュメントを読み直します。

  • イッシーさん

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

    すみません、こちらのスレッドに気づいていませんでした。
    最初にご質問いただいたと思われる以下スレッドに回答を付けさせて
    いただいたのですが、ご確認いただけましたか?
    http://japan.renesasrulz.com/cafe_rene/f/69/p/3612/18485.aspx

    以上です

  • イッシーです。

    シェルティさんいつもお世話になります。

    最初の質問のスレッドでPostしたのですが、e_mailに送信されなかったので、

    新しいスレッドを立て直しました。

    (初めてのことだったので訳も分からずいろんな操作をしたためと思います)

    シェルティさんの回答と同じに作ったつもりですが、

    新しいFITで構築したプロジェクトではpingが通りません。

    main()のwhile(1)文にR_ETHER_LinkProcess(0);を追加しました。

    再度間違いがないかチェックします。

  • イッシーです。

    RENESAS TOOL NEWS[2016年11月01日号]の注意事項[R20TS0088JJ0100]で

    不具合が報告され、次期リビジョン(Rev1.12)で改修されそうです。(11月予定)

    この問題とは関係ないかもしれませんが、

    次期リビジョンがリリースされるまで待つことにします。

  • イッシーさん

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

    R20TS0088JJ0100を確認しました。たしかにrev112を待ったほうがよさそうですね。

    rev111でもひとまず下記のとおり動作確認はできましたので、

    前回お知らせした手順をもう一度手元で動作確認して清書しました。

    特にセクション設定のところが不明瞭だったので、具体化しました。

    要らない手順が書いてあったりもしたので削除しました。

    もし余裕がありましたらもう一度お試しいただければ幸いです。

    ■RX63N GR-SAKURAボードでTCP/IPを動作させる方法(2016/11/04版)
     
    (1)開発環境をダウンロード
     統合開発環境 e² studio 5.2 インストーラ (オンライン用)
     https://www.renesas.com/ja-jp/software/D4000207.html
     →インストール中にCC-RX(コンパイラ)の最新版(2016/11/01時点ではv205)もインストールする
    (2)e2 studioを起動してサンプルプロジェクト新規作成
     ・ファイル→新規→C Project
      プロジェクト名:rx63n_gr_sakura (なんでも良いです)
      プロジェクトの種類:Executable→Sample Project
      ツールチェイン:Renesas RXC Toolchain
      [次へ]ボタン
      ターゲットの選択:R5F563NBDxFB
      「ハードウェア・デバッグ」にチェック(「シミュレータを使用してデバッグ」はチェック外す)
      [次へ]ボタン
      「FITモジュールを使用する」にチェック
      「FITモジュールのダウンロード」を押す
      リージョンを選択しOKを押す
      FITモジュール一覧にいっぱい表示されるので、「絞り込み」でRX Driver Packageのみ表示する、にチェックを入れ、
      RX Driver Packageをダウンロード。(2016/11/01時点ではrev111)
       補足:RX Driver Package(略称はRDP)はFITモジュール(RXマイコン周辺機能のデバイスドライバ)詰め合わせセットとのこと。
      [終了]ボタン
      
    (3)FITモジュールをプロジェクトに登録していく
     ・Renesas Views→e2ソリューションツールキット→FIT Configurator
     ・FITモジュールを追加するプロジェクトを「rx63n_gr_sakura」、ターゲットボードを「RSKRX63N」を選択
      (GR-SAKURAはまだ登録されていないため、BSPの設定に微妙に不整合がある状態だが基本動作に問題なし)
     ・FIT Configuratorの窓の中で、以下を探して選択、モジュールの追加ボタンを押し、コード生成ボタンを押す
      ①r_bsp (v340)
      ②r_cmt_rx (v300)
      ③r_ether_rx (v111)
      ④r_t4_rx (v205)
      ⑤r_t4_driver (v105)
    (4)TCP/IPライブラリをリンカ登録
     ・FIT Configuratorでコード生成時にTCP/IPのライブラリが登録されないので、
      手動でリンカ設定を行う
      プロジェクトエクスプローラの「rx63n_gr_sakura」を右クリックしてプロパティを選択
      C/C++ビルド→Settingsを選択し、Linker→入力で「T4_Library_rxv1_ether_little.lib」を指定
    (5)Etherドライバ用のセクション設定
     ・プロジェクトエクスプローラの「rx63n_gr_sakura」を右クリックしてプロパティを選択
      C/C++ビルド→Settingsを選択し、Linker→セクションで以下設定を施す
      アドレス0x00000004を0x00000100に変更
      B_ETHERNET_BUFFERS_1を0x00000100に割り付け(32バイトアライメントが必要)
      B_RX_DESC_1をB_ETHERNET_BUFFERS_1の下に配置(16バイトアライメントが必要)
      B_TX_DESC_1をB_RX_DESC_1の下に配置(16バイトアライメント)
      これでデフォルトで存在するSUがB_TX_DESC_1の下に配置される。
     <この時点でビルドが通るようになります>
    (6)Etherドライバの設定を変更する
     ・/r_config/r_ether_rx_config.h の設定で以下を変更する
      ETHER_CFG_MODE_SEL 0 -> 1
      ETHER_CFG_CH0_PHY_ACCESS 1 -> 0
      ETHER_CFG_CH1_PHY_ACCESS 1 -> 0
      ETHER_CFG_USE_LINKSTA 1 -> 0
    (7)TCP/IP本体の設定(/r_t4_rx/src/config_tcpudp.c)を調整
     ・_t4_channel_num を 1 に変更
    (8)rx63n_gr_sakura.cに端子設定コード(GR-SAKURA用)を追加 (長いので本投稿の末尾に記載:「★」で検索)
    (9)rx63n_gr_sakura.cのmain()にTCP/IPとEtherの初期化コード追加(長いので本投稿の末尾に記載:「★★」で検索)
    -----------------------------------------------
    (8)端子設定コードをGR-SAKURA用に改造 コード:★
    -----------------------------------------------
    #if ETHER_CFG_MODE_SEL == 1 /* RMII */
    /***********************************************************************************************************************
    * Function Name: ether_port_enable_rmii
    * Description  : Configures port pins.
    * Arguments    : channel -
    *                    Ethernet channel number
    * Return Value : none
    ***********************************************************************************************************************/
    void ether_port_enable_rmii(void)
    {
        /*
        Pin Functions : Port
        --------------------
        ET_MDC        : PA4
        ET_MDIO       : PA3
        ET_WOL        : NC
        ET_LINKSTA    : NC
        ET_EXOUT      : NC
        REF50CK       : PB2
        RMII_TXD1     : PB6
        RMII_TXD0     : PB5
        RMII_TXD_EN   : PB4
        RMII_RXD1     : PB0
        RMII_RXD0     : PB1
        RMII_RX_ER    : PB3
        RMII_CRS_DV   : PB7
        */
       
        /* ET0 */
        PORTA.PDR.BIT.B3 = 0;
        PORTA.PDR.BIT.B4 = 0;
        PORTB.PDR.BIT.B0 = 0;
        PORTB.PDR.BIT.B1 = 0;
        PORTB.PDR.BIT.B2 = 0;
        PORTB.PDR.BIT.B3 = 0;
        PORTB.PDR.BIT.B4 = 0;
        PORTB.PDR.BIT.B5 = 0;
        PORTB.PDR.BIT.B6 = 0;
        PORTB.PDR.BIT.B7 = 0;
        PORTA.PMR.BIT.B3 = 0;
        PORTA.PMR.BIT.B4 = 0;
        PORTB.PMR.BIT.B0 = 0;
        PORTB.PMR.BIT.B1 = 0;
        PORTB.PMR.BIT.B2 = 0;
        PORTB.PMR.BIT.B3 = 0;
        PORTB.PMR.BIT.B4 = 0;
        PORTB.PMR.BIT.B5 = 0;
        PORTB.PMR.BIT.B6 = 0;
        PORTB.PMR.BIT.B7 = 0;
    #if (ETHER_CFG_USE_LINKSTA == 1)
        /* Clear PDR and PMR for LINKSTA */
        PORTA.PDR.BIT.B5 = 0;
        PORTA.PMR.BIT.B5 = 0;
    #endif
        /* PFS register write protect off */
        R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_MPC);
        /* ET0 */
        MPC.PA3PFS.BYTE = 0x11;
        MPC.PA4PFS.BYTE = 0x11;
        MPC.PB0PFS.BYTE = 0x12;
        MPC.PB1PFS.BYTE = 0x12;
        MPC.PB2PFS.BYTE = 0x12;
        MPC.PB3PFS.BYTE = 0x12;
        MPC.PB4PFS.BYTE = 0x12;
        MPC.PB5PFS.BYTE = 0x12;
        MPC.PB6PFS.BYTE = 0x12;
        MPC.PB7PFS.BYTE = 0x12;
    #if (ETHER_CFG_USE_LINKSTA == 1)
        /* Select pin function for LINKSTA */
        MPC.PA5PFS.BYTE = 0x11;
    #endif
        /* PFS register write protect on */
        R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_MPC);
        /* ET0 */
        MPC.PFENET.BIT.PHYMODE = 0; /* Select Ethernet mode    RMII mode for ch0 */
        PORTA.PMR.BIT.B3 = 1;
        PORTA.PMR.BIT.B4 = 1;
        PORTB.PMR.BIT.B0 = 1;
        PORTB.PMR.BIT.B1 = 1;
        PORTB.PMR.BIT.B2 = 1;
        PORTB.PMR.BIT.B3 = 1;
        PORTB.PMR.BIT.B4 = 1;
        PORTB.PMR.BIT.B5 = 1;
        PORTB.PMR.BIT.B6 = 1;
        PORTB.PMR.BIT.B7 = 1;
    #if (ETHER_CFG_USE_LINKSTA == 1)
        /* Switch to the selected input/output function for LINKSTA */
        PORTA.PMR.BIT.B5 = 1;
    #endif
    } /* End of function ether_port_enable_rmii() */
    #endif
    -----------------------------------------------
    (9)main()にTCP/IPとEtherの初期化コード:★★
    -----------------------------------------------
    #include "platform.h"
    #include "r_t4_itcpip.h"
    #include "r_ether_rx_if.h"
    #define TCPUDP_WORK 10300/4
    UW tcpudp_work[TCPUDP_WORK];
    void ether_port_enable_rmii(void);
    void main(void);
    void main(void)
    {
     UW work_size;
     
     /* start tcp/ip */
     ether_port_enable_rmii();
     lan_open();
     work_size = tcpudp_get_ramsize();
     if(work_size > sizeof(tcpudp_work))
     {
       while(1);
     }
     /* tcpudp_workはTCP/IPデフォルト設定だと10300バイト必要。グローバル変数で確保しておく */
     tcpudp_open(tcpudp_work);
      
     while(1)
     {
     }
    }

  • イッシーです。

    シェルティさん手順ありがとうございます。

    手順通りに新規にプロジェクトから再作成したらpingが通りました。

    ありがとうございます。

    そこで、基本的な疑問点があります。教えていただけると助かります。

    1.セクション設定でB_ETHERNET_BUFFERS_1のアドレスを0x100に設定するのですか?

    イーサネットモジュールのアプリケーションノート「R01AN2009JJ0111」の

    「4.使用方法」の「4.1セクション配置」での「セクション配置例」では

    B_ETHERNET_BUFFERS_1のアドレスが0x00からになっています。

    2. while文に R_ETHER_LinkProcess(0);は必要ないのですか?

    前の手順では以下のコメントがありました。

      /* R_ETHER_LinkProcess()は継続的に呼び出される必要がある */

    よろしくお願いします。

  • イッシーさん

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

    うまく動作確認できてよかったです。

    下記回答します。

    > 1.セクション設定でB_ETHERNET_BUFFERS_1のアドレスを0x100に設定するのですか?
    > イーサネットモジュールのアプリケーションノート「R01AN2009JJ0111」の
    > 「4.使用方法」の「4.1セクション配置」での「セクション配置例」では
    > B_ETHERNET_BUFFERS_1のアドレスが0x00からになっています。

    Etherコントローラとしては、0x00000000から配置でもOKです。
    Etherコントローラとしての制限はあくまで、
    送信・受信バッファが32バイトアライメント、
    送信・受信ディスクリプタが16バイトアライメントです。

    ソフトウェアがバグったときに0x00000000付近は書き込みアクセスされやすい
    傾向にあるため、私は0x00000000付近を未使用にします。
    e2 studioのデフォルトも同じ考えでセクション開始位置を0x00000004にしてあるのだと思います。
    0x00000004だとEtherコントローラの制限にかかるため、0x00000100としました。

    > 2. while文に R_ETHER_LinkProcess(0);は必要ないのですか?
    > 前の手順では以下のコメントがありました。
    >   /* R_ETHER_LinkProcess()は継続的に呼び出される必要がある */

    これは不要ですね。
    R_ETHER_LinkProcess()はt4_driver.c のtimer_interrupt()で継続的に
    呼び出されるように変更されたためです。

    以上です

  • イッシーです。

    回答いただきありがとうございます。

    今回は本当に助かりました。

    今後ともよろしくお願いします。