aboutsummaryrefslogtreecommitdiff
path: root/tcl
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2022-10-14 11:16:58 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2023-01-28 15:55:10 +0000
commitbec6c0eb094fb7ca1752688118f41193dc83e026 (patch)
tree9867b2427c51254833d9e3c5c53148d63099f520 /tcl
parent2dde7e914b429ffa5bc56faa20fb474ca451412e (diff)
downloadriscv-openocd-bec6c0eb094fb7ca1752688118f41193dc83e026.zip
riscv-openocd-bec6c0eb094fb7ca1752688118f41193dc83e026.tar.gz
riscv-openocd-bec6c0eb094fb7ca1752688118f41193dc83e026.tar.bz2
tcl/interface: universal config for all Raspberry Pi models
Speed calibration coeffs are computed from cpufreq/scaling_max_freq and from the device-tree compatibility information. Raspberry Pi linux offers /dev/gpiomem for non-root access to the GPIO registers since ~2016. Do not configure 'bcm2835gpio peripheral_base' as it is necessary only if /dev/mem is used - it requires running OpenOCD as root - it's a security risk so it should be avoided. The configuration of the GPIO connector (40-pin header) is factored out and ready to use in interface configuration for other driver (e.g. linux gpiod). Mark raspberrypi2-native.cfg as deprecated and redirect it to raspberrypi-native.cfg Change-Id: Icce856fb660b45374e94174da279feb51f529908 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/7264 Tested-by: jenkins Reviewed-by: Jonathan Bell <jonathan@raspberrypi.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'tcl')
-rw-r--r--tcl/interface/raspberrypi-gpio-connector.cfg42
-rw-r--r--tcl/interface/raspberrypi-native.cfg91
-rw-r--r--tcl/interface/raspberrypi2-native.cfg44
3 files changed, 104 insertions, 73 deletions
diff --git a/tcl/interface/raspberrypi-gpio-connector.cfg b/tcl/interface/raspberrypi-gpio-connector.cfg
new file mode 100644
index 0000000..eff73fc
--- /dev/null
+++ b/tcl/interface/raspberrypi-gpio-connector.cfg
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+#
+# Config for Raspberry Pi GPIO header
+#
+# This is best used with a fast enough buffer but also
+# is suitable for direct connection if the target voltage
+# matches RPi's 3.3V and the cable is short enough.
+#
+# Do not forget the GND connection, e.g. pin 20 of the GPIO header.
+#
+
+# GPIO 25 (pin 22) previously used for TMS/SWDIO is pulled-down by default.
+# The JTAG/SWD specification requires pull-up at the target board
+# for either signal. Connecting the signal pulled-up on the target
+# to the pull-down on the adapter is not a good idea.
+# GPIO 8 is pulled-up by default.
+echo "Warn : TMS/SWDIO moved to GPIO 8 (pin 24). Check the wiring please!"
+
+# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
+# Header pin numbers: 23 24 19 21
+adapter gpio tck -chip 0 11
+adapter gpio tms -chip 0 8
+adapter gpio tdi -chip 0 10
+adapter gpio tdo -chip 0 9
+
+# Each of the SWD lines need a gpio number set: swclk swdio
+# Header pin numbers: 23 24
+adapter gpio swclk -chip 0 11
+adapter gpio swdio -chip 0 8
+
+# If you define trst or srst, use appropriate reset_config
+# Header pin numbers: TRST - 26, SRST - 18
+
+# adapter gpio trst -chip 0 7
+# reset_config trst_only
+
+# adapter gpio srst -chip 0 24
+# reset_config srst_only srst_push_pull
+
+# or if you have both connected,
+# reset_config trst_and_srst srst_push_pull
diff --git a/tcl/interface/raspberrypi-native.cfg b/tcl/interface/raspberrypi-native.cfg
index 02a3563..95426c2 100644
--- a/tcl/interface/raspberrypi-native.cfg
+++ b/tcl/interface/raspberrypi-native.cfg
@@ -1,44 +1,71 @@
# SPDX-License-Identifier: GPL-2.0-or-later
-#
-# Config for using Raspberry Pi's expansion header
-#
-# This is best used with a fast enough buffer but also
-# is suitable for direct connection if the target voltage
-# matches RPi's 3.3V and the cable is short enough.
-#
-# Do not forget the GND connection, pin 6 of the expansion header.
-#
+# Config for Raspberry Pi used as a bitbang adapter.
+# https://www.raspberrypi.com/documentation/computers/raspberry-pi.html
+
+# Supports all models with 40-pin or 26-pin GPIO connector up to Raspberry Pi 4 B
+# also supports Raspberry Pi Zero, Zero W and Zero 2 W.
+
+# Adapter speed calibration is computed from cpufreq/scaling_max_freq.
+# Adjusts automatically if CPU is overclocked.
adapter driver bcm2835gpio
-bcm2835gpio peripheral_base 0x20000000
+proc read_file { name } {
+ if {[catch {open $name r} fd]} {
+ return ""
+ }
+ set result [read $fd]
+ close $fd
+ return $result
+}
-# Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
-# These depend on system clock, calibrated for stock 700MHz
-# bcm2835gpio speed SPEED_COEFF SPEED_OFFSET
-bcm2835gpio speed_coeffs 113714 28
+proc measure_clock {} {
+ set result [exec vcgencmd measure_clock arm]
+ set clock_hz [lindex [split $result "="] 1]
+ expr { $clock_hz / 1000 }
+}
+
+proc get_max_cpu_clock { default } {
+ set clock [read_file /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq]
+ if { $clock > 100000 } {
+ return $clock
+ }
-# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
-# Header pin numbers: 23 22 19 21
-adapter gpio tck -chip 0 11
-adapter gpio tms -chip 0 25
-adapter gpio tdi -chip 0 10
-adapter gpio tdo -chip 0 9
+ # cpufreq not available. As the last resort try Broadcom's proprietary utility
+ if {![catch measure_clock clock] && $clock > 100000} {
+ return $clock
+ }
-# Each of the SWD lines need a gpio number set: swclk swdio
-# Header pin numbers: 23 22
-adapter gpio swclk -chip 0 11
-adapter gpio swdio -chip 0 25
+ echo "WARNING: Host CPU clock unknown."
+ echo "WARNING: Using the highest possible value $default kHz as a safe default."
+ echo "WARNING: Expect JTAG/SWD clock significantly slower than requested."
-# If you define trst or srst, use appropriate reset_config
-# Header pin numbers: TRST - 26, SRST - 18
+ return $default
+}
-# adapter gpio trst -chip 0 7
-# reset_config trst_only
+set compat [read_file /proc/device-tree/compatible]
+set clocks_per_timing_loop 4
-# adapter gpio srst -chip 0 24
-# reset_config srst_only srst_push_pull
+if {[string match *bcm2711* $compat]} {
+ set speed_offset 52
+} elseif {[string match *bcm2837* $compat] || [string match *bcm2710* $compat]} {
+ set speed_offset 34
+} elseif {[string match *bcm2836* $compat] || [string match *bcm2709* $compat]} {
+ set speed_offset 36
+} elseif {[string match *bcm2835* $compat] || [string match *bcm2708* $compat]} {
+ set clocks_per_timing_loop 6
+ set speed_offset 32
+} else {
+ set speed_offset 32
+ echo "WARNING: Unknown type of the host SoC. Expect JTAG/SWD clock slower than requested."
+}
+
+set clock [get_max_cpu_clock 2000000]
+set speed_coeff [expr { $clock / $clocks_per_timing_loop }]
+
+# Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
+# The coefficients depend on system clock and CPU frequency scaling.
+bcm2835gpio speed_coeffs $speed_coeff $speed_offset
-# or if you have both connected,
-# reset_config trst_and_srst srst_push_pull
+source raspberrypi-gpio-connector.cfg
diff --git a/tcl/interface/raspberrypi2-native.cfg b/tcl/interface/raspberrypi2-native.cfg
index d5edded..fe9186f 100644
--- a/tcl/interface/raspberrypi2-native.cfg
+++ b/tcl/interface/raspberrypi2-native.cfg
@@ -1,44 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-or-later
-#
-# Config for using Raspberry Pi's expansion header
-#
-# This is best used with a fast enough buffer but also
-# is suitable for direct connection if the target voltage
-# matches RPi's 3.3V and the cable is short enough.
-#
-# Do not forget the GND connection, pin 6 of the expansion header.
-#
+echo "WARNING: interface/raspberrypi2-native.cfg is deprecated."
+echo "WARNING: Please use interface/raspberrypi-native.cfg for all Raspberry Pi models."
-adapter driver bcm2835gpio
-
-bcm2835gpio peripheral_base 0x3F000000
-
-# Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
-# These depend on system clock, calibrated for scaling_max_freq 900MHz
-# bcm2835gpio speed SPEED_COEFF SPEED_OFFSET
-bcm2835gpio speed_coeffs 225000 36
-
-# Each of the JTAG lines need a gpio number set: tck tms tdi tdo
-# Header pin numbers: 23 22 19 21
-adapter gpio tck -chip 0 11
-adapter gpio tms -chip 0 25
-adapter gpio tdi -chip 0 10
-adapter gpio tdo -chip 0 9
-
-# Each of the SWD lines need a gpio number set: swclk swdio
-# Header pin numbers: 23 22
-adapter gpio swclk -chip 0 11
-adapter gpio swdio -chip 0 25
-
-# If you define trst or srst, use appropriate reset_config
-# Header pin numbers: TRST - 26, SRST - 18
-
-# adapter gpio trst -chip 0 7
-# reset_config trst_only
-
-# adapter gpio srst -chip 0 24
-# reset_config srst_only srst_push_pull
-
-# or if you have both connected,
-# reset_config trst_and_srst srst_push_pull
+source [find interface/raspberrypi-native.cfg]