-/*****************************************************************************/\r
-/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */\r
-/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */\r
-/* ELIGIBILITY FOR ANY PURPOSES. */\r
-/* (C) Fujitsu Microelectronics Europe GmbH */\r
-/*****************************************************************************/\r
-\r
-#include "Flash.h"\r
-#include "mb91465k.h"\r
-\r
-static unsigned int IFlag;\r
-\r
-#pragma section CODE=IRAM,attr=CODE\r
- \r
-\r
-void FLASH_PrepareWriteHalfWordMode()\r
-{\r
- /* Set FLASH Access Mode via BootROM Routine */\r
- /* For details refer to the Hardware Manual or Data Sheet */\r
-#pragma asm\r
- ST RP,@-R15\r
- STM0 (R4,R5)\r
- STM1 (R12)\r
- LDI #0x01,R4 ; Set FLASH to 16Bit read/write Mode\r
- LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)\r
- LDI #0xBF60,R12\r
- CALL @R12\r
- LDM1 (R12)\r
- LDM0 (R4,R5)\r
- LD @R15+,RP\r
-#pragma endasm\r
- \r
- /* Set the FLASH Interface to Write Timing */\r
- /* For details refer to the Hardware Manual or Data Sheet */\r
- /* Setting shown here is for CLKB = 64MHz */\r
- FMWT_ATD = 1;\r
- FMWT_WEXH = 0;\r
- FMWT_WTC = 8;\r
-}\r
-\r
-void FLASH_PrepareReadMode()\r
-{\r
- /* Set FLASH Access Mode via BootROM Routine */\r
- /* For details refer to the Hardware Manual or Data Sheet */\r
-#pragma asm\r
- ST RP,@-R15\r
- STM0 (R4,R5)\r
- STM1 (R12)\r
- LDI #0x00,R4 ; Set FLASH to 32Bit read/write Mode\r
- LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)\r
- LDI #0xBF60,R12\r
- CALL @R12\r
- LDM1 (R12)\r
- LDM0 (R4,R5)\r
- LD @R15+,RP\r
-#pragma endasm\r
- \r
- /* Set the FLASH Interface to Read Timing */\r
- /* For details refer to the Hardware Manual or Data Sheet */\r
- /* Setting shown here is for CLKB = 64MHz */\r
- FMWT_ATD = 1;\r
- FMWT_EQ = 3;\r
- FMWT_WTC = 4;\r
-} \r
- \r
- \r
-unsigned char FLASH_SectorErase(unsigned int secadr)\r
-{\r
- unsigned char flag = 0;\r
- volatile unsigned int value = 0;\r
- \r
- /* Disable Interrupts if necessary */\r
- IFlag = FLASH_SaveDisableInterruptFlag();\r
-\r
- /* Set FLASH access mode to 16Bit Write Mode */\r
- FLASH_PrepareWriteHalfWordMode();\r
- \r
- secadr |= 0x0003;\r
- \r
- /* Start FLASH Sector Erase Sequence */\r
- *hseq_1 = 0x00AA;\r
- *hseq_2 = 0x0055;\r
- *hseq_1 = 0x0080;\r
- *hseq_1 = 0x00AA;\r
- *hseq_2 = 0x0055;\r
- *(unsigned short int *)secadr = 0x0030;\r
-\r
- /* Wait for the Auto Algorithm to start */\r
- while( !( *(unsigned short int *)secadr & SETIMR ) )\r
- {\r
- /* Feed the Hardware Watchdog */\r
- HWWD_CL = 0;\r
- \r
- /* Check for Pending Interrupts */\r
- if( FLASH_CheckPendingInterrupt() )\r
- { \r
- /* Wait for Sector Erase Suspend */\r
- FLASH_SuspendSectorErase(secadr);\r
- \r
- /* Set FLASH access mode to 32Bit Read Mode */\r
- FLASH_PrepareReadMode();\r
- \r
- /* Restore the original Interrupt Flag */\r
- FLASH_RestoreInterruptFlag(IFlag);\r
- \r
- /* Keep on checking for pending Interrupts */\r
- while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;\r
- \r
- /* Disable Interrupts if necessary */\r
- IFlag = FLASH_SaveDisableInterruptFlag();\r
- \r
- /* Set FLASH access mode to 16Bit Write Mode */\r
- FLASH_PrepareWriteHalfWordMode();\r
- \r
- /* Sector Erase Resume */\r
- FLASH_ResumeSectorErase(secadr);\r
- } \r
- }\r
-\r
- /* Wait for the Auto Algorithm to finish */\r
- while( flag == 0 )\r
- {\r
- /* Feed Hardware Watchdog */\r
- HWWD_CL = 0;\r
-\r
- /* Check for Pending Interrupts */\r
- if( FLASH_CheckPendingInterrupt() )\r
- { \r
- /* Sector Erase Suspend */\r
- FLASH_SuspendSectorErase(secadr);\r
- \r
- /* Set FLASH access mode to 32Bit Read Mode */\r
- FLASH_PrepareReadMode();\r
- \r
- /* Restore the original Interrupt Flag */\r
- FLASH_RestoreInterruptFlag(IFlag);\r
- \r
- /* Keep on checking for pending Interrupts */\r
- while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;\r
-\r
- /* Disable Interrupts if necessary */\r
- IFlag = FLASH_SaveDisableInterruptFlag();\r
- \r
- /* Set FLASH access mode to 16Bit Write Mode */\r
- FLASH_PrepareWriteHalfWordMode();\r
- \r
- /* Sector Erase Resume */\r
- FLASH_ResumeSectorErase(secadr);\r
- } \r
- \r
- \r
- /* Check the Hardware Sequence Flags */ \r
- if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )\r
- {\r
- flag = 1;\r
- }\r
- if( ( *(unsigned short int *)secadr /* value */ & TLOVER ) )\r
- {\r
- if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )\r
- {\r
- flag = 1;\r
- }\r
- else\r
- {\r
- /* Reset FLASH */\r
- FLASH_ReadReset();\r
- \r
- flag = 2;\r
- }\r
- }\r
- }\r
- \r
-\r
- /* Restore the original Interrupt Flag */\r
- FLASH_RestoreInterruptFlag(IFlag);\r
- \r
- /* Set FLASH access mode to 32Bit Read Mode */\r
- FLASH_PrepareReadMode();\r
- \r
- return flag;\r
-}\r
-\r
-unsigned char FLASH_SectorBlankCheck(unsigned int secaddr, unsigned int size)\r
-{\r
- unsigned int count;\r
- unsigned char empty_flag = 0;\r
- unsigned int addr = secaddr;\r
- \r
- /* Clear FIXE bit to see FLASH memory content instead of fixed reset vector */\r
- FMCS_FIXE = 0;\r
- \r
- for(count = 0; count < size; count ++)\r
- {\r
- /* Clear Hardware Watchdog */\r
- HWWD_CL = 0;\r
- if( *(unsigned int *)addr != 0xFFFFFFFF ) empty_flag = 1;\r
- addr += 4;\r
- }\r
- \r
- /* Set FIXE bit to see fixed reset vector */\r
- FMCS_FIXE = 1;\r
-\r
- if( empty_flag != 0 )\r
- {\r
- return 2;\r
- }\r
- \r
- return 1;\r
-}\r
-\r
-unsigned char FLASH_WriteHalfWord(unsigned int adr, unsigned short int data)\r
-{\r
- unsigned char flag = 0;\r
-\r
- /* Disable Interrupts if necessary */\r
- IFlag = FLASH_SaveDisableInterruptFlag();\r
- \r
- /* Set FLASH access mode to 16Bit Write Mode */\r
- FLASH_PrepareWriteHalfWordMode();\r
- \r
- /* Start Write FLASH Sequence */\r
- *hseq_1 = 0x00AA;\r
- *hseq_2 = 0x0055;\r
- *hseq_1 = 0x00A0;\r
- *((volatile unsigned short int *)adr) = data;\r
- \r
- /* Wait for the Auto Algorithm to finish */\r
- while( flag == 0 )\r
- {\r
- /* Feed Hardware Watchdog */\r
- HWWD_CL = 0;\r
- \r
- if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )\r
- {\r
- flag = 1;\r
- }\r
- if( ( *(volatile unsigned short int *)adr & TLOVER ) == TLOVER )\r
- {\r
- if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )\r
- {\r
- flag = 1;\r
- }\r
- else\r
- {\r
- /* Reset FLASH (keep in mind 16Bit access to FLASH) */\r
- *hseq_1 = 0x00F0; // Keep in Mind (16Bit access)\r
- \r
- flag = 2;\r
- }\r
- }\r
- }\r
-\r
- /* Set FLASH access mode to 32Bit Read Mode */\r
- FLASH_PrepareReadMode();\r
- \r
- /* Restore the original Interrupt Flag */\r
- FLASH_RestoreInterruptFlag(IFlag);\r
- \r
- return flag;\r
-}\r
-\r
-\r
-unsigned char FLASH_ReadReset()\r
-{\r
- *hseq_1 = 0x00F0;\r
- \r
- return 1;\r
-}\r
-\r
-#pragma asm\r
-_FLASH_SaveDisableInterruptFlag:\r
- STM0 (R0)\r
- MOV PS,R4\r
- LDI #0x00000010,R0 \r
- AND R0,R4 ; Store Original Flag\r
- ANDCCR #0xFFFFFFEF ; Clear Interrupt Flag\r
- LDM0 (R0) \r
- RET\r
-#pragma endasm\r
-\r
-\r
-#pragma asm\r
-_FLASH_RestoreInterruptFlag:\r
- STM0 (R0)\r
- MOV PS,R0 ; Get current PS\r
- OR R4,R0 ; Set Flag as saved\r
- MOV R0,PS ; Write back PS\r
- LDM0 (R0)\r
- RET\r
-#pragma endasm\r
-\r
-\r
-unsigned char FLASH_SuspendSectorErase(unsigned int secaddr)\r
-{ \r
- /* Write Sector Erase Suspend Command */\r
- *(volatile unsigned short int *)secaddr = 0x00B0;\r
-\r
- /* Wait for the FLASH macro to suspend sector erase */ \r
- while(!(*(unsigned short int *)secaddr /* value */ & DPOLL) && (*(unsigned short int *)secaddr /* value */ & SETIMR))\r
- {\r
- HWWD_CL=0;\r
- }\r
- \r
- return 1;\r
-}\r
-\r
-unsigned char FLASH_ResumeSectorErase(unsigned int secaddr)\r
-{\r
- /* Write the Sector Erase Resume Command */\r
- *(volatile unsigned short int *)secaddr = 0x0030;\r
- \r
- /* Wait for the FLASH Macro to resume sector erase */ \r
- while((*(unsigned short int *)secaddr /*value */ & DPOLL) && !(*(unsigned short int *)secaddr /*value */ & SETIMR))\r
- {\r
- HWWD_CL=0;\r
- }\r
- \r
- return 1; \r
-}\r
-\r
-unsigned char FLASH_CheckPendingInterrupt()\r
-{\r
- /* Poll for Pending Interrupts which are needed here */\r
- if(TMCSR0_UF) return 1; /* in this sample the only interrupt source supervised is Reload Timer 0 */\r
- \r
- /* and return 1 when an Interrupt is pending */\r
- return 0;\r
-}\r
+/*****************************************************************************/
+/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
+/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
+/* ELIGIBILITY FOR ANY PURPOSES. */
+/* (C) Fujitsu Microelectronics Europe GmbH */
+/*****************************************************************************/
+
+#include "Flash.h"
+#include "mb91465k.h"
+
+static unsigned int IFlag;
+
+#pragma section CODE=IRAM,attr=CODE
+
+
+void FLASH_PrepareWriteHalfWordMode()
+{
+ /* Set FLASH Access Mode via BootROM Routine */
+ /* For details refer to the Hardware Manual or Data Sheet */
+#pragma asm
+ ST RP,@-R15
+ STM0 (R4,R5)
+ STM1 (R12)
+ LDI #0x01,R4 ; Set FLASH to 16Bit read/write Mode
+ LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)
+ LDI #0xBF60,R12
+ CALL @R12
+ LDM1 (R12)
+ LDM0 (R4,R5)
+ LD @R15+,RP
+#pragma endasm
+
+ /* Set the FLASH Interface to Write Timing */
+ /* For details refer to the Hardware Manual or Data Sheet */
+ /* Setting shown here is for CLKB = 64MHz */
+ FMWT_ATD = 1;
+ FMWT_WEXH = 0;
+ FMWT_WTC = 8;
+}
+
+void FLASH_PrepareReadMode()
+{
+ /* Set FLASH Access Mode via BootROM Routine */
+ /* For details refer to the Hardware Manual or Data Sheet */
+#pragma asm
+ ST RP,@-R15
+ STM0 (R4,R5)
+ STM1 (R12)
+ LDI #0x00,R4 ; Set FLASH to 32Bit read/write Mode
+ LDI #0x04,R5 ; Go 4 times through delay loop (64MHz CLKB)
+ LDI #0xBF60,R12
+ CALL @R12
+ LDM1 (R12)
+ LDM0 (R4,R5)
+ LD @R15+,RP
+#pragma endasm
+
+ /* Set the FLASH Interface to Read Timing */
+ /* For details refer to the Hardware Manual or Data Sheet */
+ /* Setting shown here is for CLKB = 64MHz */
+ FMWT_ATD = 1;
+ FMWT_EQ = 3;
+ FMWT_WTC = 4;
+}
+
+
+unsigned char FLASH_SectorErase(unsigned int secadr)
+{
+ unsigned char flag = 0;
+ volatile unsigned int value = 0;
+
+ /* Disable Interrupts if necessary */
+ IFlag = FLASH_SaveDisableInterruptFlag();
+
+ /* Set FLASH access mode to 16Bit Write Mode */
+ FLASH_PrepareWriteHalfWordMode();
+
+ secadr |= 0x0003;
+
+ /* Start FLASH Sector Erase Sequence */
+ *hseq_1 = 0x00AA;
+ *hseq_2 = 0x0055;
+ *hseq_1 = 0x0080;
+ *hseq_1 = 0x00AA;
+ *hseq_2 = 0x0055;
+ *(unsigned short int *)secadr = 0x0030;
+
+ /* Wait for the Auto Algorithm to start */
+ while( !( *(unsigned short int *)secadr & SETIMR ) )
+ {
+ /* Feed the Hardware Watchdog */
+ HWWD_CL = 0;
+
+ /* Check for Pending Interrupts */
+ if( FLASH_CheckPendingInterrupt() )
+ {
+ /* Wait for Sector Erase Suspend */
+ FLASH_SuspendSectorErase(secadr);
+
+ /* Set FLASH access mode to 32Bit Read Mode */
+ FLASH_PrepareReadMode();
+
+ /* Restore the original Interrupt Flag */
+ FLASH_RestoreInterruptFlag(IFlag);
+
+ /* Keep on checking for pending Interrupts */
+ while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;
+
+ /* Disable Interrupts if necessary */
+ IFlag = FLASH_SaveDisableInterruptFlag();
+
+ /* Set FLASH access mode to 16Bit Write Mode */
+ FLASH_PrepareWriteHalfWordMode();
+
+ /* Sector Erase Resume */
+ FLASH_ResumeSectorErase(secadr);
+ }
+ }
+
+ /* Wait for the Auto Algorithm to finish */
+ while( flag == 0 )
+ {
+ /* Feed Hardware Watchdog */
+ HWWD_CL = 0;
+
+ /* Check for Pending Interrupts */
+ if( FLASH_CheckPendingInterrupt() )
+ {
+ /* Sector Erase Suspend */
+ FLASH_SuspendSectorErase(secadr);
+
+ /* Set FLASH access mode to 32Bit Read Mode */
+ FLASH_PrepareReadMode();
+
+ /* Restore the original Interrupt Flag */
+ FLASH_RestoreInterruptFlag(IFlag);
+
+ /* Keep on checking for pending Interrupts */
+ while( FLASH_CheckPendingInterrupt() ) HWWD_CL = 0;
+
+ /* Disable Interrupts if necessary */
+ IFlag = FLASH_SaveDisableInterruptFlag();
+
+ /* Set FLASH access mode to 16Bit Write Mode */
+ FLASH_PrepareWriteHalfWordMode();
+
+ /* Sector Erase Resume */
+ FLASH_ResumeSectorErase(secadr);
+ }
+
+
+ /* Check the Hardware Sequence Flags */
+ if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )
+ {
+ flag = 1;
+ }
+ if( ( *(unsigned short int *)secadr /* value */ & TLOVER ) )
+ {
+ if( ( *(unsigned short int *)secadr /* value */ & DPOLL ) )
+ {
+ flag = 1;
+ }
+ else
+ {
+ /* Reset FLASH */
+ FLASH_ReadReset();
+
+ flag = 2;
+ }
+ }
+ }
+
+
+ /* Restore the original Interrupt Flag */
+ FLASH_RestoreInterruptFlag(IFlag);
+
+ /* Set FLASH access mode to 32Bit Read Mode */
+ FLASH_PrepareReadMode();
+
+ return flag;
+}
+
+unsigned char FLASH_SectorBlankCheck(unsigned int secaddr, unsigned int size)
+{
+ unsigned int count;
+ unsigned char empty_flag = 0;
+ unsigned int addr = secaddr;
+
+ /* Clear FIXE bit to see FLASH memory content instead of fixed reset vector */
+ FMCS_FIXE = 0;
+
+ for(count = 0; count < size; count ++)
+ {
+ /* Clear Hardware Watchdog */
+ HWWD_CL = 0;
+ if( *(unsigned int *)addr != 0xFFFFFFFF ) empty_flag = 1;
+ addr += 4;
+ }
+
+ /* Set FIXE bit to see fixed reset vector */
+ FMCS_FIXE = 1;
+
+ if( empty_flag != 0 )
+ {
+ return 2;
+ }
+
+ return 1;
+}
+
+unsigned char FLASH_WriteHalfWord(unsigned int adr, unsigned short int data)
+{
+ unsigned char flag = 0;
+
+ /* Disable Interrupts if necessary */
+ IFlag = FLASH_SaveDisableInterruptFlag();
+
+ /* Set FLASH access mode to 16Bit Write Mode */
+ FLASH_PrepareWriteHalfWordMode();
+
+ /* Start Write FLASH Sequence */
+ *hseq_1 = 0x00AA;
+ *hseq_2 = 0x0055;
+ *hseq_1 = 0x00A0;
+ *((volatile unsigned short int *)adr) = data;
+
+ /* Wait for the Auto Algorithm to finish */
+ while( flag == 0 )
+ {
+ /* Feed Hardware Watchdog */
+ HWWD_CL = 0;
+
+ if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )
+ {
+ flag = 1;
+ }
+ if( ( *(volatile unsigned short int *)adr & TLOVER ) == TLOVER )
+ {
+ if( ( *(volatile unsigned short int *)adr & DPOLL ) == (data & DPOLL) )
+ {
+ flag = 1;
+ }
+ else
+ {
+ /* Reset FLASH (keep in mind 16Bit access to FLASH) */
+ *hseq_1 = 0x00F0; // Keep in Mind (16Bit access)
+
+ flag = 2;
+ }
+ }
+ }
+
+ /* Set FLASH access mode to 32Bit Read Mode */
+ FLASH_PrepareReadMode();
+
+ /* Restore the original Interrupt Flag */
+ FLASH_RestoreInterruptFlag(IFlag);
+
+ return flag;
+}
+
+
+unsigned char FLASH_ReadReset()
+{
+ *hseq_1 = 0x00F0;
+
+ return 1;
+}
+
+#pragma asm
+_FLASH_SaveDisableInterruptFlag:
+ STM0 (R0)
+ MOV PS,R4
+ LDI #0x00000010,R0
+ AND R0,R4 ; Store Original Flag
+ ANDCCR #0xFFFFFFEF ; Clear Interrupt Flag
+ LDM0 (R0)
+ RET
+#pragma endasm
+
+
+#pragma asm
+_FLASH_RestoreInterruptFlag:
+ STM0 (R0)
+ MOV PS,R0 ; Get current PS
+ OR R4,R0 ; Set Flag as saved
+ MOV R0,PS ; Write back PS
+ LDM0 (R0)
+ RET
+#pragma endasm
+
+
+unsigned char FLASH_SuspendSectorErase(unsigned int secaddr)
+{
+ /* Write Sector Erase Suspend Command */
+ *(volatile unsigned short int *)secaddr = 0x00B0;
+
+ /* Wait for the FLASH macro to suspend sector erase */
+ while(!(*(unsigned short int *)secaddr /* value */ & DPOLL) && (*(unsigned short int *)secaddr /* value */ & SETIMR))
+ {
+ HWWD_CL=0;
+ }
+
+ return 1;
+}
+
+unsigned char FLASH_ResumeSectorErase(unsigned int secaddr)
+{
+ /* Write the Sector Erase Resume Command */
+ *(volatile unsigned short int *)secaddr = 0x0030;
+
+ /* Wait for the FLASH Macro to resume sector erase */
+ while((*(unsigned short int *)secaddr /*value */ & DPOLL) && !(*(unsigned short int *)secaddr /*value */ & SETIMR))
+ {
+ HWWD_CL=0;
+ }
+
+ return 1;
+}
+
+unsigned char FLASH_CheckPendingInterrupt()
+{
+ /* Poll for Pending Interrupts which are needed here */
+ if(TMCSR0_UF) return 1; /* in this sample the only interrupt source supervised is Reload Timer 0 */
+
+ /* and return 1 when an Interrupt is pending */
+ return 0;
+}