Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

TRAVEO™ T2Gデバイスのソフトウェアプロテクションユニット(SWPU)オブジェクトを構成する – KBA234634

TRAVEO™ T2Gデバイスのソフトウェアプロテクションユニット(SWPU)オブジェクトを構成する – KBA234634

Infineon_Team
Employee
Employee
50 replies posted 25 likes received 25 replies posted

Translated by: 

Original KBA: Configure Software Protection Unit (SWPU) objects in TRAVEO™ T2G devices - KBA234634

Version: **

 

Flash書込み(または消去)権限を定義するためにソフトウェアプロテクションユニット(SWPU)オブジェクトを使用します。これを達成するために、SFLASHのRow 59にSWPUオブジェクトパラメータをプログラムすることで、TRAVEO™ T2Gのスーパーバイザリーflash(SFLASH)メモリにSWPUオブジェクトを構成します。

このKBAでは、以下のトピックを説明します:

  1. SFLASH Row 59の構成
  2. SFLASH Row 59にSWPU/FWPUオブジェクトを追加
  3. SFLASH Row 59にプログラム
  4. SRAMの属性を更新
  5. SWPUオブジェクトがソフトウェアで使用される場合の考慮点

 

  1. SFLASH Row 59の初期構成

SFLASH Row 59の初期値を以下の表に示します。

1. SFLASH Row 59の初期構成

Row 59

アドレス

初期値

名前

1700_7600

0x30

PU_OBJECT_SIZE

1700_7601

0x00

PU_OBJECT_SIZE

1700_7602

0x00

PU_OBJECT_SIZE

1700_7603

0x00

PU_OBJECT_SIZE

1700_7604

0x00

N_FWPU0

1700_7605

0x00

N_FWPU1

1700_7606

0x00

N_FWPU2

1700_7607

0x00

N_FWPU3

1700_7608

0x01

N_ERPU0

1700_7609

0x00

N_ERPU1

1700_760A

0x00

N_ERPU2

1700_760B

0x00

N_ERPU3

1700_760C

0x68

ERPU0_SL_OFFSET_0

1700_760D

0x00

ERPU0_SL_OFFSET_1

1700_760E

0x00

ERPU0_SL_OFFSET_2

1700_760F

0x00

ERPU0_SL_OFFSET_3

1700_7610

0x18

ERPU0_FUSE_SIZE_0

1700_7611

0x00

ERPU0_FUSE_SIZE_1

1700_7612

0x00

ERPU0_FUSE_SIZE_2

1700_7613

0x80

ERPU0_FUSE_SIZE_3

1700_7614

0x07

ERPU0_SL_ATT_0

1700_7615

0x00

ERPU0_SL_ATT_1

1700_7616

0xFF

ERPU0_SL_ATT_2

1700_7617

0x00

ERPU0_SL_ATT_3

1700_7618

0x07

ERPU0_MS_ATT_0

1700_7619

0x00

ERPU0_MS_ATT_1

1700_761A

0xFF

ERPU0_MS_ATT_2

1700_761B

0x00

ERPU0_MS_ATT_3

1700_761C

0x01

N_EWPU0

1700_761D

0x00

N_EWPU1

1700_761E

0x00

N_EWPU2

1700_761F

0x00

N_EWPU3

1700_7620

0x68

EWPU0_SL_OFFSET_0

1700_7621

0x00

EWPU0_SL_OFFSET_1

1700_7622

0x00

EWPU0_SL_OFFSET_2

1700_7623

0x00

EWPU0_SL_OFFSET_3

1700_7624

0x18

EWPU0_FUSE_SIZE_0

1700_7625

0x00

EWPU0_FUSE_SIZE_1

1700_7626

0x00

EWPU0_FUSE_SIZE_2

1700_7627

0x80

EWPU0_FUSE_SIZE_3

1700_7628

0x07

EWPU0_SL_ATT_0

1700_7629

0x00

EWPU0_SL_ATT_1

1700_762A

0xFF

EWPU0_SL_ATT_2

1700_762B

0x00

EWPU0_SL_ATT_3

1700_762C

0x07

EWPU0_MS_ATT_0

1700_762D

0x00

EWPU0_MS_ATT_1

1700_762E

0xFF

EWPU0_MS_ATT_2

1700_762F

0x00

EWPU0_MS_ATT_3

1700_7630

0x00

App Protection

1700_7631

0x00

App Protection

------------

0x00

App Protection

------------

0x00

App Protection

------------

0x00

App Protection

1700_77FF

0x00

App Protection

 

上記の構成より、Rowのサイズは512バイトです。このRowの各要素には1バイトデータがあります。

SWPUはFWPU(Flash書込みプロテクションユニット)、ERPU(eFuse読出しプロテクションユニット)およびEWPU(eFuse書込みプロテクションユニット)で構成されます。

以下は、このRowの各エントリの意味です:

  • PU_OBJECT_SIZE: 最初の4バイトは、Rowの中で構成された要素の総数であるPU_OBJECT_SIZEを定義します。初期構成では、0x1700_7600から開始し、0x1700_762Fまでの合計0x30バイト(4バイトオブジェクトサイズを含む)があります。
  • N_FWPU0-3:  これらの4バイトは、追加されるFWPUオブジェクトの数を定義します。初期構成では、追加されるFlash書込みプロテクションオブジェクトはゼロです。
  • N_ERPU0-3: これらの4バイトは、追加されるERPUの数を定義します。初期構成では、1つのERPUが追加されます。

ERPUには1つのエントリがあるため、次の16バイトはそのERPUの構成を示す必要があります。

  • ERPU0_SL_OFFSET_0-3: 4バイトは、スレーブアドレスのオフセットを示します。
  • ERPU0_FUSE_SIZE_0-3: 4バイトは、スレーブサイズを示します。

注: 最上位ビット(MSB)は、スレーブ領域が有効化されていることを示します。従って、エントリはERPU0_FUSE_SIZE_3では0x80になります。

  • ERPU0_SL_ATT_0-3: これら4バイトは、以下のように配置されるスレーブ属性を示します:

uint32_t UR                  : 1;

uint32_t PR                  : 1;

uint32_t NS                  : 1;

uint32_t reserved0    : 13;

uint32_t PC_MASK   : 16;

ERPU0_SL_ATT_0は0x07であるため、ユーザー読出し(UR)、特権読出し(PR)、および非セキュアアクセス(NS)が許可されます。ERPU0_SL_ATT_2は0xFFであるため、8台全てのPCはアクセスできます。

  • ERPU0_MS_ATT_0-3: これら4バイトは、スレーブ属性にアクセスするためにマスター属性を定義します。これら4バイトの形式は、以前説明したスレーブ属性のものと同じです。1

  • N_EWPU0-3: これら4バイトは追加したEWPUの数を定義します。初期構成では、1つのEWPUが追加されます。

次の16バイトは、eFuse書込みプロテクションオブジェクトの構成を定義し、eFuse読出しプロテクションオブジェクトの構成と類似しています。唯一の違いは、属性が読出しアクセス許可の代わりに書込みアクセス許可を定義することです。

uint32_t UW                 : 1;

uint32_t PW                 : 1;

uint32_t NS                  : 1;

uint32_t reserved0    : 13;

uint32_t PC_MASK   : 16;

EWPU0_SL_ATT_0は0x07であるため、ユーザー書込み(UW)、特権書込み(PW)、および非セキュアアクセス(NS)は許可されます。EWPU0_SL_ATT_2は0xFFであるため、8台すべてのPCはアクセスできます。

 

  1. このRowFWPUオブジェクトを追加する

Row 59の初期SFLASH構成は、FWPUオブジェクトのエントリがありません。ユーザーはエントリを追加する必要があります。

例を挙げてこれを説明しましょう。

注: この例では、SWPUの中にFWPUオブジェクトを追加することを検討します(最大16個のFWPUオブジェクトを追加できます)。

ユーザーが1つのFWPUオブジェクトを追加する場合、N_FWPU0は、0x01である必要があります。N_FWPU1、N_FWPU2およびN_FWPU3は0x00である必要があります。

FWPUオブジェクトのエントリを追加したので、次の16バイトでそのFWPUオブジェクトの構成を定義する必要があります。

ユーザーが2つのFWPUオブジェクトを追加する場合、次の32バイトを、2つのFWPUオブジェクト(それぞれ16バイト)の構成を定義するために使用する必要があります。

コードflashのセクター番号1にプロテクションを適用する必要がある場合を考えてみましょう。これは、2番目のセクターになり、アドレスは0x1000_0000+ (32*1024) = 0x1000_8000になります。

注: FWPUオブジェクトでは、絶対32ビットアドレスを指定する必要があります。また、最後の2ビットは、アライメントのため0にする必要があります。

これは、スレーブアドレスの4バイトが0x00 0x80 0x00 0x10に対応することを意味します。

このフルセクターをプロテクトする必要があるため、スレーブサイズは、0x8000で、サイズの4バイトは0x00 0x80 0x00 0x80に対応します。


注: 
MSBはリージョンが有効になる事を示しているため、4番目のバイトは0x80です。

すべてのPCのフルアクセス権のケースを想定すると:

a. 0x70 0x00 0xFF 0x00に対応するスレーブ属性の4バイト

b. 0x70 0x00 0xFF 0x00に対応するマスター属性の4バイト

があります。

注: 属性の構成は、アプリケーションのプロテクション要求に依存します。

これらのエントリー全てを考慮すると、Row 59の新しい構成は以下の表に示すようになります:

 

2: SFLASH Row 59の修正された構成

Row 59

アドレス

初期値

名前

1700_7600

0x40

PU_OBJECT_SIZE

1700_7601

0x00

PU_OBJECT_SIZE

1700_7602

0x00

PU_OBJECT_SIZE

1700_7603

0x00

PU_OBJECT_SIZE

1700_7604

0x01

N_FWPU0

1700_7605

0x00

N_FWPU1

1700_7606

0x00

N_FWPU2

1700_7607

0x00

N_FWPU3

1700_7608

0x00

FWPU0_SL _0

1700_7609

0x80

FWPU0_SL _1

1700_760A

0x00

FWPU0_SL _2

1700_760B

0x10

FWPU0_SL _3

1700_760C

0x00

FWPU0_SIZE_0

1700_760D

0x80

FWPU0_SIZE_1

1700_760E

0x00

FWPU0_SIZE_2

1700_760F

0x80

FWPU0_SIZE_3

1700_7610

0x07

FWPU0_SL_ATT_0

1700_7611

0x00

FWPU0_SL_ATT_1

1700_7612

0xFF

FWPU0_SL_ATT_2

1700_7613

0x00

FWPU0_SL_ATT_3

1700_7614

0x07

FWPU0_MS_ATT_0

1700_7615

0x00

FWPU0_MS_ATT_1

1700_7616

0xFF

FWPU0_MS_ATT_2

1700_7617

0x00

FWPU0_MS_ATT_3

1700_7618

0x01

N_ERPU0

1700_7619

0x00

N_ERPU1

1700_761A

0x00

N_ERPU2

1700_761B

0x00

N_ERPU3

1700_761C

0x68

ERPU0_SL_OFFSET_0

1700_761D

0x00

ERPU0_SL_OFFSET_1

1700_761E

0x00

ERPU0_SL_OFFSET_2

1700_761F

0x00

ERPU0_SL_OFFSET_3

1700_7620

0x18

ERPU0_FUSE_SIZE_0

1700_7621

0x00

ERPU0_FUSE_SIZE_1

1700_7622

0x00

ERPU0_FUSE_SIZE_2

1700_7623

0x80

ERPU0_FUSE_SIZE_3

1700_7624

0x07

ERPU0_SL_ATT_0

1700_7625

0x00

ERPU0_SL_ATT_1

1700_7626

0xFF

ERPU0_SL_ATT_2

1700_7627

0x00

ERPU0_SL_ATT_3

1700_7628

0x07

ERPU0_MS_ATT_0

1700_7629

0x00

ERPU0_MS_ATT_1

1700_762A

0xFF

ERPU0_MS_ATT_2

1700_762B

0x00

ERPU0_MS_ATT_3

1700_762C

0x01

N_EWPU0

1700_762D

0x00

N_EWPU1

1700_762E

0x00

N_EWPU2

1700_762F

0x00

N_EWPU3

1700_7630

0x68

EWPU0_SL_OFFSET_0

1700_7631

0x00

EWPU0_SL_OFFSET_1

1700_7632

0x00

EWPU0_SL_OFFSET_2

1700_7633

0x00

EWPU0_SL_OFFSET_3

1700_7634

0x18

EWPU0_FUSE_SIZE_0

1700_7635

0x00

EWPU0_FUSE_SIZE_1

1700_7636

0x00

EWPU0_FUSE_SIZE_2

1700_7637

0x80

EWPU0_FUSE_SIZE_3

1700_7638

0x07

EWPU0_SL_ATT_0

1700_7639

0x00

EWPU0_SL_ATT_1

1700_763A

0xFF

EWPU0_SL_ATT_2

1700_763B

0x00

EWPU0_SL_ATT_3

1700_763C

0x07

EWPU0_MS_ATT_0

1700_763D

0x00

EWPU0_MS_ATT_1

1700_763E

0xFF

EWPU0_MS_ATT_2

1700_763F

0x00

EWPU0_MS_ATT_3

1700_7640

0x00

App Protection

1700_7641

0x00

App Protection

------------

0x00

App Protection

------------

0x00

App Protection

------------

0x00

App Protection

1700_77FF

0x00

App Protection

 

注:

  1. 新たに追加されたエントリーは緑で印付けされています。
  2. eFuseの初期プロテクション構成は、押し下げられます。

 

  1. Row 59の書込み

最初に、上記で説明したrow構成にしたがってRow 59にプログラムする必要のあるデータを設定します。

ユーザーは、「Write ROW」SRAM APIを使用し、SFLASHのRow 59にデータをプログラムできます。このSRAM SPIの使用方法に関する詳細はデバイスアーキテクチャTRMを参照してください。

注: ユーザーは、HEXまたはELFファイルを準備し、データオブジェクトをプログラムする任意のプログラマーツールを使用することもできます。プログラマーツールは、WriteRowシステムコールをトリガすることもできます。

  1. SRAMの属性を更新します

SFLASHのSWPU構成は、TRAVEO™ T2G内部ブートプロセスの間に専用SRAM(プロテクトされているSRAM0の最初の2KB)にコピーされます。SRAMの属性は、対応するflashまたはeFuse領域のプロテクション用に使用されます。SRAMのこれらの属性は、「Write SWPU」SROM APIを使用して更新もできます(必要であれば):

FWPU、ERPUおよびEWPUは、以下の順番でSFLASHからSRAMにコピーされます:

- ブート用FWPU
- アプリケーション用FWPU
- ブート用ERPU
- アプリケーション用ERPU
- ブート用EWPU
- アプリケーション用EWPU

インデックスは上から下に0から開始します。これは、「Write SWPU」または「Read SWPU」SROM API用のPU IDを付ける時に考慮する必要があります。

上の例では、追加したFWPUオブジェクトのPU IDは0です。ユーザーが「Write SWPU」SROM APIを使用してSRAMの属性を更新したくない場合でも、ユーザーはSRAMで使用可能な同じコピーとしてSFLASHにすでにプログラムされた属性を使用できます。


注: 
TRAVEO T2G内部ブートは、FWPU1 ERPUおよび1 EWPUを構成します。

  1. SWPUオブジェクトをソフトウェアで使用する場合に考慮する点

 

  1. SWPUオブジェクト用に構成されたアドレス(例えば、FWPUオブジェクトのアドレス)は、昇順で配置される必要があります。
  2. SWPUオブジェクトエントリが前のオブジェクトエントリと重なっている場合、このエントリは飛ばされます。つまり、最下位のSWPUオブジェクトIDのみが保持されます。
  3. NC ECC障害がSRAMコントローラ #0に保留中で、SWPUが設計で入力される場合、FlashおよびeFuseシステムコールは(例えば、BlowFuseBitおよびProgramRow)、有効なeFuseアドレスの非プロテクトrowまたは0xf0000002(「無効なFuseアドレス」)でも0xf0000005(「ページは書込みプロテクトされている」)の誤解を招くような状態を返します。この問題の解決策として、NC ECC障害がハードウェア誤動作の原因ではない場合(つまり、障害が非初期化SRAMの使用、または不適切なSRAMの初期化の要因である場合)、これらの保留している障害のクリアが問題を解決します。保留中の障害は、任意の障害構造を使用する事でクリアできます。保留中の障害をクリアするために使用できるコード例を以下に示します:

#define REG32(addr) ( *( (volatile uint32_t *)(addr) ) )
#define FAULT_STRUCT_NUM 0
#define FAULT_STRUCT_PENDING1_ADDR(struct) (0x40210044U + ((struct) * 0x0100U))
#define RAMC0_NC_ECC_MASK (0x08000000U)
#define FAULT_STRUCT_MASK1_ADDR(struct) (0x40210054U + ((struct) * 0x0100U))
#define FAULT_STRUCT_STATUS_ADDR(struct) (0x4021000CU + ((struct) * 0x0100U))
/*
 * Clears pending NC ECC of SRAM Controller 0
 * Here FAULT_STRUCT_NUM is the number of any unused FAULT Structure set in FAULT_STRUCT_NUM define
 */
void Clear_SRAM_NC_ECC()
{
   /* preserve value of Fault mask1 register*/
   /* it is needed only if RAMC0_NC_ECC should not be present in FAULT MASK1 register*/
   uint32_t mask_bkp = REG32(FAULT_STRUCT_MASK1_ADDR(FAULT_STRUCT_NUM));
   /* check if there is pending RAMC0_NC_ECC */
   if (REG32(FAULT_STRUCT_PENDING1_ADDR(FAULT_STRUCT_NUM)) & RAMC0_NC_ECC_MASK)
   {
    /* set Fault mask to pass the fault from Pending to Status register*/
    /* if it is acceptable to have RAMC0_NC_ECC fault masked whole time then the instruction should be moved
        outside from the routine to be performed only once. Also preserve and restore of FAULT_STRUCT_MASK1
       register should be removed */
    REG32(FAULT_STRUCT_MASK1_ADDR(FAULT_STRUCT_NUM)) |= RAMC0_NC_ECC_MASK;
    do
    {
      /* Clear Fault Status register to receive next masked pending fault*/
      REG32(FAULT_STRUCT_STATUS_ADDR(FAULT_STRUCT_NUM)) = 0;
    }
    /* repeat until all pending RAMC0_NC_ECC are cleared */
    while (REG32(FAULT_STRUCT_PENDING1_ADDR(FAULT_STRUCT_NUM)) & RAMC0_NC_ECC_MASK);
   }
   /* restore value of Fault mask1 register*/
   /* it is only needed if it was preserved earlier */
   REG32(FAULT_STRUCT_MASK1_ADDR(FAULT_STRUCT_NUM)) = mask_bkp;
}

0 件の賞賛
255 件の閲覧回数