From 0b241ca042b1376efdcaacc52a798a20a0d9fc2a Mon Sep 17 00:00:00 2001 From: Steve Marple Date: Tue, 19 Apr 2022 23:22:31 +0100 Subject: [PATCH] bcm2835gpio: Fix incorrect GPIO validation Incorrect validation prevented GPIO0 from controlling the direction of the SWDIO buffer or operating TRST/SRST. Have all GPIO number validation checks performed by is_gpio_valid(). Change-Id: Ib8fb704ab588a618ac41c111f6168d658891d92c Signed-off-by: Steve Marple Reviewed-on: https://review.openocd.org/c/openocd/+/6938 Tested-by: jenkins Reviewed-by: Antonio Borneo Reviewed-by: Andreas Fritiofson --- src/jtag/drivers/bcm2835gpio.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/jtag/drivers/bcm2835gpio.c b/src/jtag/drivers/bcm2835gpio.c index b7a4d998cd..22d237f220 100644 --- a/src/jtag/drivers/bcm2835gpio.c +++ b/src/jtag/drivers/bcm2835gpio.c @@ -94,6 +94,11 @@ static int speed_coeff = 113714; static int speed_offset = 28; static unsigned int jtag_delay; +static int is_gpio_valid(int gpio) +{ + return gpio >= 0 && gpio <= 31; +} + static bb_value_t bcm2835gpio_read(void) { return (GPIO_LEV & 1< 0) { + if (is_gpio_valid(trst_gpio)) { set |= !trst< 0) { + if (is_gpio_valid(srst_gpio)) { set |= !srst< 0) { + if (is_gpio_valid(swdio_dir_gpio)) { if (is_output) { GPIO_SET = 1 << swdio_dir_gpio; OUT_GPIO(swdio_gpio); @@ -196,11 +201,6 @@ static int bcm2835gpio_speed(int speed) return ERROR_OK; } -static int is_gpio_valid(int gpio) -{ - return gpio >= 0 && gpio <= 31; -} - COMMAND_HANDLER(bcm2835gpio_handle_jtag_gpionums) { if (CMD_ARGC == 4) { @@ -557,7 +557,7 @@ static int bcm2835gpio_init(void) OUT_GPIO(tck_gpio); OUT_GPIO(tms_gpio); - if (trst_gpio != -1) { + if (is_gpio_valid(trst_gpio)) { trst_gpio_mode = MODE_GPIO(trst_gpio); GPIO_SET = 1 << trst_gpio; OUT_GPIO(trst_gpio); @@ -566,7 +566,7 @@ static int bcm2835gpio_init(void) if (transport_is_swd()) { /* Make buffer an output before the GPIO connected to it */ - if (swdio_dir_gpio != -1) { + if (is_gpio_valid(swdio_dir_gpio)) { swdio_dir_gpio_mode = MODE_GPIO(swdio_dir_gpio); GPIO_SET = 1 << swdio_dir_gpio; OUT_GPIO(swdio_dir_gpio); @@ -581,7 +581,7 @@ static int bcm2835gpio_init(void) OUT_GPIO(swdio_gpio); } - if (srst_gpio != -1) { + if (is_gpio_valid(srst_gpio)) { srst_gpio_mode = MODE_GPIO(srst_gpio); GPIO_SET = 1 << srst_gpio; OUT_GPIO(srst_gpio); @@ -601,7 +601,7 @@ static int bcm2835gpio_quit(void) SET_MODE_GPIO(tdi_gpio, tdi_gpio_mode); SET_MODE_GPIO(tck_gpio, tck_gpio_mode); SET_MODE_GPIO(tms_gpio, tms_gpio_mode); - if (trst_gpio != -1) + if (is_gpio_valid(trst_gpio)) SET_MODE_GPIO(trst_gpio, trst_gpio_mode); } @@ -610,10 +610,10 @@ static int bcm2835gpio_quit(void) SET_MODE_GPIO(swdio_gpio, swdio_gpio_mode); } - if (srst_gpio != -1) + if (is_gpio_valid(srst_gpio)) SET_MODE_GPIO(srst_gpio, srst_gpio_mode); - if (swdio_dir_gpio != -1) + if (is_gpio_valid(swdio_dir_gpio)) SET_MODE_GPIO(swdio_dir_gpio, swdio_dir_gpio_mode); return ERROR_OK; -- 2.30.2