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 <stevemarple@googlemail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6938 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
This commit is contained in:
parent
cc75aa37c5
commit
0b241ca042
|
@ -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<<tdo_gpio) ? BB_HIGH : BB_LOW;
|
||||
|
@ -133,12 +138,12 @@ static int bcm2835gpio_reset(int trst, int srst)
|
|||
uint32_t set = 0;
|
||||
uint32_t clear = 0;
|
||||
|
||||
if (trst_gpio > 0) {
|
||||
if (is_gpio_valid(trst_gpio)) {
|
||||
set |= !trst<<trst_gpio;
|
||||
clear |= trst<<trst_gpio;
|
||||
}
|
||||
|
||||
if (srst_gpio > 0) {
|
||||
if (is_gpio_valid(srst_gpio)) {
|
||||
set |= !srst<<srst_gpio;
|
||||
clear |= srst<<srst_gpio;
|
||||
}
|
||||
|
@ -151,7 +156,7 @@ static int bcm2835gpio_reset(int trst, int srst)
|
|||
|
||||
static void bcm2835_swdio_drive(bool is_output)
|
||||
{
|
||||
if (swdio_dir_gpio > 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;
|
||||
|
|
Loading…
Reference in New Issue