#ifndef   _EEPROM_24CXX_REMAP_H_
#define   _EEPROM_24CXX_REMAP_H_



/***************************************************************************************************************************
1.�洢����ַ��ӳ��

��Ϊ����д�����󳤶�Ϊһҳ(Page),������ӳ����ҳ(Page)Ϊ��λ,EEPROM�洢���Ŀռ䱻����Ϊ�ĵȷ�,�γ�һ����N(N = ��ҳ�� / 4)��
4�е�ҳ(Page)����

Page  ^                    Physical                    Physical                    Physical                    Physical
Row   |                    Address                     Address                     Address                     Address
      |                     
      |   +---------------+ MC/4-1    +---------------+ 2MC/4-1   +---------------+ 3MC/4-1   +---------------+  MC-1
T/4-1 |   | Page (T/4-1)  |           | Page (2T/4-1) |           | Page (3T/4-1) |           |  Page (T-1)   |
      |   +---------------+           +---------------+           +---------------+           +---------------+
  :   |   |       :       |           |       :       |           |       :       |           |       :       |
  :   |   |       :       |           |       :       |           |       :       |           |       :       |
  :   |   |       :       |           |       :       |           |       :       |           |       :       |
      |   +---------------+           +---------------+           +---------------+           +---------------+
  1   |   |    Page (1)   |           | Page (T/4+1)  |           | Page (2T/4+1) |           | Page (3T/4+1) |
      |   +---------------+           +---------------+           +---------------+           +---------------+
  0   |   |    Page (0)   |           |  Page (T/4)   |           |  Page (2T/4)  |           |  Page (3T/4)  |
      |   +---------------+   0       +---------------+   MC/4    +---------------+  2MC/4    +---------------+  3MC/4
      +------------------------------------------------------------------------------------------------------------------>
                  0                           1                           2                           3           Page Col

* MC = Memory Capacity  �洢������
* T  = Total pages      ��ҳ��

2.��������

�����ݵİ�ȫ�Եȼ���ͬ�������������ݴ洢����:

 - HiRel     �߿ɿ������ݴ洢.�ô洢���͵����ݴ�ȡ��Ԫ�������ֽں�У���ֽ����,����У���ֽ�Ϊ�����ֽڰ�λȡ������.�ڽ�������
             �洢ʱ,ÿ�����ݴ�ȡ��Ԫ����ҳ�����ͬһ��(Row)�ĵ�1��2��3��(Col)���洢һ��,��0��Ϊ����ҳ��ʹ��.�ڽ������ݶ�ȡʱ,
             ������ÿ�����ݴ�ȡ��Ԫ�е������ֽڻ�ʹ��ͬһ��Ԫ�е�У���ֽڽ���У��,��������У��ʧ��ʱ, ��Ȼ�д洢������λ����
             �ݵ�Ԫ��Ϊ����,�Ӷ���֤�����ݴ洢�Ŀɿ���.
             ��߿ɿ��Ե���һ��;����ҳ����ͬһ��(Row)�еIJ�ͬ��(Col)��������ַ�����������Ƿ�ɢ��EEPROM֮�е�,��EEPROM������
             ����Ŷ���ʧ��ijһ���������ʱ,��Ȼ�洢�ڸ���������ݴ�ȡ��Ԫ����һͬ��ʧ,���洢�����������δ��Ӱ������ݵ�Ԫ
             ���Կ��Ա�֤���ݿ���˳������ȡ.
             
 - ExtLife   ��չ���������ݴ洢.EEPROM�IJ�д����ԼΪ 1,000,000 ��,����ijЩ��ҪƵ����д������,��һ������Ҳ�������������д����
             ��Ҫ��.��չ���������ݴ洢���ǽ������ݴ�ȡ��Ԫ�����ش洢��ҳ�����3��(Row)4��(Col)��12����ͬ��λ����,�Ӷ���������
             ����12��,�ﵽ 12,000,000 �β�д.���ִ洢���͵����ݴ�ȡ��Ԫ��Ϊ������,��һ����Ϊ16λ�Ĺ���������,�ڶ�����Ϊ������
             ��,��������Ϊ16λ�������ֽڵ�Checksum.ÿ�δ洢����ʱ,�µ����ݽ�������洢����������ҳ���������е�һ���µ�λ����,
             ͬʱ,����Ĺ��������������1.��ȡ����ʱ,����������ҳ���������е����еĹ�����������������ȡ,���ݹ�����������ֵ��
             ����һ�����ݴ洢��Ԫ�а����������µ�����.
             ��չ���������ݴ洢��Ȼ���Ա�֤�ϸߵ����ݿɿ���,�洢����ʱ,��ͬʱ���������ֽڵ�Checksumһ���洢,��������ʱʹ�ø�
             CheckSum�Զ����������ֽڽ���У��,���У��ʧ��,���ȡǰһ�δ洢������,ֱ�����ݱ�����.��һ����,��߿ɿ������ݴ洢
             ��ͬ,���ݴ�ȡ��Ԫ��ɢ��EEPROM�д洢,����������������ɵ��������ⶪʧ.
             
 - Normal    ��ͨ���ݴ洢.���ڴ洢һ���Ե�����,���ִ洢��ʽ�İ�ȫ������EEPROM�����Ŀɿ���,���ڴ��һ���Ե�����
 
 3.���ݷֲ�
 
 +-------------------+-------+------------+------------+------------+------------+
 |     Data Type     |  Row  |   Col 0    |   Col 1    |   Col 2    |   Col 3    |
 +-------------------+-------+------------+------------+------------+------------+
 |                   | T/4-1 | NPage(M-4) | NPage(M-3) | NPage(M-2) | NPage(M-1) |
 |                   +-------+------------+------------+------------+------------+
 |                   |   :   |     :      |     :      |     :      |     :      |
 |                   |   :   |     :      |     :      |     :      |     :      |
 |      Normal       +-------+------------+------------+------------+------------+
 |                   |  N+1  |  NPage(4)  |  NPage(5)  |  NPage(6)  |  NPage(7)  |
 |                   +-------+------------+------------+------------+------------+
 |                   |   N   |  NPage(0)  |  NPage(1)  |  NPage(2)  |  NPage(3)  |
 +---------+---------+-------+------------+------------+------------+------------+
 |         |    :    |   :   |     :      |     :      |     :      |     :      |
 |         |    :    |   :   |     :      |     :      |     :      |     :      |
 |         +---------+-------+------------+------------+------------+------------+
 |         |         |  E+5  |  EPage(8)  |  EPage(9)  |  EPage(10) |  EPage(11) |
 |         |         +-------+------------+------------+------------+------------+
 |         | EData 1 |  E+4  |  EPage(4)  |  EPage(5)  |  EPage(6)  |  EPage(7)  |
 |         |         +-------+------------+------------+------------+------------+
 | ExtLife |         |  E+3  |  EPage(0)  |  EPage(1)  |  EPage(2)  |  EPage(3)  |
 |         +---------+-------+------------+------------+------------+------------+
 |         |         |  E+2  |  EPage(8)  |  EPage(9)  |  EPage(10) |  EPage(11) |
 |         |         +-------+------------+------------+------------+------------+
 |         | EData 0 |  E+1  |  EPage(4)  |  EPage(5)  |  EPage(6)  |  EPage(7)  |
 |         |         +-------+------------+------------+------------+------------+
 |         |         |   E   |  EPage(0)  |  EPage(1)  |  EPage(2)  |  EPage(3)  |
 +---------+---------+-------+------------+------------+------------+------------+
 |         |    :    |   :   |     :      |     :      |     :      |     :      |
 |         |    :    |   :   |     :      |     :      |     :      |     :      |
 |         +---------+-------+------------+------------+------------+------------+
 | HiRel   | HData 1 |   1   |   Rsvd.    |  HPage(0)  |  HPage(1)  |  HPage(2)  |
 |         +---------+-------+------------+------------+------------+------------+
 |         | HData 0 |   0   |   Rsvd.    |  HPage(0)  |  HPage(1)  |  HPage(2)  |
 +---------+---------+-------+------------+------------+------------+------------+
 
 * T     = Total pages                ��ҳ��
 * M     = Total Normal Data pages    ��ͨ���ݴ洢��ҳ��
 * N     = Start row of Normal Data   ��ͨ���ݴ洢��ʼ��
 * NPage = Normal Data page           ��ͨ���ݴ洢ҳ
 * E     = Start row of ExtLife Data  ��չ���������ݴ洢��ʼ��
 * EPage = ExtLife Data page          ��չ���������ݴ洢ҳ
 * EData = ExtLife Data               ��չ����������
 * HPage = HiRel Data page            �߿ɿ������ݴ洢ҳ
 * HData = HiRel Data                 �߿ɿ�������
 
***************************************************************************************************************************/

/***************************************************************************************************************************
�洢������
***************************************************************************************************************************/
#define   EEPPROM_HIREL_DATA_NUM                  2              //�߿ɿ�����������
#define   EEPPROM_EXTLIFE_DATA_NUM                0              //��չ��������������

#define   EEPPROM_DATA_BUFFER_SIZE                64//32

#define   EEPPROM_DEVICE_ADDR                     0              //�洢����Ӳ����ַ

/***************************************************************************************************************************
����Ԥ����
***************************************************************************************************************************/
/*** �洢��ȫ�� ***/
#define   EEPPROM_TOTAL_ROW_NUM                   (EEPROM_TOTAL_PAGE_NUM / 4)

/*** �߿ɿ������� ***/
#define   EEPPROM_HIREL_DATA_MAX_LEN              (EEPROM_PAGE_SIZE / 2)

/*** ��չ���������� ***/
#define   EEPPROM_EXTLIFE_DATA_ROW_OFFSEET        EEPPROM_HIREL_DATA_NUM
#define   EEPPROM_EXTLIFE_DATA_MAX_LEN            (EEPROM_PAGE_SIZE - 4)

/*** ��ͨ���� ***/
#define   EEPPROM_DATA_ROW_OFFSEET                (EEPPROM_HIREL_DATA_NUM + EEPPROM_EXTLIFE_DATA_NUM * 3)
#define   EEPPROM_DATA_TOTAL_PAGE_NUM             ((EEPPROM_TOTAL_ROW_NUM - EEPPROM_DATA_ROW_OFFSEET) * 4)
#define   EEPPROM_DATA_MAX_ADDR                   (EEPROM_PAGE_SIZE * EEPPROM_DATA_TOTAL_PAGE_NUM - 1)

/***************************************************************************************************************************
��������
***************************************************************************************************************************/
#define   EEPROM_HIREL_DATA_TYPE                  0
#define   EEPROM_EXTLIFE_DATA_TYPE                1
#define   EEPROM_NORMAL_DATA_TYPE                 2

/***************************************************************************************************************************
����״̬
***************************************************************************************************************************/
typedef enum
{
  EEPROM_DATA_OK = 0,
  EEPROM_DATA_PARTIAL_LOST,
  EEPROM_DATA_LOST,
  EEPROM_DATA_ADDR_ERR,
  EEPROM_DATA_LEN_ERR,
  EEPROM_DATA_RW_FAIL,
  EEPROM_MEMORY_BUSY,
  EEPROM_MEMORY_ABSENT,
}EEPROMAccessStatusEnum;       

/***************************************************************************************************************************
���ݴ�ȡ����                               
********************* ******************************************************************************************************/
#if (EEPPROM_DATA_BUFFER_SIZE < EEPROM_PAGE_SIZE)
  
  typedef struct
  {                                        
    uint8_t   Type;
    uint8_t   Data[EEPROM_PAGE_SIZE];
    uint16_t  DataLen;
    uint8_t   Row;
    uint8_t   Col;
    uint8_t   Offset;
    uint8_t   Retry;
    uint8_t   WrLen;
    uint16_t  WrCnt;
    uint8_t   Busy;
    EEPROMAccessStatusEnum  Result;
  }EEPROMDataWrCtrlStruct;
  
#else
  
  typedef struct
  {
    uint8_t   Type;
    uint8_t   Data[EEPPROM_DATA_BUFFER_SIZE];
    uint16_t  DataLen;
    uint8_t   Row;
    uint8_t   Col;
    uint8_t   Offset;
    uint8_t   Retry;
    uint8_t   WrLen;
    uint16_t  WrCnt;
    uint8_t   Busy;
    EEPROMAccessStatusEnum  Result;
  }EEPROMDataWrCtrlStruct;

#endif


EXTERN  EEPROMDataWrCtrlStruct      EEPROMDataWrCtrl;

/***************************************************************************************************************************
��������
***************************************************************************************************************************/
/*** �ⲿ���� ***/
EEPROMAccessStatusEnum EEPROM_Data_Write(uint8_t Type, uint16_t Addr, uint8_t *pData, uint8_t Len);
EEPROMAccessStatusEnum EEPROM_Get_Data_Write_Status(void);
EEPROMAccessStatusEnum EEPROM_Startup_Data_Read(uint8_t Type, uint16_t Addr, uint8_t *pData, uint8_t Len);
void    EEPROM_Access_Service(void);

/**************************************************************************************************************************/
/*** HiRel�������ݶ�д ***/
EEPROMAccessStatusEnum EEPROM_HiRel_Data_Write(uint16_t Addr, uint8_t *pData, uint8_t Len);
EEPROMAccessStatusEnum EEPROM_Startup_HiRel_Data_Read(uint16_t Addr, uint8_t *pData, uint8_t Len);
EEPROMAccessStatusEnum EEPROM_Startup_HiRel_Page_Read(uint8_t Row, uint8_t Col, uint8_t *pData, uint8_t Len);
uint8_t EEPROM_HiRel_Data_Check(uint8_t *pData, uint8_t Len);
void    EEPROM_HiRel_Data_Write_Service(void);

/*** ExtLife�������ݶ�д ***/

/*** Normal�������ݶ�д ***/
EEPROMAccessStatusEnum EEPROM_Normal_Data_Write(uint16_t Addr, uint8_t *pData, uint16_t Len);
EEPROMAccessStatusEnum EEPROM_Startup_Normal_Data_Read(uint16_t Addr, uint8_t *pData, uint8_t Len);
void    EEPROM_Normal_Data_Write_Service(void);

/*** �����ַ������� ***/
void    EEPROM_Copy_Data(uint8_t *pDstData, uint8_t *pSrcData, uint8_t Len);
uint8_t EEPROM_Compare_Data(uint8_t *pDstData, uint8_t *pSrcData, uint8_t Len);




#endif