804 lines
18 KiB
Plaintext
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 §orlockbit
|
|
|
|
&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.
|
|
|
|
§orlockbit=0x0
|
|
WHILE §orlockbit<0x10&&§orlockbit<&number_lockbits
|
|
(
|
|
LOCAL &boxid
|
|
&boxid="CHK_EFC_§orlockbit"
|
|
IF DIALOG.BOOLEAN(&boxid)
|
|
(
|
|
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(§orlockbit<<(5.+8.))+0x08
|
|
ENTRY &error
|
|
)
|
|
ELSE
|
|
(
|
|
GOSUB ExecuteFlashCommand_EFC &EFC0_BASE 0x5A000000+(§orlockbit<<(5.+8.))+0x09
|
|
ENTRY &error
|
|
)
|
|
IF &error!=0
|
|
RETURN
|
|
|
|
§orlockbit=§orlockbit+0x1
|
|
)
|
|
|
|
IF &mcu_flashplanes>=2.
|
|
(
|
|
§orlockbit=0x10
|
|
WHILE §orlockbit<0x20&&§orlockbit<&number_lockbits
|
|
(
|
|
LOCAL &boxid
|
|
&boxid="CHK_EFC_§orlockbit"
|
|
IF DIALOG.BOOLEAN(&boxid)
|
|
(
|
|
GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((§orlockbit&0x0F)<<(5.+8.))+0x08
|
|
ENTRY &error
|
|
)
|
|
ELSE
|
|
(
|
|
GOSUB ExecuteFlashCommand_EFC &EFC1_BASE 0x5A000000+((§orlockbit&0x0F)<<(5.+8.))+0x09
|
|
ENTRY &error
|
|
)
|
|
IF &error!=0
|
|
RETURN
|
|
|
|
§orlockbit=§orlockbit+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
|