/* Constant and Structures Definition */ #ifndef __EEPROM__ #define __EEPROM__ /* ------------- PROGRAM MEMORY CONSTANT --------------------- */ /* PROGRAM MEMORY MAPPING AND SIZE */ #define PM_BASE_ADDRESS 0x000000 #define PM_START_ADDRESS PM_BASE_ADDRESS #define PM_SIZE 0x080000 /* 512Kwords 48-bits wide */ #define PM_END_ADDRESS PM_START_ADDRESS + PM_SIZE - 1 /* PROGRAM MEMORY SEGMENTATION */ #define PM_PAGE_SIZE 0x400 /* 1024 cells 48bit wide*/ #define PM_NUMBER_OF_PAGES PM_SIZE/PM_PAGE_SIZE /* 512 pages */ /* ---------------- DATA MEMORY CONSTANT --------------------- */ /* DATA MEMORY USER MAPPING AND SIZE */ #define DM_BASE_ADDRESS 0x00000000 #define DM_START_ADDRESS DM_BASE_ADDRESS #define DM_SIZE 0x00080000 /* 512Kwords 32-bits wide */ #define DM_END_ADDRESS DM_START_ADDRESS + DM_SIZE - 1 /* DATA MEMORY EEPROM */ #define DM_EEPROM_BASE_ADDRESS 0x80000000 #define DM_EEPROM_START_ADDRESS DM_EEPROM_BASE_ADDRESS #define DM_EEPROM_SIZE 0x00040000 /* 256Kwords 32 bits wide */ #define DM_EEPROM_END_ADDRESS DM_EEPROM_START_ADDRESS +\ DM_EEPROM_SIZE - 1 /* DATA MEMORY EEPROM SEGMENTATION */ #define DM_EEPROM_PAGE_SIZE 0x400 /* 1024 cells 32 bit wide */ #define DM_EEPROM_NUMBER_OF_PAGES DM_EEPROM_SIZE/DM_EEPROM_PAGE_SIZE /* 256 pages */ /* GENERAL CONSTANT */ #define FCS_PRESET_VALUE 0xFFFF #define NOT_APPLICABLE 0xFF #define ON 1 /* Constant definition */ /* define the offset of the EEPROM */ #define DM_EEPROM_OFFSET DM_EEPROM_START_ADDRESS #define DM_EEPROM_FIRST_SEG DM_EEPROM_OFFSET #define DM_EEPROM_LAST_SEG DM_EEPROM_END_ADDRESS -\ DM_EEPROM_PAGE_SIZE + 1 #define DM_EEPROM_FIRST_PAGE 0 #define DM_EEPROM_LAST_PAGE DM_EEPROM_NUMBER_OF_PAGES - 1 #define FCS_TABLE_SIZE 256 /* size of Frame check sequence table*/ #define FCS_FILTER 0x0000FFFF /* 16 bits wide */ #define WORD_WITH_DMEEPROM_FCS 5 #define DM_EEPROM_FREE_VALUE 0x00000000 #define NUM_OF_EEPROM_BLOCKS 8 #define EEPROM_BLOCK_SIZE 128 #define DM_HEADER_SIZE 7 /*Header Size */ #define DM_EEPROMPAGESIZE DM_EEPROM_PAGE_SIZE - DM_HEADER_SIZE #define PM_INTERRUPT_VECTORS_TABLE 256 #define DM_EEPROM_END_SEGMENTS 0x00000000 /* 0xFFFFFFFF */ #define EEPROM_WRITE_SUCCESS 0 #define DM_EEPROM_WRITE_SUCCESS 0 #define DM_EEPROM_READ_SUCCESS 0 #define DM_EEPROM_DELETION_SUCCESS 0 #define DM_EEPROM_ERROR_COPY_SUCCESS 0 #define DM_EEPROM_WRITE_SUCCESS 0 #define DM_EEPROM_ERROR_SUCCESS 0 /* error */ #define DM_EEPROM_ERROR_SEGMENT_NOT_FREE 1 #define DM_EEPROM_ERROR_BAD_ADDRESS 2 #define DM_EEPROM_ERROR_SEGMENT_OVERFLOW 3 #define DM_EEPROM_ERROR_COPY_FAILED 4 #define DM_EEPROM_ERROR_WRITE_FAILED 5 #define DM_EEPROM_ERROR_BANK_OVERFLOW 6 #define DM_EEPROM_WRITE_FAILED 7 #define DM_EEPROM_ERROR_NOT_CLEARED 8 #define DM_EEPROM_ERROR_OVERFLOW 9 #define DM_EEPROM_BANK_1 0 #define DM_EEPROM_BANK_2 1 #define EEPROM_WAIT_TIME 12 /* Structure definition */ /* Structure for header management */ typedef struct { unsigned long m_PmSegStartAddr:20; unsigned long m_PmSegLength:12; }Word1Type; typedef struct { unsigned long j_IndexCurrSeg:16; unsigned long j_TotNumOfSeg:16; }Word2Type; typedef struct { unsigned long d_AswStartAddrFlags:8; unsigned long d_LoadDmToPmOpt:8; unsigned long d_BootOpt:8; unsigned long d_Reserved:8; }Word4Type; typedef struct { unsigned long j_FcsPmSeg:16; unsigned long j_FcsEepromDmSeg:16; }Word6Type; typedef struct { unsigned long j_Reserved:16; unsigned long j_FcsTot:16; }Word7Type; struct EepromHeader { Word1Type PmWord; Word2Type SegWord; unsigned long NextEepromSeg; Word4Type OptWord; unsigned long AswStartAddr; Word6Type FcsWord; Word7Type FcsProg; }; typedef struct EepromHeader EepromHeaderType; /* struct for computing the frame check sequence */ struct MemoryCell { unsigned long d_Byte4:8; unsigned long d_Byte3:8; unsigned long d_Byte2:8; unsigned long d_Byte1:8; }; typedef struct MemoryCell MemoryCellType; /* function prototype */ /* write single cell without checksum control */ unsigned char EepromWriteCell(unsigned long m_Address, unsigned long m_Data); /* delete cell */ unsigned char EepromClearCell(unsigned long m_Address); /* read Cell */ unsigned char EepromReadCell(unsigned long m_Address, unsigned long *pm_Data); /* write the Eeprom segment */ unsigned char EepromWriteSegment(EepromHeaderType *pw_EepromHeader, unsigned long *pj_buffer, unsigned int j_NumberOfSegment); /* delete the Eeprom segment */ unsigned char EepromDeleteSegment(unsigned int j_NumberOfSegment); /* write Eeprom header */ EepromHeaderType *WriteEepromHeader ( unsigned int j_IndexCurrSeg, unsigned int j_TotNumofSeg, unsigned char d_AswStartAddrFlags, unsigned char d_BootOpt, unsigned char d_LoadDmToPmOpt, unsigned char d_Reserved, unsigned long m_AswStartAddr, unsigned long m_PmSegStartAddr, unsigned long m_PmSegLength, unsigned long m_NextEepromSeg, unsigned int j_j_FcsEepromDmSeg, unsigned int j_FcsPmSeg, unsigned int j_FcsTot ); /* compute Frame Check sequence table */ void ComputeFCSTable ( void ); /* copy the program in EEPROM */ unsigned char CopyProgramInEEPROM( unsigned long m_PmStartAddress, unsigned long m_PmEndAddress, unsigned long m_FlagPartition, unsigned int *pj_PageToAvoid, unsigned int j_FcsPmTotal); /* enable EEPROM protection */ unsigned char EepromEnableProtBank(unsigned char d_Bank, unsigned int j_DummyOffsetCell ); /* disable EEPROM protection */ unsigned char EepromDisableProtBank(unsigned char d_Bank); /* Compute the FCS */ unsigned int ComputeFcsOverall( unsigned long m_PmStartAddress, unsigned long m_PmEndAddress); void ReadCell(void); void init_eprm_write_interr_prio (int, int, int, int); /* SP 07/06/2007 */ unsigned int PackPMWordsinEepromPage(unsigned long, unsigned long *, unsigned int); /* macro definition */ /* disable data protection and write */ #define DataProtection(m_EepromAddress)\ {\ unsigned long m_EepromOffset;\ if ((m_EepromAddress < DM_EEPROM_BASE_ADDRESS + 0x20000) &&\ (m_EepromAddress >= DM_EEPROM_BASE_ADDRESS))\ m_EepromOffset = 0;\ else\ m_EepromOffset = 0x20000;\ *(unsigned long *)(DM_EEPROM_BASE_ADDRESS + m_EepromOffset + 0x5555) = 0xAAAAAAAA;\ *(unsigned long *)(DM_EEPROM_BASE_ADDRESS + m_EepromOffset + 0x2AAA) = 0x55555555;\ *(unsigned long *)(DM_EEPROM_BASE_ADDRESS + m_EepromOffset + 0x5555) = 0xA0A0A0A0;\ }\ #endif