aboutsummaryrefslogtreecommitdiff
path: root/tcl/interface/raspberrypi-native.cfg
blob: 7224723d6322c5384c1ec901bfbb1a7203ee502c (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
# 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]