summaryrefslogtreecommitdiff
path: root/util/openocd/npcx_cmds.tcl
blob: 759e897131d351fe60ee34b89a90d71e795f5182 (plain)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Command automation for NPCX5M5G chip

# Program spi flash
source [find mem_helper.tcl]

proc flash_npcx {image_path cram_addr image_offset image_size spifw_image} {
	set UPLOAD_FLAG 0x200C4000;
	set UUT_TAG 0x200C3000;

	echo "*** NPCX Reset and halt CPU first ***"
	reset halt

	# Clear whole Code RAM
	mwb $cram_addr 0xFF $image_size
	# Upload binary image to Code RAM
	load_image $image_path $cram_addr

	# Upload program spi image FW to lower 16KB Data RAM
	load_image $spifw_image 0x200C3020

	# Set sp to upper 16KB Data RAM
	reg sp 0x200C8000
	# Set spi offset address of uploaded image
	reg r0 $image_offset
	# Set spi program size of uploaded image
	reg r1 $image_size
	# Set pc to start of spi program function
	reg pc 0x200C3021
	# Clear upload flag
	mww $UPLOAD_FLAG 0x0

	# Clear UUT Tag
	mww $UUT_TAG 0x0

	echo "*** Program ...  ***"
	# Start to program spi flash
	resume

	# Wait for any pending flash operations to complete
	while {[expr [mrw $UPLOAD_FLAG] & 0x01] == 0} { sleep 1000 }

	if {[expr [mrw $UPLOAD_FLAG] & 0x02] == 0} {
		echo "*** Program Fail ***"
	} else {
		echo "*** Program Done ***"
	}

	# Halt CPU
	halt
}

proc flash_npcx5m5g {image_path image_offset spifw_image} {
	# 96 KB for RO & RW regions
	set fw_size   0x18000
	# Code RAM start address
	set cram_addr 0x100A8000

	echo "*** Start to program npcx5m5g with $image_path ***"
	flash_npcx $image_path $cram_addr $image_offset $fw_size $spifw_image
	echo "*** Finish program npcx5m5g ***\r\n"
}

proc flash_npcx5m6g {image_path image_offset spifw_image} {
	# 224 KB for RO & RW regions
	set fw_size   0x38000
	# Code RAM start address
	set cram_addr 0x10088000

	echo "*** Start to program npcx5m6g with $image_path ***"
	flash_npcx $image_path $cram_addr $image_offset $fw_size $spifw_image
	echo "*** Finish program npcx5m6g ***\r\n"
}

proc flash_npcx7m6x {image_path image_offset spifw_image} {
	# 192 KB for RO & RW regions
	set fw_size   0x30000
	# Code RAM start address
	set cram_addr 0x10090000

	echo "*** Start to program npcx7m6f/g/w with $image_path ***"
	flash_npcx $image_path $cram_addr $image_offset $fw_size $spifw_image
	echo "*** Finish program npcx7m6f/g/w ***\r\n"
}

proc flash_npcx7m7x {image_path image_offset spifw_image} {
	# 320 KB for RO & RW regions
	set fw_size   0x50000
	# Code RAM start address
	set cram_addr 0x10070000

	echo "*** Start to program npcx7m7f/g/w with $image_path ***"
	flash_npcx $image_path $cram_addr $image_offset $fw_size $spifw_image
	echo "*** Finish program npcx7m7f/g/w ***\r\n"
}

proc flash_npcx_ro {chip_name image_dir image_offset} {
	set MPU_RNR  0xE000ED98;
	set MPU_RASR 0xE000EDA0;

	# images path
	set ro_image_path $image_dir/RO/ec.RO.flat
	set spifw_image $image_dir/chip/npcx/spiflashfw/npcx_monitor.bin

	# Halt CPU first
	halt

	# disable MPU for Data RAM
	mww $MPU_RNR  0x1
	mww $MPU_RASR 0x0

	if {$chip_name == "npcx_5m5g_jtag"} {
		# program RO region
		flash_npcx5m5g $ro_image_path $image_offset $spifw_image
	} elseif {$chip_name == "npcx_5m6g_jtag"} {
		# program RO region
		flash_npcx5m6g $ro_image_path $image_offset $spifw_image
	} elseif {$chip_name == "npcx_7m6x_jtag"} {
		# program RO region
		flash_npcx7m6x $ro_image_path $image_offset $spifw_image
	} elseif {$chip_name == "npcx_7m7x_jtag"} {
		# program RO region
		flash_npcx7m7x $ro_image_path $image_offset $spifw_image
	} else {
		echo $chip_name "no supported."
	}
}

proc flash_npcx_all {chip_name image_dir image_offset} {
	set MPU_RNR  0xE000ED98;
	set MPU_RASR 0xE000EDA0;

	# images path
	set ro_image_path $image_dir/RO/ec.RO.flat
	set rw_image_path $image_dir/RW/ec.RW.bin
	set spifw_image $image_dir/chip/npcx/spiflashfw/npcx_monitor.bin

	# Halt CPU first
	halt

	# disable MPU for Data RAM
	mww $MPU_RNR  0x1
	mww $MPU_RASR 0x0

	if {$chip_name == "npcx_5m5g_jtag"} {
		# RW images offset - 128 KB
		set rw_image_offset  [expr ($image_offset + 0x20000)]
		# program RO region
		flash_npcx5m5g $ro_image_path $image_offset $spifw_image
		# program RW region
		flash_npcx5m5g $rw_image_path $rw_image_offset $spifw_image
	} elseif {$chip_name == "npcx_5m6g_jtag"} {
		# RW images offset - 256 KB
		set rw_image_offset  [expr ($image_offset + 0x40000)]
		# program RO region
		flash_npcx5m6g $ro_image_path $image_offset $spifw_image
		# program RW region
		flash_npcx5m6g $rw_image_path $rw_image_offset $spifw_image
	} elseif {$chip_name == "npcx_7m6x_jtag"} {
		# RW images offset - 256 KB
		set rw_image_offset  [expr ($image_offset + 0x40000)]
		# program RO region
		flash_npcx7m6x $ro_image_path $image_offset $spifw_image
		# program RW region
		flash_npcx7m6x $rw_image_path $rw_image_offset $spifw_image
	} elseif {$chip_name == "npcx_7m7x_jtag"} {
		# RW images offset - 512 KB
		set rw_image_offset  [expr ($image_offset + 0x80000)]
		# program RO region
		flash_npcx7m7x $ro_image_path $image_offset $spifw_image
		# program RW region
		flash_npcx7m7x $rw_image_path $rw_image_offset $spifw_image
	} else {
		echo $chip_name "no supported."
	}
}

proc reset_halt_cpu { } {
	echo "*** NPCX Reset and halt CPU first ***"
	reset halt
}