RX660にて、Renesas flash Programerで書き込みが出来ない

お世話になっております。
GAです。

現在、RX660を使用した基板に対して、
E2 Liteを経由したRenesas flash Programerでの書き込みを行おうとしております。
その際に、以下のようなエラーログが出て、上手く書き込みが出来ません。

[ログ本文]
接続デバイス : RX Group
ツールに接続します。
使用ツール : E2 emulator Lite (2FS045144B), インタフェース : 2 wire UART
ツール電圧 : OFF
エミュレータのファームウェアバージョン(更新前) : 3.03.00.005
エミュレータのファームウェアバージョン(更新後) : 3.04.00.000
ターゲットデバイスに接続します。
メインクロック : 16.000000MHz
ターゲットデバイスを設定します。
ターゲットデバイスを設定します。
通信速度 : 1,000,000 bps
Signature:
Device: RX Group
Device Code: (省略)
選択されたブロックを消去します。
[User Boot Area 1] 0xFF7F8000 - 0xFF7FFFFF サイズ : 32 K
ツールから切断します。
エラー(E100000E): デバイスでプロテクションエラーが発生しました。 (Command: 50, Response: DA)
操作は失敗しました。
[ログ終了]

同じE2Liteを使用して、CS+上でのデバッグを行った際には、問題なくデバッグが出来ております。
デバイス側の設定として、特別プロテクションに関わる設定を行っていないのですが、
初期設定として、プロテクションをかけるような設定となっているのでしょうか。
(それか、回路的にプロテクションかける方法があるのでしょうか)

拙い質問で申し訳ございませんが、何卒お知恵をお借り出来ますと幸いです。

Parents
  • >現在、基板単体の確認ではなく、装置に組み込んだ状態になります。

    ブートモード接続ができていますので、装置に組み込まれている事は関係ありませんし、基板単体にしても(チップを別なボードに張り替えても)挙動は変わらないでしょう。

    コードフラッシュやデータフラッシュ単体でも消去出来ないのであれば、SEPR=0に設定されているのではないかと思うのですが。(実際に試してみたい所ではありますが、SEPRは(IDE=1で)一度0に設定すると元には戻せないので…)OCDEは未設定(1)なので、デバッガによる接続やコードフラッシュの書き換えは行えるのだと思います。

    (装置に組み込んだ人が、書き換え出来ない様にプロテクト設定を行ったのでしょうかね?ユーザに出荷時のデータを読み取らせないためだったらデバッガ接続禁止も、もしくはID設定を行うと思いますので、デバッガ接続は許すけどシリアルプログラマは使わせない微妙な設定ですね。)

    (デバッガでオプション設定メモリは覗けると思いますので、答え合わせは簡単です。)

Reply
  • >現在、基板単体の確認ではなく、装置に組み込んだ状態になります。

    ブートモード接続ができていますので、装置に組み込まれている事は関係ありませんし、基板単体にしても(チップを別なボードに張り替えても)挙動は変わらないでしょう。

    コードフラッシュやデータフラッシュ単体でも消去出来ないのであれば、SEPR=0に設定されているのではないかと思うのですが。(実際に試してみたい所ではありますが、SEPRは(IDE=1で)一度0に設定すると元には戻せないので…)OCDEは未設定(1)なので、デバッガによる接続やコードフラッシュの書き換えは行えるのだと思います。

    (装置に組み込んだ人が、書き換え出来ない様にプロテクト設定を行ったのでしょうかね?ユーザに出荷時のデータを読み取らせないためだったらデバッガ接続禁止も、もしくはID設定を行うと思いますので、デバッガ接続は許すけどシリアルプログラマは使わせない微妙な設定ですね。)

    (デバッガでオプション設定メモリは覗けると思いますので、答え合わせは簡単です。)

Children
  • tf様

    ご返信がかなり遅れてしまい、申し訳ございません。
    現状、私自身の環境の変化や別の作業が立て込んでおり、頂いた内容の確認に取り掛かれていない状態です。
    せっかくご助言頂いたにも関わらず、こちらの都合で確認が取れず、大変申し訳ございません。
    上記の内容、確認出来次第、再度ご連絡させていただきます。

    以上です。宜しくお願い致します。

  • tf様

    以前はお世話になっておりました。
    GAです。

    上記の件、以前とは別の基板(フラッシュプログラマにて書き込みが出来ないことは確認済み)
    ですが、確認出来ました。
    デバッガー上で、プロテクト設定をアドレスから直接読む(OFSM.SPCC.LONGで変数に書き込む)
    という形で、読み出した所、0x1FFFFFFFという値が読み出せ、
    SEPR(イレースコマンドプロテクト)、WRPR(プログラムコマンドプロテクト)、RDPR(リードコマンドプロテクト)の三つが0=禁止になっておりました。

    先ほど、ソースを確認したところ、vecttbl.c内の
    #pragma address __SPCCreg    = 0x00120040
    const uint32_t __SPCCreg    = BSP_PRV_SPCC_VALUE;
    という記述を発見し、BSP_PRV_SPCC_VALUEが0x1FFFFFFFとなっていることを確認しました。
    これが、原因であると考えております。

    以前、ご返信いただいた際に、
    >(実際に試してみたい所ではありますが、SEPRは(IDE=1で)一度0に設定すると元には戻せないので…)
    とおっしゃっておられましたが、これは、上記の設定がフラッシュプログラマ等の、書き込みツールでのみ反映され、
    一度プロテクトをかけてしまうと、それらからの書き込みを受け付けなくなるので、
    元には戻せない、という認識で間違いないでしょうか。
    また、例えば、チップを出荷状態に戻す等の
    プロテクトを外す方法をご存じでしたらお教えいただけますと幸いです。

    以上です。宜しくお願い致します。 
  • SPCC(0012_0040H)の値が、0x1FFFFFFFに設定された場合、消去が出来なくなります。

    >上記の設定がフラッシュプログラマ等の、書き込みツールでのみ反映され、

    ビルドした結果のmotファイル内の値が上記値であれば、「どの様な手段であれ」、そのmotファイルをチップに書き込むと、ブートモード(シリアルプログラミング)での消去は出来なくなります。デバッガ接続は別(SPCCのb17で制御)です。

    >チップを出荷状態に戻す

    私の知る限りではできません。(裏技で何か方法はあるのかも知れませんが…)

    なお、SPCCの

    b31 RDPR
    b30 WRPR
    b29 SEPR    これは0にすると戻せない

     を全て0に設定する、しかも戻せる、というパターンも存在します。b24のIDE=0とする場合です。

    シリアルプログラミングで、接続時にIDコードを設定する方法があり、その場合

    b31=b30=b29=0, b24=0

    に設定しますが、この場合、IDが一致すると消去等が可能です。

    (IDコードの先頭を0x45以外の値に設定すれば)IDコードを知らない人は、消去や書き換えが出来なくなります。

    (もしかしたらですが、IDコードプロテクトを有効にしたくて、RDPR=WRPR=SEPR=0に設定したが、IDE=0に設定するのが漏れてしまい、シリアルプログラミングが出来ない状態になってしまったのかもしれません。別途シリアルプログラミングを禁止する設定(SPE=0)もあるので、シリアルプログラミング自体を禁止したい場合はそちらを設定するはず。)

    (IDコード領域、0012_0050h~(OSIS)に、0xFF以外の値が設定されていないでしょうか。設定されている場合、そのデータの設計者はシリアルプログラミング時にIDコード認証をさせたかったのだと思います。)

  • >私の知る限りではできません。(裏技で何か方法はあるのかも知れませんが…)

    できました。

    実際に手を動かして挙動を確認するというのが私の信条なのですが、元に戻せなくなるとジャンクボードを生み出す事になってしまうので、実際に試す事は躊躇していました。

    手元に、RX26Tのジャンクボードがあったので、SEPR=WRPR=RDPR=0にした状態から色々やってみたのですが、RX26TはRFPの操作だけで、出荷時状態に戻せました。で、本命のRX660でも試したのですが、RFPでごにょごにょやる限りでは上手く行きませんでした。(またジャンクボードを生み出してしまったと思いました。)

    RX660では、デバッガ接続でFACIコマンドのコードを実行する必要があります。

    やることは、

    (1)SPCCのb31-b24を0x1eに変更する
    (2)OSISのb7-b0を0x45に変更する

    です。

    /**********************************************************************************************************************
     * DISCLAIMER
     * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No
     * other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
     * applicable laws, including copyright laws.
     * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
     * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM
     * EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES
     * SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO
     * THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
     * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of
     * this software. By using this software, you agree to the additional terms and conditions found by accessing the
     * following link:
     * http://www.renesas.com/disclaimer
     *
     * Copyright (C) 2020 Renesas Electronics Corporation. All rights reserved.
     *********************************************************************************************************************/
    /***********************************************************************/
    /*                                                                     */
    /*  FILE        :Main.c or Main.cpp                                    */
    /*  DATE        :Tue, Oct 31, 2006                                     */
    /*  DESCRIPTION :Main Program                                          */
    /*  CPU TYPE    :                                                      */
    /*                                                                     */
    /*  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
    /*                                                                     */
    /***********************************************************************/
    //#include "typedefine.h"
    #include "r_smc_entry.h"
    
    #ifdef __cplusplus
    //#include <ios>                        // Remove the comment when you use ios
    //_SINT ios_base::Init::init_cnt;       // Remove the comment when you use ios
    #endif
    
    #define	FACI		(*(volatile unsigned char *)0x7e0000)
    #define	FACI2		(*(volatile unsigned short *)0x7e0000)
    
    #pragma section P PRAMPRG
    
    void config_write(void)
    {
    	unsigned char wdata[16];
    	int i;
    	
    	for(i=0; i<16; i++) wdata[i] = 0xff;
    	
    	wdata[3] = 0x1e; 
    	
    	FLASH.FWEPROR.BYTE = 0x01;
    	
    	FLASH.FENTRYR.WORD = 0xAA80;
    	
    	FLASH.FSADDR.LONG = 0x00000040;
    	
    	FACI = 0x40;
    	FACI = 0x08;
    	
    	for(i=0; i<8; i++)
    	{
    		while (FLASH.FSTATR.BIT.DBFULL != 0)
    		{
    			__nop();
    		}
    		FACI2 = (unsigned short)wdata[i*2] |  (((unsigned short)wdata[i*2+1]) << 8);
    	}
    	
    	FACI = 0xD0;
    	
    	while (FLASH.FSTATR.BIT.FRDY != 1)
    	{
    		__nop();
    	}
    	
    	FLASH.FSADDR.LONG = 0x00000050;
    	
    	for(i=0; i<16; i++) wdata[i] = 0xff;
    	
    	wdata[0] = 0x45; 
    	
    	FACI = 0x40;
    	FACI = 0x08;
    	
    	for(i=0; i<8; i++)
    	{
    		while (FLASH.FSTATR.BIT.DBFULL != 0)
    		{
    			__nop();
    		}
    		FACI2 = (unsigned short)wdata[i*2] |  (((unsigned short)wdata[i*2+1]) << 8);
    	}
    	
    	FACI = 0xD0;
    	
    	while (FLASH.FSTATR.BIT.FRDY != 1)
    	{
    		__nop();
    	}
    
    	FLASH.FENTRYR.WORD = 0xAA00;
    	
    	FLASH.FWEPROR.BYTE = 0x02;
    	
    	while(1)
    	{
    		__nop();
    	}
    }
    
    #pragma section
    
    void main(void);
    #ifdef __cplusplus
    extern "C" {
    void abort(void);
    }
    #endif
    
    void main(void)
    {
    	unsigned long ram_addr = 0x4000;
    	unsigned long rom_addr = 0xfff04000;
    	unsigned long size = 0x200;
    	
    	//CC-RXのリンカ設定でROMからRAMにマッピングする設定に「PRAMPRG=RRAMPRG」を追加
    	
    	unsigned long i;
    	
    	for (i=0; i<size; i++)
    	{
    		(*(volatile unsigned char *)ram_addr++) = (*(volatile unsigned char *)rom_addr++);
    	}
    
    	config_write();
    }
    
    #ifdef __cplusplus
    void abort(void)
    {
    
    }
    #endif
    

    添付の様なコードをデバッガでロードして実行すればOKです。

    (添付ファイルは、以前GAさまとフラッシュROMの消去・書き込みを試したコードをベースにしているので、RAM実行のコードとなっていますが、今回のコンフィグメモリの書き込みはBGOで行けると思いますので、多分ROM実行でも問題無いと思います。)

    (私が試した限りでは、SEPR=WRPR=RDPR=0だと、bit 0を1に変更する事が出来ませんでしたが、1を0にする事は出来ました。)

    (1)の操作で、

    ・最初の状態SPCC=0x1f....:イレース不可の状態

    ・SPCCのb24=0に書き換える:IDコードが設定された状態(IDを知っていれば消せる)

    となります。

    上記書き換え後、普通にRFPで当該チップに接続してください。

    認証コードを聞かれるので、そのままOKを押してください。

    認証コードが違うと怒られますが、そのままOKを合計3回押してください。

    (3回目のエラーの前に、一瞬間が空くはずです。エラーは3回出してください。)

    この状態で、チップはブランク状態(消去プロテクトなし)となります。

    もし、デバッガ接続の時に、IDコードを聞かれる状態になっており、入力して接続しているのであれば、(2)のところとRFPに全消去させるところの手順が変わります。デバッガ接続時に、IDを聞かれない状態(もしくは、チップのOSISのb7-b0=0xFF)であれば、上記手順でOKです。

  • tf様
    お世話になっております。
    GAです。

    上記の件、ご回答ありがとうございます。
    頂いたソースを参考に、デバッガ経由で設定を行ったのですが、
    コードを入力する画面が出ず、
    RFP上のエラーコードが「デバイスでプロテクションエラーが発生しました。」のまま変化せず、
    何度エラーを発生させても、デバイスが初期化されるような動きがみられませんでした。
    また、その後から、デバッガ経由で接続する際にIDコードを要求されるようになってしまいました。
    (IDコード自体はFF45FFFFFFFFFFFFFFFFFFFFFFFFFFFFで接続できることは確認しました。

    恐らく現状が、
    >もし、デバッガ接続の時に、IDコードを聞かれる状態になっており、入力して接続しているのであれば、(2)のところとRFPに全消去させるところの手順が変わります。
    上記の状態となってしまっていると思われるのですが、この場合の手順をお教えいただいてもよろしいでしょうか。

    以上です。宜しくお願い致します。

  • SPCCとOSISを書き換えるプロジェクトですが、BigEndianで作成したプロジェクトで実行されていないでしょうか?その場合、LittleEndianで作成したプロジェクトで、同じ事を実行してください。

    (デバッガ接続時に、IDを聞かれない状態→聞かれる状態に変化したなら、データの書き換え自体は出来ています。でも、設定値が思った値にはなっていません。)

    Endianをデフォルトから変えていない場合は、デバッガでチップに接続して

    MDE
    SPCC
    OSIS

    の値のハードコピーを取ってもらえないでしょうか。

    (OSISに御社で独自の秘密のIDを設定されている場合は、OSISの値の提示は不要ですが、デバッガ接続で上記IDを入力したら接続出来るのであれば、それは無いと思います。)