dos2unix on all files + tab madness
[pyfrprog.git] / Flash.c
diff --git a/Flash.c b/Flash.c
index 36dbd6b05d1ea2f895b4ed5b465477347938d4c3..f20807395d8e30108bc202c3cf4875f6ee138e60 100644 (file)
--- a/Flash.c
+++ b/Flash.c
-/*****************************************************************************/\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;
+}