diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2022-10-13 16:46:31 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2023-01-28 15:54:17 +0000 |
commit | b4dd8dbc37daf073bf6481fdc7f0f9d7f2e96809 (patch) | |
tree | 9382222659aad3437dcc2826e988ad1b603fd7ea /src | |
parent | 148bc7e2151740527b4ca67d0a7c7c9f01725981 (diff) | |
download | riscv-openocd-b4dd8dbc37daf073bf6481fdc7f0f9d7f2e96809.zip riscv-openocd-b4dd8dbc37daf073bf6481fdc7f0f9d7f2e96809.tar.gz riscv-openocd-b4dd8dbc37daf073bf6481fdc7f0f9d7f2e96809.tar.bz2 |
jtag/drivers/bcm2835gpio: use rounding in delay math
After setting adapter speed to some values, the driver
shows the real speed little bit higher.
Although it does not impose a problem from technical point
of view because the difference is smaller than usual speed error,
it looks at least strange to the user. The documentation reads
that real frequency should be same or lower than requested.
Use proper rounding in speed -> delay and delay -> speed
conversions.
Change-Id: I1831112cc58681875548d2aeb688391fb79fa37f
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: https://review.openocd.org/c/openocd/+/7261
Tested-by: jenkins
Reviewed-by: Jonathan Bell <jonathan@raspberrypi.com>
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/drivers/bcm2835gpio.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/jtag/drivers/bcm2835gpio.c b/src/jtag/drivers/bcm2835gpio.c index 5aa1a99..320baba 100644 --- a/src/jtag/drivers/bcm2835gpio.c +++ b/src/jtag/drivers/bcm2835gpio.c @@ -264,7 +264,8 @@ static int bcm2835gpio_khz(int khz, int *jtag_speed) LOG_DEBUG("BCM2835 GPIO: RCLK not supported"); return ERROR_FAIL; } - *jtag_speed = speed_coeff/khz - speed_offset; + *jtag_speed = DIV_ROUND_UP(speed_coeff, khz) - speed_offset; + LOG_DEBUG("jtag_delay %d", *jtag_speed); if (*jtag_speed < 0) *jtag_speed = 0; return ERROR_OK; @@ -272,7 +273,9 @@ static int bcm2835gpio_khz(int khz, int *jtag_speed) static int bcm2835gpio_speed_div(int speed, int *khz) { - *khz = speed_coeff/(speed + speed_offset); + int divisor = speed + speed_offset; + /* divide with roundig to the closest */ + *khz = (speed_coeff + divisor / 2) / divisor; return ERROR_OK; } |