/**
 * @brief           OS Wrapper Header
 * @author          AXELL CORPORATION
 * @description     OS Wrapper提供ヘッダ。
 * @note            OS Wrapper使用時にincludeして下さい。
 * @history         2017_02_22  初版
 * @history         2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017-2019 AXELL CORPORATION, all rights reserved.
 */

#ifndef _OSWRAPPER_H_
#define _OSWRAPPER_H_
/* DOM-IGNORE-END */

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/** キャッシュページサイズ（=MMUスモールページサイズ） */
#define AG903_OSW_CACHE_PAGESIZE	(4096)	/** ページサイズ(変更不可) */

/** 割込み優先度初期値(0:High〜31:Low) */
#define AG903_OSW_DEFAULT_INTRPRI	(20)

/** 割込みハンドラ属性 */
#define AG903_OSW_HLNG				(0)

/** 割込み（IRQ）数 */
#define AG903_OSW_IRQ_NUM_MAX		(64)

/** 割込み（IRQ）優先度 */
#define AG903_OSW_IRQ_PRI_MAX		(32)

/** VRAM属性 */
enum _AG903_OswAttribute {
	AG903_OSW_ATRFIFO=0,		/** オブジェクト属性（FIFO順） */
	AG903_OSW_ATRPRI,			/** オブジェクト属性（優先度順） */
	AG903_OSW_ATRNUM,			/** オブジェクト属性 上記属性個数 */
};

/** メモリタイプ指定 */
enum _AG903_OswMemType {
	AG903_OSW_NORMAL_CACHE_OFF=0,	/** メモリタイプ指定（CACHE OFF） */
	AG903_OSW_NORMAL_CACHE_ON,		/** メモリタイプ指定（CACHE ON） */
	AG903_OSW_STRONGLY_ORDERED,		/** メモリタイプ指定（STRONGLY ORDERED） */
};

/** 可変長メモリパラメータ<p>
    mplatr は右から指定します。 _AG903_OswAttribute<p>
    mpl にNULLを指定した場合はカーネルがメモリを確保します。
    この時 memtype の設定は無効になります。（カーネルが使用する領域の設定に依存）<p>
    memtype は右から指定します。 _AG903_OswMemType<p>
    注：mpl でアドレス指定時、内部では4KB単位でメモリプールが作成されます。（端数切り上げ）*/
typedef struct _AG903_OSWCMpl {
    uint32_t mplatr;     /** 属性 */
    uint32_t mplsz;      /** メモリプールのサイズ[バイト] */
    void*	 mpl;        /** メモリプール領域の先頭番地 */
    int8_t   memtype;    /** メモリタイプ */
	int8_t   reserve[3]; /** 予約 */
} AG903_OSWCMpl;

/** 可変長メモリステータス */
typedef struct _AG903_OSWRMpl {
    int32_t  wtskid;    /** メモリ獲得待ち先頭タスクID (未使用) */
    uint32_t fmplsz;    /** メモリプールの空きサイズ[バイト] */
    uint32_t fblksz;	/** 獲得可能な最大メモリブロックサイズ[バイト] */
} AG903_OSWRMpl;

/** 固定長メモリパラメータ<p>
    mplatr は右から指定します。 _AG903_OswAttribute<p>
    mpf にNULLを指定した場合はカーネルがメモリを確保します。
    この時 memtype の設定は無効になります。（カーネルが使用する領域の設定に依存）<p>
    memtype は右から指定します。 _AG903_OswMemType<p>
    注：mpf でアドレス指定時はblkcnt×blkszが4KBの倍数になるように指定して下さい。*/
typedef struct _AG903_OSWCMpf {
	uint32_t mpfatr;		/** 属性 */
	uint32_t blkcnt;		/** 獲得できるメモリブロックの数 */
	uint32_t blksz;			/** メモリブロックのサイズ[バイト] */
	void*	 mpf;			/** メモリプール領域の先頭番地(4KBアライン) */
    int8_t   memtype;		/** メモリタイプ */
	int8_t   reserve[3];	/** 予約 */
} AG903_OSWCMpf;

/** 固定長メモリステータス */
typedef struct _AG903_OSWRMpf {
    int32_t  wtskid;    /** メモリ獲得待ち先頭タスクID */
    uint32_t fblkcnt;   /** 空きメモリブロック数 */
} AG903_OSWRMpf;

/** 割込みハンドラパラメータ<p>
    atr は右から指定します。 AG903_OSW_HLNG<p>
    exinf は割込みサービスルーチンへの引数になります。*/
typedef struct _AG903_OSWCIsr {
	uint32_t  atr;	    /** 属性 */
	void*     exinf;	/** 拡張情報(割り込みサービスルーチンへの引数として使用 T-Kernelでは常にNULL) */
	uint32_t  intno;    /** 割込み番号(0-63) */
    void*     func;     /** 割込みサービスルーチンの起動番地(ルーチンの型はvoid(*func)(void *extinf) ) */
} AG903_OSWCIsr;

/** 割込みハンドラステータス */
typedef struct _AG903_OSWRIsr {
	uint32_t intno;     /** 割込み番号 */
	void*    isr;       /** 割込みハンドラ関数の起動番地 */
} AG903_OSWRIsr;


int32_t AG903_OSWprInitMemory(uintptr_t vramtop, uint32_t vramsize);
int32_t AG903_OSWprCreMpl(int32_t mplid, AG903_OSWCMpl* pk_cmpl);
int32_t AG903_OSWprCreMplAuto(AG903_OSWCMpl* pk_cmpl);
int32_t AG903_OSWprDelMpl(int32_t mplid);
int32_t AG903_OSWprGetMpl(int32_t mplid, uint32_t blksz, void** p_blk);
int32_t AG903_OSWprGetMplAlign(int32_t mplid, uint32_t align, uint32_t blksz, void** p_blk);
int32_t AG903_OSWprRelMpl(int32_t mplid, void* blk);
int32_t AG903_OSWprRefMpl(int32_t mplid, AG903_OSWRMpl* pk_rmpl);
int32_t AG903_OSWprCreMpf(int32_t mpfid, AG903_OSWCMpf* pk_cmpf);
int32_t AG903_OSWprCreMpfAuto(AG903_OSWCMpf* pk_cmpf);
int32_t AG903_OSWprDelMpf(int32_t mpfid);
int32_t AG903_OSWprGetMpf(int32_t mpfid, void** p_blk);
int32_t AG903_OSWprRelMpf(int32_t mpfid, void* blk);
int32_t AG903_OSWprRefMpf(int32_t mpfid, AG903_OSWRMpf* pk_rmpf);
int32_t AG903_OSWprIniInt(void);
int32_t AG903_OSWprCreIsrAuto(AG903_OSWCIsr* pk_cisr);
int32_t AG903_OSWprDelIsr(int32_t isrid);
int32_t AG903_OSWprRefIsr(int32_t isrid, AG903_OSWRIsr* pk_risr);
int32_t AG903_OSWprDisInt(uint32_t intno);
int32_t AG903_OSWprEnaInt(uint32_t intno);
int32_t AG903_OSWprChgIms(uint32_t imask);
int32_t AG903_OSWprGetIms(uint32_t* p_imask);
int32_t AG903_OSWprSetIpri(uint32_t intno, uint8_t intpri);

#ifdef __cplusplus
}
#endif
#endif /* _OSWRAPPER_H_ */
