-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopenocd_fe310_is25lp032d_flash_read.tcl
More file actions
132 lines (105 loc) · 3.67 KB
/
Copy pathopenocd_fe310_is25lp032d_flash_read.tcl
File metadata and controls
132 lines (105 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# ============================================================
# FE310 Flash Dump — 4 MiB total, 8 KiB chunks
# ============================================================
echo off
source [find mem_helper.tcl]
reset_config srst_only srst_nogate
adapter srst delay 800
adapter srst pulse_width 800
init
reset halt
sleep 1000
#accept arguments
if {![info exists start_addr]} { set start_addr 0}
if {![info exists read_len]} { set read_len 0}
if {![info exists chunk_size]} { set chunk_size 0}
# ============================================================
# HARDWARE-DEPENDENT PARAMS
# ============================================================
set loader_addr 0x80000000
set flash_capacity 0x00400000
set flash_chunk_size_default 0x00002000
# Control structure offsets
set off_STKOFF 0x00
set off_RMEMOFF 0x04
set off_CMDCTR 0x08
set off_STATUS 0x0C
set off_RQX 0x10
set off_ERR 0x14
set off_FMEMADDR 0x18
set off_FMEMSIZE 0x1C
set off_LOADER_MAJOR 0x20
set off_LOADER_MINOR 0x24
set RQX_FLASH_READ 6
# ============================================================
# Preparing read operation
# ============================================================
set ctrl_addr [expr {$loader_addr + 8}]
if { $read_len == 0 } { set read_len [expr {$flash_capacity - $start_addr}]}
if { $chunk_size == 0 } { set chunk_size $flash_chunk_size_default}
set chunks [expr { ($read_len + $chunk_size - 1) / $chunk_size }]
if { [expr {$read_len % $chunk_size}] != 0 } {
puts "Param error: read length must be divisible by chunk size"
shutdown
}
set flash_addr $start_addr
set end_addr [expr {$start_addr + $read_len}]
set out_file [format "flash_0x%08X_0x%08X.bin" $start_addr $end_addr]
# ------------------------------------------------------------
# Load loader into RAM
# ------------------------------------------------------------
halt
load_image loader.bin $loader_addr
reg pc $loader_addr
# Print operation parameters
set rmemoff [mrw [expr {$ctrl_addr + $off_RMEMOFF}]]
set buffer_addr [expr {$loader_addr + $rmemoff}]
puts [format "Buffer address = 0x%08X (%d)" $buffer_addr $buffer_addr]
puts [format "Buffer size = 0x%08X (%d)" $chunk_size $chunk_size]
puts [format "Flash read address = 0x%08X (%d)" $start_addr $start_addr]
puts [format "Read length = 0x%08X (%d)" $read_len $read_len]
# ------------------------------------------------------------
# Helper: check loader error
# ------------------------------------------------------------
proc check_error {ctrl_addr} {
set err [mrw [expr {$ctrl_addr + 0x14}]]
if {$err != 0} {
puts "ERROR: Loader reported error $err"
shutdown
}
}
# Set read length in the loader
mww [expr {$ctrl_addr + $off_FMEMSIZE}] $chunk_size
# Remove previous read, initialize the loader
exec rm -f $out_file
puts "Output file: $out_file"
sleep 4
resume
wait_halt 10000
# ------------------------------------------------------------
# Main loop
# ------------------------------------------------------------
for {set i 0} {$i < $chunks} {incr i} {
if { [expr {$i % 32}] == 0 } {
puts "Progress: $i / $chunks"
}
sleep 4
mww [expr {$ctrl_addr + $off_FMEMADDR}] $flash_addr
mww [expr {$ctrl_addr + $off_RQX}] $RQX_FLASH_READ
# Skip ebreak
set pc_hex [lindex [reg pc] end]
reg pc [expr {$pc_hex + 4}]
sleep 4
resume
wait_halt 10000
check_error $ctrl_addr
set temp_file [format "chunk_%05d.bin" $i]
dump_image $temp_file $buffer_addr $chunk_size
exec sh -c "cat $temp_file >> $out_file"
exec rm -f $temp_file
set flash_addr [expr {$flash_addr + $chunk_size}]
sleep 4
}
puts "Flash dump complete."
sleep 10
shutdown