# OS_SetProtectionRegion*

## 構文

  `#include <nitro/os.h>`
  (`アドレスとサイズ指定`)
  `#define OS_SetProtectionRegion( regionNo, address, sizeStr );`
  `void OS_SetProtectionRegionEx( int regionNo, u32 address, u32 sizeDef );`
  (`パラメータ指定`)
  `void OS_SetProtectionRegionParam( int regionNo, u32 param );`
  `void OS_SetProtectionRegion0( u32 param )`;
  `void OS_SetProtectionRegion1( u32 param );`
  `void OS_SetProtectionRegion2( u32 param );`
  `void OS_SetProtectionRegion3( u32 param );`
  `void OS_SetProtectionRegion4( u32 param );`
  `void OS_SetProtectionRegion5( u32 param );`
  `void OS_SetProtectionRegion6( u32 param );`
  `void OS_SetProtectionRegion7( u32 param );`

## 引数

regionNo | プロテクションリージョン番号です。0〜7の値で指定してください。
address | ベースアドレス(開始アドレス)です。u32型で指定してください。
sizeStr | 領域サイズを表す文字列です。4KB、8KB など特定の文字列のみ指定出来ます。
sizeDef | 領域サイズを表す値です。OS_PR_SIZE_xxx (xxx=4KB, 8KB, ... 4GB) です。
param | ベースアドレスと領域サイズ指定値の論理和で、CP15に設定される値です。

## 返り値

なし。

## 説明

プロテクションリージョンのベースアドレス(開始アドレス)とサイズを設定します。
同時に `OS_SetProtectionRegion()` ではプロテクションユニットを有効と設定します。

プロテクションリージョンの設定はシステムの挙動に大きく関わってきます。プロテクションリージョンの仕組みと各領域の使用用途などを理解した上で設定を行なってください。

### `・OS_SetProtectionRegion()`

`OS_SetProtectionRegion()` はマクロとなっています。regionNoはセットするプロテクションリージョンのリージョン番号で、0〜7の値を取ります。この引数は、マクロでそのまま文字列として使用しますので0〜7の値を入れた変数の指定などは出来ません。0〜7の値そのもので指定してください。

address はプロテクションリージョンを設定するベースアドレス(開始アドレス)です。u32型で指定してください。プロテクションリージョンの大きさによって、指定するアドレスのアラインメント制限が異なります。プロテクションリージョンの先頭アドレスは領域サイズの倍数にしなければならないので、例えば4KBのプロテクションリージョンならば、u32値で表されるアドレスの下位12ビットは0でなければなりません。

sizeStr はプロテクションリージョンの領域サイズを表す文字列で、指定できるものは以下のうちのひとつです。

> 4KB 8KB 16KB 32KB 64KB 128KB 256KB 512KB
> 1MB 2MB 4MB 8MB 16MB 32MB 64MB 128MB 256MB 512MB
> 1GB 2GB 4GB

> (例)
> `OS_SetProtectionRegion( 2, 0x02080000, 32KB );`

`OS_SetProtectionRegion()` を呼ぶと、それを呼ぶ前の状態に関わらずリージョンは有効になります。

### `・OS_SetProtectionRegionEx()`

`OS_SetProtectionRegionEx()` は `OS_SetProtectionRegion()` がマクロだったために出来なかったリージョン番号の変数渡し等を可能にするために用意されました。

regionNo はセットするプロテクションリージョンのリージョン番号で、0〜7の値を取ります。

address はプロテクションリージョンを設定するベースアドレス(開始アドレス)です。その他、`OS_SetProtectionRegion()` と同じです。

sizeDef は `OS_PR_SIZE_xxx` という値です。`xxx` には

> 4KB 8KB 16KB 32KB 64KB 128KB 256KB 512KB
> 1MB 2MB 4MB 8MB 16MB 32MB 64MB 128MB 256MB 512MB
> 1GB 2GB 4GB

のいずれかを指定することが出来ます。

> (例)
> `OS_SetProtectionRegionEx( 2, 0x02080000, OS_PR_SIZE_32KB );`

### `・OS_SetProtectionRegionParam()`

`OS_SetProtectionRegionParam()` は、ベースアドレスと領域サイズをプロテクションリージョンの内部パラメータ形式で指定するための関数です。regionNo については `OS_SetProtectionRegionEx()` と同じです。パラメータ param は、ベースアドレスと、領域サイズを表す設定値 HW_C6_PR_SIZE_xxx との論理和です。xxx には上でsizeStr として挙げたもの(4KB または 8KB または…4GB) が入ります。またリージョンを有効にしたい場合は HW_C6_PR_ENABLE も論理和に含めてください。

> (例)
> `OS_SetProtectionRegionParam( 2, 0x02080000 | HW_C6_PR_32KB | HW_C6_PR_ENABLE );`

### `・OS_SetProtectionRegion0() 〜 OS_SetProtectionRegion7()`

`OS_SetProtectionRegion0()` 〜 `OS_SetProtectionRegion7()` は `OS_SetProtectionRegionParam()` のリージョン番号を関数名で指定するものです。param に関しては`OS_SetProtectionRegionParam()` と同様です。

## 内部動作

システム制御コプロセッサ CP15 のレジスタ6を操作します。

## 参照

`OS_EnableProtectionUnit, OS_DisableProtectionUnit
OS_GetProtectionRegion*`

## 履歴

2007/10/25 `OS_SetProtectionRegionEx()` を追加。その他記述も追加。
2004/07/08 HW_C6_PR_ENABLE について記述
2004/05/28 初版