RL78/G1CのUSBサンプルコードについて

パソコンとRL78G1CでのUSB通信を行いたいので、スターターキットを購入して、サンプルコードとして an_r01an0555jj0215_usb を入手して、an_r01an0555jj0215_usb\workspace\RL78\CS+\RL78G1C\ にあるRL78G1C.mtpjからCS+を起動させて、端子割り当て設定のみを行ってコードの生成後にビルドを行ったのですが、

RA78K0R error E3404: Multiple symbol definition '_main' in file 'ECHO\r_cg_main.rel'. First defined in file 'ECHO\main.rel'
RA78K0R error E3404: Multiple symbol definition '_hdwinit' in file 'ECHO\r_cg_systeminit.rel'. First defined in file 'ECHO\rl78usbmcu.rel'

というメッセージが出てビルド出来ませんでした。「RL78/G1CのUSBポート使用について」の投稿を確認したのですが、それとは内容が異なる様です。なにか他に変更すべき箇所があれば御教授願えないでしょうか。

  • musashiさん、こんにちは。NoMaYと申します。

    以下のスレッドの時に見ていたソースが残っていましたので見てみました。結論としては、そもそも、そのサンプルコードはコード生成機能を使用して作成されたものではありませんでしたので、そこにコード生成機能で生成したソースを追加したことで幾つかの関数が重複してしまったことによります。

    RL78/G1CのUSBポート使用について
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/4369/rl78-g1c-usb

    ざっと見た感じでは、対処方法は以下のようになるかな、と思いました。

    (1) workspace\RL78\CS+\RL78G1C\src\SmplMain\main.cのmain()の中身を、コード生成機能が生成したr_main.cのmain()のユーザ記述部へコピーして、もとのmain.cのmain()は削除する

    (2) workspace\RL78\CS+\RL78G1C\src\HwResource\src\rl78usbmcu.cのhdwinit()の中身を、コード生成機能が生成したr_main.cのR_MAIN_UserInit()のユーザ記述部へコピーして、もとのl78usbmcu.cのhdwinit()は削除する

    (3) きっとビルドするとインクルードファイルが足りないことに起因するコンパイルエラーが発生すると思いますので、エラーメッセージから足りないインクルードファイルを特定して、r_main.cにインクルードファイル関連のユーザ記述でインクルードしていく。

    それで、一応、サンプルコードそのままが動くことは確認しておいた方が良いと思います。

    [追記]

    当時調べたことを投稿した別スレッドがありましたので、今回の件とは関係が無いですが、リンクを載せさせて下さい。すみません。

    USB PCDCドライバのエコーバックサンプルプログラムソースを幾つか並べてみた
    japan.renesasrulz.com/cafe_rene/f/forum5/4381/usb-pcdc
     

  • NoMaYさん、解答ありがとうございます。
    なるほど、サンプルコード自体がコード生成に対応していなかったのですね。
    他サンプルコードを利用したときは、コード生成に対応していたので盲点でした。
    ご指摘頂いた箇所を修正して、ビルドが正常に通るようになりました。
    追記もありがとうございます。

    そして、その後に別の問題点が発生しました。
    usb_cpu_mcu_initialize() 内にある発振安定待ちの箇所で、OSTCの値が最初から0xffのままで判定不一致の無限ループとなってしまいます。
    まず、リスタートによって0x00になるのではないかと思うのですが・・・
    また、0xffのままでカウントアップもカウントダウンもされません。
    クロック設定のところはfHOCO+fPLLでUSB使用状態にしてコード生成してあります。

    この解決策の情報をどなたかお持ちでしょうか?

  • musashiさん、こんにちは。NoMaYです。

    ごめんなさい。私の見込みがちょっと甘かったようですね。そういえば、コード生成機能で端子設定だけしても、クロック周りの初期化処理がコード生成されたソース中にありますね。予想なのですが、関数名の重複は片付いても、今度は、処理そのものが、コード生成されたソースとサンプルコードのソースとで重複して実行されていることによるように思います。

    RL78/G1Cでコード生成させたソースが手元になくて、ちょっと申し訳ないのですが、コード生成されたソース中のクロック周りの初期化処理の方が先に実行されていると思いますので、サンプルコードのソース中のusb_cpu_mcu_initialize()の中身を空にする(又は、この関数を呼び出さないよう呼び出し元の方をコメントアウトする)ようにすれば良いように思います。

    ただ、念の為、usb_cpu_mcu_initialize()の中身と同等の処理が、コード生成されたソース中のクロック周りの初期化処理(おそらくr_cg_cgc.cのR_CGC_Create()だと思います)にあることは確認しておいて下さい。(もし、等価ではないようでしたら、その旨、連絡を下さい。自分の方でも、RL78/G1Cで試しにコード生成させてみようと思います。とはいえ、チップもボードも持っていないので、もしかしたら途中までしかお手伝い出来ないかも知れません。)

  • NoMaYさん、ありがとうございます。
    ご指摘の通り、クロック周辺機能の設定が重複していました。
    usb_cpu_mcu_initialize() をコメントアウトして、usb_cpu_mcu_initialize() 内の CMC = 0x41からMCKC |= 0x01 までが等価になる様にクロック周辺の設定を見直し、コード生成で初期化した状態のみにしたら、USBシリアルデバイス(COM6)として認識しました。
    Microsoftのusbser.sys をドライバーとして認識しているのですが、この状態で良かったでしょうか?
  • musashiさん、こんにちは。NoMaYです。

    それは良かったです。それで、ドライバーですが、reference\cdc_inf\CDC_Demo.infを見てみたところ、Microsoftのusbser.sysを使用していましたので、その状態で良いと思います。

    Microsoftのusbser.sysは、以前のWindowsでは手動でCDC_Demo.inf等のINFファイルを認識させてUSBデバイスと紐付けさせて使えるようにする必要がありましたが、Windows10からは自動的に使えるようになったようですね。(私はWindows7を使っているので、かふぇルネで知った情報ですけど。)

  • NoMaYさん、ありがとうございます。
    自分はWindows10ですが、Windows7の場合は注意が必要という事ですね、承知致しました。
    あとは実際の通信内容の確認等ですが、本主題から外れるのでこれでクローズとさせて頂きます。
    ご助力ありがとうございました。