/*
 ******************************************************************************
 *              
 *      EEPROMセーブ管理の処理
 *              
 *      $Id: eepManager.c,v 1.1 2003/05/30 21:25:28 tong Exp $
 *				      1997年10月14日(火曜日) 14時05分08秒 JST
 ******************************************************************************
 */
#include <eepmgr.h>
#include "utility.h"
#include "main.h"
#include "eepManager.h"
#include "stackcheck.h"		/* stackcheck_t */

/*
 *	セーブ用の領域
 */
static eepmgr_t  eepmgr;
static eeprom	 eeprom_data;
/*
 ******************************************************************************
 *      データのチェックサムをしらべる
 ******************************************************************************
 */
static unsigned short getchecksum(eeprom_u *d)
{
    int	i;
    unsigned long	data = 0;

    for(i = 0; i < EEPROM_RW_DATA_SIZE; i += 1) {
        data ^= (unsigned long)d->ckeck_sum.data[i];
        data <<= 1;
        data = (data & 0x0000fffe) | ((data >> 16) & 0x00000001);
    }
    return (unsigned short)data;
}
/*
 ******************************************************************************
 *      ＥＥＰＲＯＭセーブ関数
 ******************************************************************************
 */
/*
 *	０:正常 １:異常
 */
int eeprom_save(char *d)
{
#if 0
    eeprom_data.rom[0] = (eeprom_u)(*d);
#endif
    cpymem_s(eeprom_data.rom, d, EEPROM_RW_DATA_SIZE);

    eeprom_data.rom[0].ckeck_sum.check = getchecksum(&eeprom_data.rom[0]);
    eeprom_data.rom[0].ckeck_sum.id = 0x81317531;
    eeprom_data.rom[1] = eeprom_data.rom[0];
    /*
     *	セーブ
     */
    eepmgr_save_bg(&eepmgr, eeprom_data.uc);
    if(eepmgr_sync(&eepmgr)) {
	/*
	 *	セーブ 異常
	 */
	return 1;
    }
    /*
     *	セーブ 正常
     */
    return 0;
}
/*
 ******************************************************************************
 *      ＥＥＰＲＯＭロード関数	
 ******************************************************************************
 */
/*
 *	０:正常 １:異常
 */
int eeprom_load(char *d)
{
    /*
     *	ロード
     */
    eepmgr_load_bg(&eepmgr, eeprom_data.uc);
    if(eepmgr_sync(&eepmgr)) {
	/*
	 *	ロード異常
	 */
	return 1;
    }
    /*
     *	ロード正常
     */
    if(eeprom_data.rom[0].ckeck_sum.check == getchecksum(&eeprom_data.rom[0])
       && eeprom_data.rom[0].ckeck_sum.id == 0x81317531) {
	/*
	 *	ＥＥＰＲＯＭ ０ 正常
	 */
	cpymem_s(d, eeprom_data.rom, EEPROM_RW_DATA_SIZE);
#if 0
	(eeprom_u)(*d) = eeprom_data.rom[0];
#endif
        return 0;
    }
    if(eeprom_data.rom[1].ckeck_sum.check == getchecksum(&eeprom_data.rom[1])
       && eeprom_data.rom[1].ckeck_sum.id == 0x81317531) {
	/*
	 *	ＥＥＰＲＯＭ １ 正常
	 */
	cpymem_s(d, &eeprom_data.rom[1], EEPROM_RW_DATA_SIZE);
#if 0
	(eeprom_u)(*d) = eeprom_data.rom[1];
#endif
        return 0;
    }

    /*
     *	ＥＥＰＲＯＭ ０ １ 異常
     */
    return 1;
}
/*
 ******************************************************************************
 *      EEPROMの初期化
 ******************************************************************************
 */
void initial_eeprom(void)
{
    static u64 eepmgrStack[EEPMGR_STACKSIZE / sizeof(u64)];
    static u64 cache64[EEP16K_MAXBLOCKS];
    StackCheckDecl(eepmgr);
    
    StackCheckInit(eepmgr);
    eepmgr_Create(&eepmgr,
		  &padmgr,
		  2,			/* 16K */
		  (u8 *)cache64,
		  THREAD_ID_EEPMGR,
#if 0
		  PRIORITY_EEPMGR,
#else
		  PRIORITY_EEPMGR + 2, /* ### 後で要チェック */
#endif
		  eepmgrStack + number(eepmgrStack));
}
