| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- # 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]
|