/*
  *****************************************************************************
  
  	File :		s_flashrom.h
  	Programer :	Gentaro Takaki
  
	$Id: s_flashrom.h,v 1.2 2004/02/12 22:54:41 tong Exp $
	
  *****************************************************************************
*/

#ifndef	S_FLASHROM_H_INCLUDED
#define	S_FLASHROM_H_INCLUDED

#if	defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

#ifdef	_LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif


/** 1ページ( セクタ )分のバイト数 */
#define	sFRm_PAGE_BYTE		(128)
    
/*
  *****************************************************************************
  	■ FlashRom初期化関数

  	   in	: なし

	   out	: なし

	   返り値	: なし
  ----------------------------------------------------------------------------
	(♀)備考 ... Flashromを使用する前に必ず一度この関数を実行してください.
  *****************************************************************************
  */
extern int sFRm_FlashRomInit( void );

/*
  *****************************************************************************
	■ フラッシュロムが有効かどうか
	
	   返り値	: !0 有効 / 0 無効
  *****************************************************************************
 */
extern s32 sFRm_FlashisAvailable( void );


/*
  *****************************************************************************
  	■ 指定したセクタを含む 16Kバイトバウンダリ領域のデータ消去関数
  
  	   in	: セクタ番号 (u32)

	   out	: なし

	   返り値	: 0 正常終了 / -1 異常終了
  ----------------------------------------------------------------------------
	(♀)備考 ... FlashRomではセクタ単位( = 128バイト )での消去はできません.
		     必ず, 指定したセクタを含む 16Kバイトバウンダリ領域すべての
		     データが消去されます. ( 例えば, セクタ 0x003を指定した
		     場合, セクタ 0x000 〜 0x07fのデータすべてが消去されます )

		     FlashRomへのセクタ毎の書き込みを行う際には, 必ずこの関数
		     で, 該当する ( 書き込みを行う )領域のデータを消去しておく
		     必要があります. 読み込みの際には必要ありません.
  *****************************************************************************
 */
extern s32 sFRm_FlashArrayErase(
    u32	sector_num	/** セクタ番号 */
    );

/*
  *****************************************************************************
  	■ 指定したセクタを含む 16Kバイトバウンダリ領域のデータ消去関数
  
  	   in	: なし

	   out	: なし

	   返り値	: 0 正常終了 / -1 異常終了
  ----------------------------------------------------------------------------
  *****************************************************************************
 */
extern s32 sFRm_FlashAllErase(
    void
    );

/*
  *****************************************************************************
  	■ 1M FLASHROMの指定したセクタへの 128バイトのデータの書き込み関数
  
  	   in	: 書き込み用バッファ (u32 *) ...サイズは 128バイト
	   	  セクタ番号 (u32)

	   out	: なし

	   返り値	: 0 正常終了 / -1 異常終了
  ----------------------------------------------------------------------------
	(♀)備考 ... この関数でセクタへのデータの書き込みを行う前に, 必ず
		     先に該当する領域のデータの消去を行ってください.
		     データの消去には sFRm_FlashArrayEraseを使用してください.

		     書き込みサイズは 1セクタ = 128バイトです.
		     セクタ 0x1ffと 0x3ffは, 後半の 64バイトのデータの読み込
		     みが出来ませんので, これに相当する領域に必要なデータを
		     書き込むことは禁止します.
  *****************************************************************************
 */
extern s32 sFRm_FlashWriteSector(
    u32 *buf,		/** 書き込み用バッファ ( サイズは 128バイト ) */
    u32 sector_num	/** セクタ番号 */
    );


/*
  *****************************************************************************
  	■ 指定したセクタを含む 16Kバイトの領域の消去・データの書き込み関数

  	   in	: 書き込み用バッファ (u32 *) ...サイズは 16Kバイト
	   	  セクタ番号 (u32) ... 128の倍数
		  書き込むページ数(32) ... 1 〜 128
		  
	   out	: なし

	   返り値	: 0 正常終了 / -1 異常終了 / 1 セクタ番号の不正
  ----------------------------------------------------------------------------
	(♀)備考 ... FlashRomはデータの書き込み時に, 書き込みを行うセクタを含
		     む 16Kバイトの領域を消去する必要があります. そのため,
		     FlashRomへの書き込みは 16Kバイト単位で行います.
		     
		     セクタ番号には, 128の倍数 ( 0を含む )を指定してください.
		     指定したセクタ番号を含む 16Kバイトバウンダリのデータを
		     消去し書き込みを行います.
		     
		     書き込みサイズは 16Kバイトです.
		     返り値として -1が返った場合は, PIマネージャが実行されて
		     いないか, 書き込みに失敗しています. 必ず先に, 一度
		     PIマネージャを実行してください.
		     書き込みに失敗した場合, 同じデータの書き込みを 4回だけ
		     再書き込みしています.
		     1が返った場合は, セクタ番号の指定が間違っています.
		     128の倍数で指定してください.
  *****************************************************************************
  */
extern s32 sFRm_FlashWriteArray(
    u32 *buf,		/** 書き込み用バッファ ( サイズは 16Kバイト ) */
    u32 sector_num,	/** セクタ番号 ( 128の倍数で指定 ) */
    u32	page_n		/** 書き込むページ数( 1 〜 128 ) */
    );

/*
  *****************************************************************************
  	■ 指定したセクタからのデータの読み込み関数

  	   in	: セクタ番号 (u32)

	   out	: 読み込み用バッファ (u32 *) ... サイズは 128バイト

	   返り値	: 0 正常終了 / -1 異常終了
  ----------------------------------------------------------------------------
	(♀)備考 ... 返り値として -1が返った場合は, PIマネージャが実行されて
		     いません. 必ず先に, 一度 PIマネージャを実行してください.
		     それ以外では, osSendMesgか osJamMesgのどちらかのステータス
		     が返ります.
		     
		     読み込みサイズは 1セクタ = 128バイトです.
		     セクタ番号 0x1ffと 0x3ffに関してのみ, データの前半部分
		     (64バイト) しか正しく読み込み出来ませんので注意してくだ
		     さい.
  *****************************************************************************
  */
extern s32 sFRm_FlashReadSector(
    u32 *buf,		/** 読み込み用バッファ ( サイズは 128バイト ) */
    u32 sector_num	/** セクタ番号 */
    );

/*
  *****************************************************************************
  	■ 指定したセクタから 16Kバイト分のデータを読み込む関数
	
  	   in	: セクタ番号 (u32)
		  読み込むページ数(32) ... 1 〜 128

	   out	: 読み込み用バッファ (u32 *) ... サイズは 16Kバイト

	   返り値	: 0 正常終了 / -1 異常終了
  ----------------------------------------------------------------------------
	(♀)備考 ... 返り値として -1が返った場合は, PIマネージャが実行されて
		     いません. 必ず先に, 一度 PIマネージャを実行してください.
		     それ以外では, osSendMesgか osJamMesgのどちらかのステータス
		     が返ります.
		     
		     読み込みサイズは 1セクタ = 16Kバイトです.
  *****************************************************************************
 */
extern s32 sFRm_FlashReadArray(
    u32 *buf,		/** 読み込み用バッファ ( サイズは 16Kバイト ) */
    u32 sector_num,	/** セクタ番号 */
    u32	page_n		/** 読み込むページ数 */
    );

/*
 ------------------------------------------------------------------------------
 *	フラッシュロムバックグランド処理
 ------------------------------------------------------------------------------
 */
/*
 *******************************
 *	別スレッドで書き込み開始
 *******************************
 */
extern void sFRm_FlashWriteArray_bg(
    u32		*const buf,
    u32		const sector_num,
    u32		const page_n
    );
/*
 *******************************
 *	書き込み終了したかどうか
 *******************************
 */
extern s32 sFRm_FlashWriteArray_isFinished( void );
/*
 ***********************************
 *	別スレッドで書き込み終了処理
 ***********************************
 */
extern s32 sFRm_FlashWriteArray_sync( void );
/*
 ******************************************
 *	別スレッドで書き込み ( 開始〜終了 )
 ******************************************
 */
extern s32 sFRm_FlashWriteArray_fg(
    u32	*const buf,
    u32	const sector_num,
    u32	const page_n
    );
 
/*
 ****************************************************************
 *	フラッシュロムステータス取得
 ****************************************************************
 */
extern s32 sFRm_GetFlashStatus( void );

#ifdef	_LANGUAGE_C_PLUS_PLUS
}
#endif

#endif	/** defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
#endif	/** S_FLASHROM_H_INCLUDED */

    
