Change 7732: jtag/drivers/bcm2835gpio: Support all 54 GPIO pins [1] reduces the time needed for GPIO handling. Adjust the speed offsets to the new and faster bcm2835gpio code. Measured with Sigrok/PulseView, sampled at 800 MHz. Configured as SWD with the fast path in the driver - other modes are expected to be slower. Adjusted to keep all half periods of SWCLK in the sampled poll sequence longer or equal than the half period of the nominal adapter speed. Link: [1] https://review.openocd.org/c/openocd/+/7732 Change-Id: Ia9e932dfd7547c8011c1d20d9e90bc0294050e8a Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/9234 Tested-by: jenkins Reviewed-by: Vincent Fazio <vfazio@gmail.com>
76 lines
2.4 KiB
INI
76 lines
2.4 KiB
INI
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# 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
|
|
|
|
proc read_file { name } {
|
|
if {[catch {open $name r} fd]} {
|
|
return ""
|
|
}
|
|
set result [read $fd]
|
|
close $fd
|
|
return $result
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
# cpufreq not available. As the last resort try Broadcom's proprietary utility
|
|
if {![catch measure_clock clock] && $clock > 100000} {
|
|
return $clock
|
|
}
|
|
|
|
echo "Warn : Host CPU clock unknown."
|
|
echo "Warn : Using the highest possible value $default kHz as a safe default."
|
|
echo "Warn : Expect JTAG/SWD clock significantly slower than requested."
|
|
|
|
return $default
|
|
}
|
|
|
|
set compat [read_file /proc/device-tree/compatible]
|
|
set clocks_per_timing_loop 4
|
|
|
|
if {[string match *bcm2711* $compat]} {
|
|
set speed_offset 52
|
|
} elseif {[string match *bcm2837* $compat] || [string match *bcm2710* $compat]} {
|
|
set speed_offset 31
|
|
} elseif {[string match *bcm2836* $compat] || [string match *bcm2709* $compat]} {
|
|
set speed_offset 25
|
|
} elseif {[string match *bcm2835* $compat] || [string match *bcm2708* $compat]} {
|
|
set clocks_per_timing_loop 6
|
|
set speed_offset 23
|
|
} elseif {[string match *bcm2712* $compat]} {
|
|
echo "Error: Raspberrypi Pi 5 has moved GPIOs to PCIe connected RP1 chip."
|
|
echo "Error: Native GPIO handling is not supported, use 'raspberrypi5-gpiod.cfg'"
|
|
shutdown
|
|
} else {
|
|
set speed_offset 32
|
|
echo "Warn : 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
|
|
|
|
source [find interface/raspberrypi-gpio-connector.cfg]
|