Files
Gen4_R-Car_Trace32/2_Trunk/demo/arm/flash/at91sam3-nvm.cmm
2025-10-14 09:52:32 +09:00

804 lines
18 KiB
Plaintext

; --------------------------------------------------------------------------------
; @Title: AT91SAM3x Flash Dialog for programming additional NVM Flash bits.
;
; @Description:
; Supported CPU families:
; - AT91SAM3N
; - AT91SAM3S
; - AT91SAM3U
;
; @Author: WRD
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
; @Chip: AT91SAM3*
; --------------------------------------------------------------------------------
; $Rev: 10516 $
; $Id: at91sam3-nvm.cmm 10516 2022-02-02 11:39:30Z bschroefel $
; Create LOCAL macros
LOCAL &mcu
LOCAL &mcu_class
LOCAL &mcu_flashsize
LOCAL &mcu_flashplanes
LOCAL &number_lockbits
LOCAL &result
LOCAL &EFC0_BASE ; Flash controller EFC0 base address
LOCAL &EFC1_BASE ; Flash controller EFC1 base address
LOCAL &MC_FSR ; Flash Status Register value
LOCAL &MC_FRR ; Flash Result Register value
&EFC0_BASE="tbd"
&EFC1_BASE="tbd"
; Basic checks
ON ERROR GOSUB
(
CONTinue
RETURN
)
; Checking CPU selection
&mcu=SYStem.CPU()
&mcu_class=STRing.MID("&mcu",0.,8.)
IF "&mcu_class"!="AT91SAM3"
(
DIALOG.OK "Not an AT91SAM3 selected!"
SYStem.view
ENDDO
)
&mcu_class=STRing.MID("&mcu",0.,9.)
&mcu_flashsize=STRing.MID("&mcu",9.,1.)
&mcu_flashplanes=1.
IF ("&mcu_class"=="AT91SAM3S")||("&mcu_class"=="AT91SAM3N")
(
&EFC0_BASE=0x400E0A00
IF &mcu_flashsize==4.
(
&mcu_flashsize=256.
&number_lockbits=16.
)
ELSE IF &mcu_flashsize==2.
(
&mcu_flashsize=128.
&number_lockbits=8.
)
ELSE IF &mcu_flashsize==1.
(
&mcu_flashsize=64.
&number_lockbits=4.
)
ELSE
(
DIALOG.OK "&mcu is not supported by the script"
SYStem.view
ENDDO
)
)
ELSE IF "&mcu_class"=="AT91SAM3U"
(
&EFC0_BASE=0x400E0800
&EFC1_BASE=0x400E0A00
IF &mcu_flashsize==4.
(
&mcu_flashsize=256.
&mcu_flashplanes=2.
&number_lockbits=32.
)
ELSE IF &mcu_flashsize==2.
(
&mcu_flashsize=128.
&number_lockbits=16.
)
ELSE IF &mcu_flashsize==1.
(
&mcu_flashsize=64.
&number_lockbits=8.
)
ELSE
(
DIALOG.OK "&mcu is not supported by the script"
SYStem.view
ENDDO
)
)
ELSE
(
DIALOG.OK "&mcu is not supported by the script"
SYStem.view
ENDDO
)
IF SYStem.MODE()<5
(
DIALOG.OK "ERROR: System is down!"
ENDDO
)
; Read NVM bits to check security bit and exit if set
GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000D
ENTRY &MC_FRR
IF (&MC_FRR&0x01)!=0
(
DIALOG.OK "Security bit is enabled! Flash content can only be erased by the external ERASE pin."
ENDDO
)
; Creating the main dialog. (& afer DIALOG command must be in first column!
WinPOS 50. 5. 45. 19.
DIALOG.view
(&
HEADER "Flash settings for the &mcu"
POS 1. 0. 43. 9.
BOX "EEFC Sector Lock Bits"
POS 3. 2. 4. 1.
CHK_EFC_0x0: CHECKBOX " 0" ""
POS 8. 2. 4. 1.
CHK_EFC_0x1: CHECKBOX " 1" ""
POS 13. 2. 4. 1.
CHK_EFC_0x2: CHECKBOX " 2" ""
POS 18. 2. 4. 1.
CHK_EFC_0x3: CHECKBOX " 3" ""
POS 23. 2. 4. 1.
CHK_EFC_0x4: CHECKBOX " 4" ""
POS 28. 2. 4. 1.
CHK_EFC_0x5: CHECKBOX " 5" ""
POS 33. 2. 4. 1.
CHK_EFC_0x6: CHECKBOX " 6" ""
POS 38. 2. 4. 1.
CHK_EFC_0x7: CHECKBOX " 7" ""
POS 3. 3. 4. 1.
CHK_EFC_0x8: CHECKBOX " 8" ""
POS 8. 3. 4. 1.
CHK_EFC_0x9: CHECKBOX " 9" ""
POS 13. 3. 4. 1.
CHK_EFC_0x0A: CHECKBOX "10" ""
POS 18. 3. 4. 1.
CHK_EFC_0x0B: CHECKBOX "11" ""
POS 23. 3. 4. 1.
CHK_EFC_0x0C: CHECKBOX "12" ""
POS 28. 3. 4. 1.
CHK_EFC_0x0D: CHECKBOX "13" ""
POS 33. 3. 4. 1.
CHK_EFC_0x0E: CHECKBOX "14" ""
POS 38. 3. 4. 1.
CHK_EFC_0x0F: CHECKBOX "15" ""
POS 3. 4. 4. 1.
CHK_EFC_0x10: CHECKBOX "16" ""
POS 8. 4. 4. 1.
CHK_EFC_0x11: CHECKBOX "17" ""
POS 13. 4. 4. 1.
CHK_EFC_0x12: CHECKBOX "18" ""
POS 18. 4. 4. 1.
CHK_EFC_0x13: CHECKBOX "19" ""
POS 23. 4. 4. 1.
CHK_EFC_0x14: CHECKBOX "20" ""
POS 28. 4. 4. 1.
CHK_EFC_0x15: CHECKBOX "21" ""
POS 33. 4. 4. 1.
CHK_EFC_0x16: CHECKBOX "22" ""
POS 38. 4. 4. 1.
CHK_EFC_0x17: CHECKBOX "23" ""
POS 3. 5. 4. 1.
CHK_EFC_0x18: CHECKBOX "24" ""
POS 8. 5. 4. 1.
CHK_EFC_0x19: CHECKBOX "25" ""
POS 13. 5. 4. 1.
CHK_EFC_0x1A: CHECKBOX "26" ""
POS 18. 5. 4. 1.
CHK_EFC_0x1B: CHECKBOX "27" ""
POS 23. 5. 4. 1.
CHK_EFC_0x1C: CHECKBOX "28" ""
POS 28. 5. 4. 1.
CHK_EFC_0x1D: CHECKBOX "29" ""
POS 33. 5. 4. 1.
CHK_EFC_0x1E: CHECKBOX "30" ""
POS 38. 5. 4. 1.
CHK_EFC_0x1F: CHECKBOX "31" ""
POS 3. 7. 9. 1.
BUTTON "Select All" "GOSUB EEFCSelectAll"
POS 13. 7. 9. 1.
BUTTON "Unselect All" "GOSUB EEFCUnselectAll"
; GPNVM bits settings
POS 1. 9. 43. 5.
BOX "General Purpose NVM Bits"
POS 3. 11. 10. 1.
CHSB_BOOT.ROM: CHOOSEBOX "ROM Boot" ""
CHSB_BOOT.FLASH: CHOOSEBOX "Flash Boot" ""
POS 20. 12. 8. 1.
CHSB_SEL.FLASH0: CHOOSEBOX "Flash 0" ""
POS 30. 12. 8. 1.
CHSB_SEL.FLASH1: CHOOSEBOX "Flash 1" ""
; Security bit
POS 1. 14. 43. 4.
BOX "Enable security bit and lock content"
POS 3. 16. 25. 1.
CHK_SEC: CHECKBOX "Enable security bit and lock content" "GOSUB EnableSecurityBit"
POS 1. 18. 10. 1.
BUTTON "Program" "GOSUB ProgramFlashSettings"
POS 34. 18. 10. 1.
BUTTON "Exit" "CONTinue"
CLOSE "CONTinue"
)
ON SYSDOWN GOSUB
(
DIALOG.OK "System is down!"
DIALOG.END
END
)
; Disable/Enable the check boxes
GOSUB UpdateWindowFromFlashType
GOSUB UpdateWindowFlashSettings
STOP
DIALOG.END
ENDDO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Routines for updating the window
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UpdateWindowFromFlashType:
IF &number_lockbits<=16.
(
DIALOG.Disable CHK_EFC_0x10
DIALOG.Disable CHK_EFC_0x11
DIALOG.Disable CHK_EFC_0x12
DIALOG.Disable CHK_EFC_0x13
DIALOG.Disable CHK_EFC_0x14
DIALOG.Disable CHK_EFC_0x15
DIALOG.Disable CHK_EFC_0x16
DIALOG.Disable CHK_EFC_0x17
DIALOG.Disable CHK_EFC_0x18
DIALOG.Disable CHK_EFC_0x19
DIALOG.Disable CHK_EFC_0x1A
DIALOG.Disable CHK_EFC_0x1B
DIALOG.Disable CHK_EFC_0x1C
DIALOG.Disable CHK_EFC_0x1D
DIALOG.Disable CHK_EFC_0x1E
DIALOG.Disable CHK_EFC_0x1F
)
IF &number_lockbits<=8.
(
DIALOG.Disable CHK_EFC_0x8
DIALOG.Disable CHK_EFC_0x9
DIALOG.Disable CHK_EFC_0x0A
DIALOG.Disable CHK_EFC_0x0B
DIALOG.Disable CHK_EFC_0x0C
DIALOG.Disable CHK_EFC_0x0D
DIALOG.Disable CHK_EFC_0x0E
DIALOG.Disable CHK_EFC_0x0F
)
IF &number_lockbits<=4.
(
DIALOG.Disable CHK_EFC_0x4
DIALOG.Disable CHK_EFC_0x5
DIALOG.Disable CHK_EFC_0x6
DIALOG.Disable CHK_EFC_0x7
)
IF &mcu_flashplanes<=1.
(
DIALOG.Disable CHSB_SEL.FLASH0
DIALOG.Disable CHSB_SEL.FLASH1
)
RETURN
UpdateWindowFlashSettings:
; Read out Lock Bit Status EEFC and set the check boxes in the right way.
GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000A
ENTRY &MC_FRR
IF (&MC_FRR&0x00000001)!=0
DIALOG.Set CHK_EFC_0x0 ""
ELSE
DIALOG.Set CHK_EFC_0x0 " "
IF (&MC_FRR&0x00000002)!=0
DIALOG.Set CHK_EFC_0x1 ""
ELSE
DIALOG.Set CHK_EFC_0x1 " "
IF (&MC_FRR&0x00000004)!=0
DIALOG.Set CHK_EFC_0x2 ""
ELSE
DIALOG.Set CHK_EFC_0x2 " "
IF (&MC_FRR&0x00000008)!=0
DIALOG.Set CHK_EFC_0x3 ""
ELSE
DIALOG.Set CHK_EFC_0x3 " "
IF (&MC_FRR&0x00000010)!=0
DIALOG.Set CHK_EFC_0x4 ""
ELSE
DIALOG.Set CHK_EFC_0x4 " "
IF (&MC_FRR&0x00000020)!=0
DIALOG.Set CHK_EFC_0x5 ""
ELSE
DIALOG.Set CHK_EFC_0x5 " "
IF (&MC_FRR&0x00000040)!=0
DIALOG.Set CHK_EFC_0x6 ""
ELSE
DIALOG.Set CHK_EFC_0x6 " "
IF (&MC_FRR&0x00000080)!=0
DIALOG.Set CHK_EFC_0x7 ""
ELSE
DIALOG.Set CHK_EFC_0x7 " "
IF (&MC_FRR&0x00000100)!=0
DIALOG.Set CHK_EFC_0x8 ""
ELSE
DIALOG.Set CHK_EFC_0x8 " "
IF (&MC_FRR&0x00000200)!=0
DIALOG.Set CHK_EFC_0x9 ""
ELSE
DIALOG.Set CHK_EFC_0x9 " "
IF (&MC_FRR&0x00000400)!=0
DIALOG.Set CHK_EFC_0x0A ""
ELSE
DIALOG.Set CHK_EFC_0x0A " "
IF (&MC_FRR&0x00000800)!=0
DIALOG.Set CHK_EFC_0x0B ""
ELSE
DIALOG.Set CHK_EFC_0x0B " "
IF (&MC_FRR&0x00001000)!=0
DIALOG.Set CHK_EFC_0x0C ""
ELSE
DIALOG.Set CHK_EFC_0x0C " "
IF (&MC_FRR&0x00002000)!=0
DIALOG.Set CHK_EFC_0x0D ""
ELSE
DIALOG.Set CHK_EFC_0x0D " "
IF (&MC_FRR&0x00004000)!=0
DIALOG.Set CHK_EFC_0x0E ""
ELSE
DIALOG.Set CHK_EFC_0x0E " "
IF (&MC_FRR&0x00008000)!=0
DIALOG.Set CHK_EFC_0x0F ""
ELSE
DIALOG.Set CHK_EFC_0x0F " "
IF &mcu_flashplanes>=2.
(
GOSUB ExecuteFlashCommandFRR_EFC &EFC1_BASE 0x5a00000A
ENTRY &MC_FRR
IF (&MC_FRR&0x00000001)!=0
DIALOG.Set CHK_EFC_0x10 ""
ELSE
DIALOG.Set CHK_EFC_0x10 " "
IF (&MC_FRR&0x00000002)!=0
DIALOG.Set CHK_EFC_0x11 ""
ELSE
DIALOG.Set CHK_EFC_0x11 " "
IF (&MC_FRR&0x00000004)!=0
DIALOG.Set CHK_EFC_0x12 ""
ELSE
DIALOG.Set CHK_EFC_0x12 " "
IF (&MC_FRR&0x00000008)!=0
DIALOG.Set CHK_EFC_0x13 ""
ELSE
DIALOG.Set CHK_EFC_0x13 " "
IF (&MC_FRR&0x00000010)!=0
DIALOG.Set CHK_EFC_0x14 ""
ELSE
DIALOG.Set CHK_EFC_0x14 " "
IF (&MC_FRR&0x00000020)!=0
DIALOG.Set CHK_EFC_0x15 ""
ELSE
DIALOG.Set CHK_EFC_0x15 " "
IF (&MC_FRR&0x00000040)!=0
DIALOG.Set CHK_EFC_0x16 ""
ELSE
DIALOG.Set CHK_EFC_0x16 " "
IF (&MC_FRR&0x00000080)!=0
DIALOG.Set CHK_EFC_0x17 ""
ELSE
DIALOG.Set CHK_EFC_0x17 " "
IF (&MC_FRR&0x00000100)!=0
DIALOG.Set CHK_EFC_0x18 ""
ELSE
DIALOG.Set CHK_EFC_0x18 " "
IF (&MC_FRR&0x00000200)!=0
DIALOG.Set CHK_EFC_0x19 ""
ELSE
DIALOG.Set CHK_EFC_0x19 " "
IF (&MC_FRR&0x00000400)!=0
DIALOG.Set CHK_EFC_0x1A ""
ELSE
DIALOG.Set CHK_EFC_0x1A " "
IF (&MC_FRR&0x00000800)!=0
DIALOG.Set CHK_EFC_0x1B ""
ELSE
DIALOG.Set CHK_EFC_0x1B " "
IF (&MC_FRR&0x00001000)!=0
DIALOG.Set CHK_EFC_0x1C ""
ELSE
DIALOG.Set CHK_EFC_0x1C " "
IF (&MC_FRR&0x00002000)!=0
DIALOG.Set CHK_EFC_0x1D ""
ELSE
DIALOG.Set CHK_EFC_0x1D " "
IF (&MC_FRR&0x00004000)!=0
DIALOG.Set CHK_EFC_0x1E ""
ELSE
DIALOG.Set CHK_EFC_0x1E " "
IF (&MC_FRR&0x00008000)!=0
DIALOG.Set CHK_EFC_0x1F ""
ELSE
DIALOG.Set CHK_EFC_0x1F " "
)
; Check the GPNVM bits in EEFC
; Read NVM bits to check security bit and exit if set
GOSUB ExecuteFlashCommandFRR_EFC &EFC0_BASE 0x5a00000D
ENTRY &MC_FRR
IF (&MC_FRR&0x00000004)!=0
DIALOG.Set CHSB_SEL.FLASH1
ELSE
DIALOG.Set CHSB_SEL.FLASH0
IF (&MC_FRR&0x00000002)!=0
DIALOG.Set CHSB_BOOT.FLASH
ELSE
DIALOG.Set CHSB_BOOT.ROM
RETURN
EEFCSelectAll:
DIALOG.Set CHK_EFC_0x0 ""
DIALOG.Set CHK_EFC_0x1 ""
DIALOG.Set CHK_EFC_0x2 ""
DIALOG.Set CHK_EFC_0x3 ""
IF &number_lockbits>4.
(
DIALOG.Set CHK_EFC_0x4 ""
DIALOG.Set CHK_EFC_0x5 ""
DIALOG.Set CHK_EFC_0x6 ""
DIALOG.Set CHK_EFC_0x7 ""
)
IF &number_lockbits>8.
(
DIALOG.Set CHK_EFC_0x8 ""
DIALOG.Set CHK_EFC_0x9 ""
DIALOG.Set CHK_EFC_0x0A ""
DIALOG.Set CHK_EFC_0x0B ""
DIALOG.Set CHK_EFC_0x0C ""
DIALOG.Set CHK_EFC_0x0D ""
DIALOG.Set CHK_EFC_0x0E ""
DIALOG.Set CHK_EFC_0x0F ""
)
IF &number_lockbits>16.
(
DIALOG.Set CHK_EFC_0x10 ""
DIALOG.Set CHK_EFC_0x11 ""
DIALOG.Set CHK_EFC_0x12 ""
DIALOG.Set CHK_EFC_0x13 ""
DIALOG.Set CHK_EFC_0x14 ""
DIALOG.Set CHK_EFC_0x15 ""
DIALOG.Set CHK_EFC_0x16 ""
DIALOG.Set CHK_EFC_0x17 ""
DIALOG.Set CHK_EFC_0x18 ""
DIALOG.Set CHK_EFC_0x19 ""
DIALOG.Set CHK_EFC_0x1A ""
DIALOG.Set CHK_EFC_0x1B ""
DIALOG.Set CHK_EFC_0x1C ""
DIALOG.Set CHK_EFC_0x1D ""
DIALOG.Set CHK_EFC_0x1E ""
DIALOG.Set CHK_EFC_0x1F ""
)
RETURN
EEFCUnselectAll:
DIALOG.Set CHK_EFC_0x0 " "
DIALOG.Set CHK_EFC_0x1 " "
DIALOG.Set CHK_EFC_0x2 " "
DIALOG.Set CHK_EFC_0x3 " "
IF &number_lockbits>4.
(
DIALOG.Set CHK_EFC_0x4 " "
DIALOG.Set CHK_EFC_0x5 " "
DIALOG.Set CHK_EFC_0x6 " "
DIALOG.Set CHK_EFC_0x7 " "
)
IF &number_lockbits>8.
(
DIALOG.Set CHK_EFC_0x8 " "
DIALOG.Set CHK_EFC_0x9 " "
DIALOG.Set CHK_EFC_0x0A " "
DIALOG.Set CHK_EFC_0x0B " "
DIALOG.Set CHK_EFC_0x0C " "
DIALOG.Set CHK_EFC_0x0D " "
DIALOG.Set CHK_EFC_0x0E " "
DIALOG.Set CHK_EFC_0x0F " "
)
IF &number_lockbits>16.
(
DIALOG.Set CHK_EFC_0x10 " "
DIALOG.Set CHK_EFC_0x11 " "
DIALOG.Set CHK_EFC_0x12 " "
DIALOG.Set CHK_EFC_0x13 " "
DIALOG.Set CHK_EFC_0x14 " "
DIALOG.Set CHK_EFC_0x15 " "
DIALOG.Set CHK_EFC_0x16 " "
DIALOG.Set CHK_EFC_0x17 " "
DIALOG.Set CHK_EFC_0x18 " "
DIALOG.Set CHK_EFC_0x19 " "
DIALOG.Set CHK_EFC_0x1A " "
DIALOG.Set CHK_EFC_0x1B " "
DIALOG.Set CHK_EFC_0x1C " "
DIALOG.Set CHK_EFC_0x1D " "
DIALOG.Set CHK_EFC_0x1E " "
DIALOG.Set CHK_EFC_0x1F " "
)
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Flash programming routine. This routine does not modify the flash content, but
; changes some flags of the Embedded Flash Controller.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ProgramFlashSettings:
LOCAL &error
LOCAL &sectorlockbit
&error=0;
IF DIALOG.BOOLEAN(CHK_SEC)
(
DIALOG.YESNO "Do you really want to program the flash settings and enable the Security bit?"
ENTRY &result
)
ELSE
(
DIALOG.YESNO "Do you really want to program the flash settings?"
ENTRY &result
)
IF !&result
RETURN
; Programming the Sector protection bits.
&sectorlockbit=0x0
WHILE &sectorlockbit<0x10&&&sectorlockbit<&number_lockbits
(
LOCAL &boxid
&boxid="CHK_EFC_&sectorlockbit"
IF DIALOG.BOOLEAN(&boxid)
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(&sectorlockbit<<(5.+8.))+0x08
ENTRY &error
)
ELSE
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(&sectorlockbit<<(5.+8.))+0x09
ENTRY &error
)
IF &error!=0
RETURN
&sectorlockbit=&sectorlockbit+0x1
)
IF &mcu_flashplanes>=2.
(
&sectorlockbit=0x10
WHILE &sectorlockbit<0x20&&&sectorlockbit<&number_lockbits
(
LOCAL &boxid
&boxid="CHK_EFC_&sectorlockbit"
IF DIALOG.BOOLEAN(&boxid)
(
GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((&sectorlockbit&0x0F)<<(5.+8.))+0x08
ENTRY &error
)
ELSE
(
GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((&sectorlockbit&0x0F)<<(5.+8.))+0x09
ENTRY &error
)
IF &error!=0
RETURN
&sectorlockbit=&sectorlockbit+0x1
)
)
; Programing the GPNVM bits
IF &mcu_flashplanes>=2.
(
IF DIALOG.BOOLEAN(CHSB_SEL.FLASH1)
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00020B
ENTRY &error
)
ELSE
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00020C
ENTRY &error
)
IF &error!=0
RETURN
)
IF DIALOG.BOOLEAN(CHSB_BOOT.FLASH)
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00010B
ENTRY &error
)
ELSE
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00010C
ENTRY &error
)
IF &error!=0
RETURN
IF DIALOG.BOOLEAN(CHK_SEC)
(
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A00000B
ENTRY &error
; When the Security bit was successfully enabled, these script lines shouldn't
; be reached because system is going done immediately. Ensure that the dialog
; will be closed. Any modification in the flash setup is forbidden, until the
; flash was erased by the external ERASE pin.
IF &error==0
(
DIALOG.END
END
)
)
GOSUB UpdateWindowFlashSettings
RETURN
ExecuteFlashCommand_EFC:
ENTRY &efc_base &cmd
LOCAL &error
LOCAL &timer
&error=0
; Check FRDY bit in the FSR
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
IF (&MC_FSR&0x1)==0
(
DIALOG.OK "Unexpected Error: Flash controller is busy!"
&error=1
RETURN &error
)
; Write flash command
Data.Set &efc_base+0x04 %Long &cmd
; Check FRDY bit in the FSR
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
&timer=0.
WHILE (&MC_FSR&0x1)==0
(
WAIT 10ms
&timer=&timer+1.
IF &timer>500. ; Timeout after 5 seconds
(
DIALOG.OK "Timeout: Flash controller keeps busy!"
&error=1
RETURN &error
)
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
)
IF (&MC_FSR&0x4)!=0
(
DIALOG.OK "Unexpected Error: Locking region violation!"
&error=1
RETURN &error
)
IF (&MC_FSR&0x2)!=0
(
DIALOG.OK "INTERNAL ERROR: Bad keyword violation!"
&error=1
RETURN &error
)
RETURN &error
ExecuteFlashCommandFRR_EFC:
ENTRY &efc_base &cmd
LOCAL &error
LOCAL &timer
&result=0
; Check FRDY bit in the FSR
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
IF (&MC_FSR&0x1)==0
(
DIALOG.OK "Unexpected Error: Flash controller is busy!"
RETURN &result
)
; Write flash command
Data.Set &efc_base+0x04 %Long &cmd
; Check FRDY bit in the FSR
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
&timer=0.
WHILE (&MC_FSR&0x1)==0
(
WAIT 10ms
&timer=&timer+1.
IF &timer>500. ; Timeout after 5 seconds
(
DIALOG.OK "Timeout: Flash controller keeps busy!"
RETURN &result
)
&MC_FSR=Data.Long(ASD:&efc_base+0x08)
)
IF (&MC_FSR&0x4)!=0
(
DIALOG.OK "Unexpected Error: Locking region violation!"
RETURN &result
)
IF (&MC_FSR&0x2)!=0
(
DIALOG.OK "INTERNAL ERROR: Bad keyword violation!"
RETURN &result
)
; Read Result
&MC_FRR=Data.Long(ASD:&efc_base+0x0C)
&result=&MC_FRR
RETURN &result
EnableSecurityBit:
IF DIALOG.BOOLEAN(CHK_SEC)
(
DIALOG.YESNO "WARNING: Flash cannot be read or written after programming until it is erased by the external ERASE pin! Continue?"
ENTRY &result
IF !&result
(
DIALOG.Set CHK_SEC " "
)
)
RETURN