/** ###################################################################

** THIS BEAN MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT.

** Filename : IFsh1.C

** Project : test_AW60_pe_FLASH

** Processor : MC9S08AW60CFG

** Beantype : IntFLASH

** Version : Bean 02.173, Driver 01.15, CPU db: 2.87.159

** Compiler : CodeWarrior HCS08 C Compiler

** Date/Time : 2006-10-18, 14:15

** Abstract :

** This bean "IntFLASH" implements an access to internal FLASH.

** The bean support reading/writing data into FLASH, erasing of

** selected sector.

** The bean supports events if the write interrupt is supported.

** The bean supports following modes of write operations:

** - Write - writing without any test.

** - Destructive write - sector is erased if necessary.

** - Safe write - user event is invoked to save and resore data

** from the current sector.

** The bean requires on-chip FLASH memory (not used/allocated by

** other beans).

** Settings :

** Total FLASH memory size : 0xF730 bytes

** Write method : Write

** Wait in RAM : yes

** Save buffer : Disabled

** Virtual page : Disabled

** CPU clock/speed selection

** FLASH clock : 181 kHz

** High speed mode : This bean enabled

** Contents :

** EraseSector - byte IFsh1_EraseSector(dword Addr);

** SetByteFlash - byte IFsh1_SetByteFlash(dword Addr,byte Data);

** SetWordFlash - byte IFsh1_SetWordFlash(dword Addr,word Data);

**

** (c) Copyright UNIS, spol. s r.o. 1997-2006

** UNIS, spol. s r.o.

** Jundrovska 33

** 624 00 Brno

** Czech Republic

** http :

** mail :

** ###################################################################*/

/* MODULE IFsh1. */

#include "IFsh1.h"

/* Internal method prototypes */

static void FnCmdInRam_(byte Comand_,word Addr_,byte Value_);

static void FnBurstProgCmdInRam_(word src, word dst, word size);

byte LaunchCmdEndTestError(byte Command_,word Addr_,byte Value_);

byte NonDestructiveUnsecureWrite(word src, word dst, word size);

#define FCMD_BLANK_CHECK 0x05 /* Flash command code */

#define FCMD_PROGRAM 0x20 /* Flash command code */

#define FCMD_BURST_PROGRAM 0x25 /* Flash command code */

#define FCMD_PAGE_ERASE 0x40 /* Flash command code */

#define FCMD_MASS_ERASE 0x41 /* Flash command code */

#define BM_FLASH_ERR_MASK 0x30 /* Bit mask to get FLASH error bits */

/*lint -save -e970 Disable MISRA rule (13) checking. */

typedef struct {

unsigned char code[35]; /* Structure required to copy code to ram memory */

/* Size of this structure needs to be at least (but best) the size of the FnCmdInRam_ */

} FnCmdInRamStruct;

typedef struct {

unsigned char code[110]; /* Structure required to copy code to ram memory */

/* Size of this structure needs to be at least (but best) the size of the FnBurstProgCmdInRam_ */

} FnBurstProgCmdInRamStruct;

/*lint -restore */

#pragma MESSAGE DISABLE C1805 /* Disable message: Non standard conversion used */

/*

** ======

** Method : IFsh1_FnCmdInRam_ (bean IntFLASH)

**

** Description :

** This code burns one byte. It is copied to the RAM.

** This method is internal. It is used by Processor Expert only.

** ======

*/

static void FnCmdInRam_(byte Comand_,word Addr_,byte Value_)

{

*(volatile byte *) (Addr_) = Value_; /* Write data to the flash memory */

FCMD = Comand_; /* Initiate command */

FSTAT = 0x80; /* Launch the command */

if(!(FSTAT & BM_FLASH_ERR_MASK)) { /* Protection violation or access error detected ? */

while(!FSTAT_FCCF) {} /* Wait to command complete */

}

return;

}

/*

** ======

** Method : IFsh1_FnBurstProgCmdInRam_ (bean IntFLASH)

**

** Description :

** This code burns block of bytes. It is copied to the RAM.

** This method is internal. It is used by Processor Expert only.

** ======

*/

static void FnBurstProgCmdInRam_(word src, word dst, word size)

{

while(size--) { /* For all written bytes do: */

if(*(byte *)dst != *(byte *)src) { /* Is the src. byte equal to the dest. byte? */

*(byte *)dst = *(byte *)src; /* No, write byte to the flash memory */

FCMD = FCMD_BURST_PROGRAM; /* Initiate burst write command */

FSTAT = 0x80; /* Launch the command */

if(FSTAT & BM_FLASH_ERR_MASK) { /* Error detected? */

return; /* Yes, return */

}

dst++; /* Increment dest. pointer */

src++; /* Increment src. pointer */

while(!FSTAT_FCCF) {} /* Wait for command buffer empty */

} else {

dst++; /* Increment dest. pointer */

src++; /* Increment src. pointer */

}

} /* while */

}

/*

** ======

** Method : IFsh1_LaunchCmdEndTestError (bean IntFLASH)

**

** Description :

** This method copies code to ram, executes it and test result.

** This method is internal. It is used by Processor Expert only.

** ======

*/

byte LaunchCmdEndTestError(byte Command_,word Addr_,byte Value_)

{

FnCmdInRamStruct FnCmdInRam=*(FnCmdInRamStruct *)(FnCmdInRam_);

SaveStatusReg(); /* Save the PS register */

FSTAT=0x00; /* Init. flash engine */

if(FSTAT & BM_FLASH_ERR_MASK) { /* Protection violation or access error? */

FSTAT = BM_FLASH_ERR_MASK; /* Clear FPVIOL & FACERR flag */

}

((pFnCmdInRam)&FnCmdInRam)(Command_,Addr_,Value_); /* Call code in RAM */

if(FSTAT & BM_FLASH_ERR_MASK) { /* Error detected? */

RestoreStatusReg(); /* Yes, restore status information and interrupt state */

if(FSTAT_FPVIOL) { /* Protect violation? */

return ERR_PROTECT; /* Return error code ERR_PROTECT */

} else {

return ERR_NOTAVAIL; /* Return error code ERR_NOTAVAIL */

}

}

while(!FSTAT_FCCF) {} /* Wait for command completion */

RestoreStatusReg(); /* Restore the PS register */

return ERR_OK;

}

/*

** ======

** Method : IFsh1_NonDestructiveUnsecureWrite (bean IntFLASH)

**

** Description :

** This method performs Non-destructive unsecure write.

** This method is internal. It is used by Processor Expert only.

** ======

*/

byte NonDestructiveUnsecureWrite(word src, word dst, word size)

{

word x; /* Tmp. var. */

FnBurstProgCmdInRamStruct FnBurstProgCmdInRam=*(FnBurstProgCmdInRamStruct *)(FnBurstProgCmdInRam_); /* Copy function into the stack */

if((dst < 0x0870) || ((dst > 0x17FF) & (dst < 0x1860))) { /* Check addres */

return ERR_RANGE; /* Address is out of FLASH memory */

}

if(dst >= 0x1860) { /* Check block location */

if((size > 0xE7A0) || ((dst+size-1) < 0x1860)) { /* Check block size and last addres of the block */

return ERR_RANGE; /* Block is out of FLASH memory */

}

} else {

if((size > 0x0F90) || ((dst+size) > 0x1800)) { /* Check block size and last addres of the block */

return ERR_RANGE; /* Block is out of FLASH memory */

}

}

if(!FSTAT_FCCF) { /* Is previous command completed ? */

return ERR_BUSY; /* If no then error */

}

SaveStatusReg(); /* Save status information and disable interrupts(if enabled) */

FSTAT=0x00; /* Init. flash engin */

if(FSTAT & BM_FLASH_ERR_MASK) { /* Protection violation or access error? */

FSTAT = BM_FLASH_ERR_MASK; /* Clear FPVIOL & FACERR flag */

}

((pFnBurstProgCmdInRam)&FnBurstProgCmdInRam)(src,dst,size); /* Call code in ram */

if(FSTAT & BM_FLASH_ERR_MASK) { /* Error detected? */

RestoreStatusReg(); /* Yes, restore status information and interrupt state */

if(FSTAT_FPVIOL) { /* Protect violation? */

return ERR_PROTECT; /* Return error code ERR_PROTECT */

} else {

return ERR_NOTAVAIL; /* Return error code ERR_NOTAVAIL */

}

}

RestoreStatusReg(); /* Restore status information and interrupt state */

for(x=0x00;x<size;x++) { /* Compare src. and written block */

if(((byte*)src)[x] != ((byte*)dst)[x]) { /* Compare source byte and written byte */

return ERR_VALUE; /* Source value is different from dest. value, return error */

}

}

return ERR_OK;

}

/*

** ======

** Method : IFsh1_SetByteFlash (bean IntFLASH)

**

** Description :

** Write byte to address in FLASH.

** Parameters :

** NAME - DESCRIPTION

** Addr - Address to FLASH.

** Data - Data to write.

** Returns :

** --- - Error code, possible codes:

** - ERR_OK - OK

** - ERR_NOTAVAIL - Desired program/erase

** operation is not available

** - ERR_RANGE - Address is out of range

** - ERR_VALUE - Read value is not equal to

** written value

** - ERR_SPEED - This device does not work

** in the active speed mode

** ======

*/

byte IFsh1_SetByteFlash(word Addr,byte Data)

{

return NonDestructiveUnsecureWrite((word)&Data,Addr,(word)0x01); /* Write data to the flash */

}

/*

** ======

** Method : IFsh1_SetWordFlash (bean IntFLASH)

**

** Description :

** Write word to address in FLASH.

** Parameters :

** NAME - DESCRIPTION

** Addr - Address to FLASH.

** Data - Data to write.

** Returns :

** --- - Error code, possible codes:

** - ERR_OK - OK

** - ERR_NOTAVAIL - Desired program/erase

** operation is not available

** - ERR_RANGE - Address is out of range

** - ERR_VALUE - Read value is not equal to

** written value

** - ERR_SPEED - This device does not work

** in the active speed mode

** ======

*/

byte IFsh1_SetWordFlash(word Addr,word Data)

{

return NonDestructiveUnsecureWrite((word)&Data,Addr,(word)0x02); /* Write data to the flash */

}

/*

** ======

** Method : IFsh1_EraseSector (bean IntFLASH)

**

** Description :

** Erase sector to which address Addr belongs.

** Parameters :

** NAME - DESCRIPTION

** Addr - Address in FLASH.

** Returns :

** --- - Error code, possible codes:

** - ERR_OK - OK

** - ERR_NOTAVAIL - Desired program/erase

** operation is not available

** - ERR_RANGE - Address is out of range

** - ERR_SPEED - This device does not work

** in the active speed mode

** ======

*/

byte IFsh1_EraseSector(word Addr)

{

if((Addr < 0x0870) || ((Addr > 0x17FF) & (Addr < 0x1860))) { /* Check addres */

return ERR_RANGE; /* Address is out of FLASH memory */

}

if(!FSTAT_FCCF) { /* Is previous command complete ? */

return ERR_BUSY; /* If no then error */

}

return LaunchCmdEndTestError((byte)FCMD_PAGE_ERASE,Addr,(byte)0x00); /* Run command and return result */

}

/*

** ======

** Method : IFsh1_Init (bean IntFLASH)

**

** Description :

** Description_Init - Initializes the associated peripheral(s)

** and the bean's internal variables. The method is called

** automatically as a part of the application initialization code.

** This method is internal. It is used by Processor Expert only.

** ======

*/

void IFsh1_Init(void)

{

FSTAT = 0x30; /* Clear FPVIOL & FACERR flag */

FCDIV = 0x15; /* Initialize FCDIV register */

}

/* END IFsh1. */

/*

** ###################################################################

**

** This file was created by UNIS Processor Expert 2.98 [03.80]

** for the Freescale HCS08 series of microcontrollers.

**

** ###################################################################

*/