/****************************************************************************/
/* Copyright 1991, 1992, 1993 MBARI                                         */
/****************************************************************************/
/* Summary  : IBC CPU Microcontroller Board - EEPROM Functions              */
/* Filename : eeprom.c                                                      */
/* Author   : Andrew Pearce                                                 */
/* Project  : New ROV IBC Based Data Concentrator                           */
/* Version  : 1.0                                                           */
/* Created  : 01/13/93                                                      */
/* Modified : 01/13/93                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header: /usr/tiburon/.cvsroot/micro/ibc/boards/cpu196/eeprom.c,v 1.2 1997/05/07 15:26:40 pean Exp $
 * $Log: eeprom.c,v $
 * Revision 1.2  1997/05/07 15:26:40  pean
 * Cleaned up Include files and makefile for new directory structure.
 *
 * Revision 1.1.1.1  1997/05/02 18:51:27  pean
 * Initial check in of IBC microcontroller software
 *
 * Revision 1.1  93/07/02  09:22:25  09:22:25  pean (Andrew Pearce)
 * Initial revision
 *
 */
/****************************************************************************/

#pragma model(196)
#pragma nosignedchar

#include "C:/C96/INCLUDE/80C196.h"      /* 80C196 Register mapping          */
#include "C:/C96/INCLUDE/stddef.h"      /* C Standard Definitions           */
#include "C:/C96/INCLUDE/string.h"      /* string function library          */
#include "../include/const.h"           /* Misc. constants - TRUE/FALSE etc */
#include "../include/types.h"           /* MBARI style guide declarations   */

#include "../include/microasm.h"        /* Assembly language functions      */
#include "../ibc/ibc_card.h"            /* IBC Board Types and Addresses    */

#include "cpu196.h"                     /* IBC CPU Board Functions          */
#include "eeprom.h"                     /* Atmel 28C256 EEPROM definitions  */

/****************************************************************************/
/* Function    : EEPROM_Write                                               */
/* Purpose     : Write Data to ATMEL EEPROM in 64 Byte pages                */
/* Inputs      : Pointer to data to write, number of bytes to write         */
/* Outputs     : None, returns OK or ERROR if write times out               */
/****************************************************************************/
    Int16
EEPROM_Write( Byte *data, Nat16 nBytes, Nat16 offset )
{
    Nat16 startTime;
    Int16 page;

    Byte *EEPROM_BaseAddr = (Byte*) EEPROM_BASE_ADDR;

    for (page = 0; page < nBytes / EEPROM_PAGE_SIZE; page++)
    {
        memcpy ( offset + (page * EEPROM_PAGE_SIZE) + EEPROM_BaseAddr,
                 data   + (page * EEPROM_PAGE_SIZE),
                 min(nBytes, EEPROM_PAGE_SIZE) );

        startTime = read_sysclock();    /* Record current timer value       */
                                        /* Wait for Write Cycle to complete */
        while ( ((read_sysclock() - startTime) < EEPROM_WRITE_TIME) &&
                *(data   + (page * EEPROM_PAGE_SIZE)) !=
                *(offset + (page * EEPROM_PAGE_SIZE) + EEPROM_BaseAddr) );

        if ( *(data   + (page * EEPROM_PAGE_SIZE)) !=
             *(offset + (page * EEPROM_PAGE_SIZE) + EEPROM_BaseAddr) )
            return(ERROR);

    } /* for */

    return(OK);
} /* EEPROM_Write() */

/****************************************************************************/
/* Function    : EEPROM_Read                                                */
/* Purpose     : Read Data from ATMEL EEPROM into buffer                    */
/* Inputs      : Pointer to buffer, number of bytes to read                 */
/* Outputs     : None                                                       */
/****************************************************************************/
    Void
EEPROM_Read( Byte *buffer, Nat16 nBytes, Nat16 offset )
{
    if ( (offset + nBytes) > EEPROM_SIZE)
        nBytes = EEPROM_SIZE - offset;

    memcpy (buffer, (Byte *) (offset + EEPROM_BASE_ADDR), nBytes);
} /* EEPROM_Read() */
