93ef82ce618e147807fab44f1aaf017c606d9b57
[fw/openocd] / src / flash / startup.tcl
1 # Defines basic Tcl procs for OpenOCD flash module
2
3 #
4 # program utility proc
5 # usage: program filename
6 # optional args: verify, reset, exit and address
7 #
8
9 lappend _telnet_autocomplete_skip program_error
10 proc program_error {description exit} {
11         if {$exit == 1} {
12                 echo $description
13                 shutdown error
14         }
15
16         error $description
17 }
18
19 proc program {filename args} {
20         set exit 0
21         set needsflash 1
22
23         foreach arg $args {
24                 if {[string equal $arg "preverify"]} {
25                         set preverify 1
26                 } elseif {[string equal $arg "verify"]} {
27                         set verify 1
28                 } elseif {[string equal $arg "reset"]} {
29                         set reset 1
30                 } elseif {[string equal $arg "exit"]} {
31                         set exit 1
32                 } else {
33                         set address $arg
34                 }
35         }
36
37         # Set variables
38         set filename \{$filename\}
39         if {[info exists address]} {
40                 set flash_args "$filename $address"
41         } else {
42                 set flash_args "$filename"
43         }
44
45
46         # make sure init is called
47         if {[catch {init}] != 0} {
48                 program_error "** OpenOCD init failed **" 1
49         }
50
51         # reset target and call any init scripts
52         if {[catch {reset init}] != 0} {
53                 program_error "** Unable to reset target **" $exit
54         }
55
56         # Check whether programming is needed
57         if {[info exists preverify]} {
58                 echo "**pre-verifying**"
59                 if {[catch {eval verify_image $flash_args}] == 0} {
60                         echo "**Verified OK - No flashing**"
61                         set needsflash 0
62                 }
63         }
64
65         # start programming phase
66         if {$needsflash == 1} {
67                 echo "** Programming Started **"
68
69                 if {[catch {eval flash write_image erase $flash_args}] == 0} {
70                         echo "** Programming Finished **"
71                         if {[info exists verify]} {
72                                 # verify phase
73                                 echo "** Verify Started **"
74                                 if {[catch {eval verify_image $flash_args}] == 0} {
75                                         echo "** Verified OK **"
76                                 } else {
77                                         program_error "** Verify Failed **" $exit
78                                 }
79                         }
80                 } else {
81                         program_error "** Programming Failed **" $exit
82                 }
83         }
84
85         if {[info exists reset]} {
86                 # reset target if requested
87                 if {$exit == 1} {
88                         # also disable target polling, we are shutting down anyway
89                         poll off
90                 }
91                 echo "** Resetting Target **"
92                 reset run
93         }
94
95
96         if {$exit == 1} {
97                 shutdown
98         }
99         return
100 }
101
102 add_help_text program "write an image to flash, address is only required for binary images. verify, reset, exit are optional"
103 add_usage_text program "<filename> \[address\] \[pre-verify\] \[verify\] \[reset\] \[exit\]"
104
105 # stm32[f0x|f3x] uses the same flash driver as the stm32f1x
106 proc stm32f0x args { eval stm32f1x $args }
107 proc stm32f3x args { eval stm32f1x $args }
108
109 # stm32[f4x|f7x] uses the same flash driver as the stm32f2x
110 proc stm32f4x args { eval stm32f2x $args }
111 proc stm32f7x args { eval stm32f2x $args }
112
113 # stm32lx driver supports both STM32 L0 and L1 devices
114 proc stm32l0x args { eval stm32lx $args }
115 proc stm32l1x args { eval stm32lx $args }
116
117 # stm32[g0|g4|l5|u5|wb|wl] uses the same flash driver as the stm32l4x
118 proc stm32g0x args { eval stm32l4x $args }
119 proc stm32g4x args { eval stm32l4x $args }
120 proc stm32l5x args { eval stm32l4x $args }
121 proc stm32u5x args { eval stm32l4x $args }
122 proc stm32wbx args { eval stm32l4x $args }
123 proc stm32wlx args { eval stm32l4x $args }