# 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 "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." 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 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 source [find interface/raspberrypi-gpio-connector.cfg]