I/Oリソースマネージャ¶
SOLID-OSはリソースマネージャにIOを登録することにより、自動的に仮想アドレスを割り付けます。
割り付けられた仮想アドレスは、キャッシュなし、バッファありの属性となっているため、IOに書き込み 処理をした後、その結果を確実に反映させるためには、DMB命令を使用する必要があります。
IOリソースの登録は、通常は 要実装関数 IMPL_IORES_GetConfig を使って行います。
API¶
IOリソース関連のAPIを使用するには、solid_iores.h をインクルードしてください。
#include "solid_iores.h"
SOLID_IORES_REGINFO¶
-
typedef struct _SOLID_IORES_REGINFO_ SOLID_IORES_REGINFO¶
-
struct _SOLID_IORES_REGINFO_¶
説明
IOリソース登録用構造体
定義
typedef struct _SOLID_IORES_REGINFO_ { const char* pName; SOLID_PHYADDRESS addr; size_t width; int extra; } SOLID_IORES_REGINFO;
メンバー
-
const char *pName¶
IO名称
-
SOLID_PHYADDRESS addr¶
IOのある物理アドレス。
SOLID_IORES_USEDEFAULTを指定した場合、コアサービスが既定とする アドレス(GICD/GICC等)が使用されます。
-
size_t width¶
IOのある範囲
-
int extra¶
intNo, bitNo等を格納
-
const char *pName¶
SOLID_IORES_USEDEFAULT¶
-
SOLID_IORES_USEDEFAULT¶
SOLID_IORES_REGINFOのaddrに指定する特別値(0xFFFFFFFF)です。 この値を指定すると、コアサービスが既定とする物理アドレスが使用されます。
SOLID_IORES_INFO¶
-
typedef struct _SOLID_IORES_INFO_ SOLID_IORES_INFO¶
-
struct _SOLID_IORES_INFO_¶
説明
IOリソース情報取得用構造体
定義
typedef struct _SOLID_IORES_INFO_ { SOLID_ADDRESS addr; size_t width; int extra; } SOLID_IORES_INFO;
メンバー
-
SOLID_ADDRESS addr¶
IOを割り当てた仮想アドレス
-
size_t width¶
IOのある範囲
-
int extra¶
intNo, bitNo等を格納
-
SOLID_ADDRESS addr¶
SOLID_IORES_Register¶
-
int SOLID_IORES_Register(SOLID_IORES_REGINFO *pInfo)¶
IOリソース管理にIO情報を登録します
- パラメータ:
pInfo -- 登録するIO情報 (この情報は、関数呼び出し後も保持したままとしてください)
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_IORES_CheckInfo¶
-
SOLID_IORES_REGINFO *SOLID_IORES_CheckInfo(const char *pName)¶
IOリソース管理に登録されているIO情報を取得します
- パラメータ:
pName -- 取得するIOリソース情報の名前(文字列, NULL終端)
- 戻り値:
NULL以外: IO情報へのポインタ
NULL: 該当する情報なし
SOLID_IORES_Use¶
-
int SOLID_IORES_Use(const char *pName)¶
IOリソースの使用開始を宣言します
これにより、IOが仮想アドレスにマップされます
- パラメータ:
pName -- 使用を開始するIOリソース情報の名前(文字列, NULL終端)
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_IORES_Unuse¶
-
int SOLID_IORES_Unuse(const char *pName)¶
IOリソースの使用終了を宣言します
これにより、IOが仮想アドレスからアンマップされます
- パラメータ:
pName -- 使用を終了するIOリソース情報の名前(文字列, NULL終端)
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_IORES_GetInfo¶
-
int SOLID_IORES_GetInfo(const char *pName, SOLID_IORES_INFO *pInfo)¶
IOリソースの割り当て状況を確認します
- パラメータ:
pName -- IOリソース情報の名前(文字列, NULL終端)
pInfo -- 取得したIO情報
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
要実装関数¶
IOリソース関連の要実装関数の定義は、impl_iores.h にあります。
#include "impl_iores.h"
IMPL_IORES_Init¶
-
void IMPL_IORES_Init(void)¶
IOリソースの初期化を行います。
この関数はMMUの設定前に呼び出されます。モニタデバッグを行う場合は、ブート側 からも呼び出されます。
デフォルトで空の実装(weak)が用意されているため、実装は必須ではありません。 MMU設定前に行いたいIOリソース関連の初期化がある場合にのみ実装してください。
IMPL_IORES_GetConfig¶
-
void IMPL_IORES_GetConfig(SOLID_IORES_REGINFO **ppInfo, int *pNum)¶
SOLIDで使用するデバイスの物理アドレス等を取得する
この関数で取得されたデバイスは、SOLIDで自動的に仮想アドレスを割り付けます
- パラメータ:
ppInfo -- デバイス設定
pNum -- デバイス設定の個数
予約されたI/Oリソース名¶
一部のI/Oリソース名は、コアサービス内で予約されており、コアサービス内で使用します。
予約されたリソース名は、solid_iores.h にマクロが定義されています。
-
SOLID_IORES_NAME_GICD¶
-
SOLID_IORES_NAME_GICC¶
-
SOLID_IORES_NAME_PL310¶
定数
名前
値
説明
extraの意味
SOLID_IORES_NAME_GICD"ARM_GICD"
ARM GIC (PL390,GIC400) Distributor
使用可能な割り込み番号の最大値(32~1023)
SOLID_IORES_NAME_GICC"ARM_GICC"
ARM GIC (PL390,GIC400) CPU Interface
割り込み優先度のレベル(2~256)
SOLID_IORES_NAME_PL310"ARM_PL310"
ARM Level 2 Cache Controller (PL310, L2C-310)
なし
RISC-V では、以下のリソース名が予約されています。SOLID_IORES_NAME_MSWI /
SOLID_IORES_NAME_MTIME / SOLID_IORES_NAME_MTIMECMP は、Mモードで動作する
構成 (SOLID_RISCV_RUNS_ON_MMODE) でのみ定義されます。
-
SOLID_IORES_NAME_PLIC¶
-
SOLID_IORES_NAME_MSWI¶
-
SOLID_IORES_NAME_MTIME¶
-
SOLID_IORES_NAME_MTIMECMP¶
定数
名前
値
説明
SOLID_IORES_NAME_PLIC"RISCV_PLIC"
RISC-V Platform-Level Interrupt Controller (PLIC)
SOLID_IORES_NAME_MSWI"RISCV_MSWI"
Machine-mode Software Interrupt (MSWI) レジスタ
SOLID_IORES_NAME_MTIME"RISCV_MTIME"
Machine-mode Timer (mtime) レジスタ
SOLID_IORES_NAME_MTIMECMP"RISCV_MTIMECMP"
Machine-mode Timer Compare (mtimecmp) レジスタ