diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2020-04-01 12:03:47 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2020-07-14 00:38:42 +0100 |
commit | ee86f3ef92adfe1f41ad67b4b154ee7ea0327cc8 (patch) | |
tree | 3a2a5ee75c8952f7a47d3e18c424c4ea639e2099 /src/jtag/drivers | |
parent | a8e483a2bf9d1b4eb16b7a0e0851b455a935fcf0 (diff) | |
download | riscv-openocd-ee86f3ef92adfe1f41ad67b4b154ee7ea0327cc8.zip riscv-openocd-ee86f3ef92adfe1f41ad67b4b154ee7ea0327cc8.tar.gz riscv-openocd-ee86f3ef92adfe1f41ad67b4b154ee7ea0327cc8.tar.bz2 |
bcm2835gpio: enable only the transport specific gpio
Change-Id: Ice6744600079d5994d628bb3b782aa36e71f862e
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5558
Tested-by: jenkins
Diffstat (limited to 'src/jtag/drivers')
-rw-r--r-- | src/jtag/drivers/bcm2835gpio.c | 90 |
1 files changed, 53 insertions, 37 deletions
diff --git a/src/jtag/drivers/bcm2835gpio.c b/src/jtag/drivers/bcm2835gpio.c index 77ae566..f868516 100644 --- a/src/jtag/drivers/bcm2835gpio.c +++ b/src/jtag/drivers/bcm2835gpio.c @@ -24,6 +24,7 @@ #endif #include <jtag/interface.h> +#include <transport/transport.h> #include "bitbang.h" #include <sys/mman.h> @@ -456,15 +457,13 @@ static int bcm2835gpio_init(void) LOG_INFO("BCM2835 GPIO JTAG/SWD bitbang driver"); - if (bcm2835gpio_jtag_mode_possible()) { - if (bcm2835gpio_swd_mode_possible()) - LOG_INFO("JTAG and SWD modes enabled"); - else - LOG_INFO("JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode)"); - } else if (bcm2835gpio_swd_mode_possible()) { - LOG_INFO("SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode)"); - } else { - LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode and/or swclk and swdio gpio for SWD mode"); + if (transport_is_jtag() && !bcm2835gpio_jtag_mode_possible()) { + LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode"); + return ERROR_JTAG_INIT_FAILED; + } + + if (transport_is_swd() && !bcm2835gpio_swd_mode_possible()) { + LOG_ERROR("Require swclk and swdio gpio for SWD mode"); return ERROR_JTAG_INIT_FAILED; } @@ -500,31 +499,42 @@ static int bcm2835gpio_init(void) /* set 4mA drive strength, slew rate limited, hysteresis on */ pads_base[BCM2835_PADS_GPIO_0_27_OFFSET] = 0x5a000008 + 1; - tdo_gpio_mode = MODE_GPIO(tdo_gpio); - tdi_gpio_mode = MODE_GPIO(tdi_gpio); - tck_gpio_mode = MODE_GPIO(tck_gpio); - tms_gpio_mode = MODE_GPIO(tms_gpio); - swclk_gpio_mode = MODE_GPIO(swclk_gpio); - swdio_gpio_mode = MODE_GPIO(swdio_gpio); /* * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST * as outputs. Drive TDI and TCK low, and TMS/TRST/SRST high. */ - INP_GPIO(tdo_gpio); - - GPIO_CLR = 1<<tdi_gpio | 1<<tck_gpio | 1<<swdio_gpio | 1<<swclk_gpio; - GPIO_SET = 1<<tms_gpio; - - OUT_GPIO(tdi_gpio); - OUT_GPIO(tck_gpio); - OUT_GPIO(tms_gpio); - OUT_GPIO(swclk_gpio); - OUT_GPIO(swdio_gpio); - if (trst_gpio != -1) { - trst_gpio_mode = MODE_GPIO(trst_gpio); - GPIO_SET = 1 << trst_gpio; - OUT_GPIO(trst_gpio); + if (transport_is_jtag()) { + tdo_gpio_mode = MODE_GPIO(tdo_gpio); + tdi_gpio_mode = MODE_GPIO(tdi_gpio); + tck_gpio_mode = MODE_GPIO(tck_gpio); + tms_gpio_mode = MODE_GPIO(tms_gpio); + + INP_GPIO(tdo_gpio); + + GPIO_CLR = 1<<tdi_gpio | 1<<tck_gpio; + GPIO_SET = 1<<tms_gpio; + + OUT_GPIO(tdi_gpio); + OUT_GPIO(tck_gpio); + OUT_GPIO(tms_gpio); + + if (trst_gpio != -1) { + trst_gpio_mode = MODE_GPIO(trst_gpio); + GPIO_SET = 1 << trst_gpio; + OUT_GPIO(trst_gpio); + } } + + if (transport_is_swd()) { + swclk_gpio_mode = MODE_GPIO(swclk_gpio); + swdio_gpio_mode = MODE_GPIO(swdio_gpio); + + GPIO_CLR = 1<<swdio_gpio | 1<<swclk_gpio; + + OUT_GPIO(swclk_gpio); + OUT_GPIO(swdio_gpio); + } + if (srst_gpio != -1) { srst_gpio_mode = MODE_GPIO(srst_gpio); GPIO_SET = 1 << srst_gpio; @@ -540,14 +550,20 @@ static int bcm2835gpio_init(void) static int bcm2835gpio_quit(void) { - SET_MODE_GPIO(tdo_gpio, tdo_gpio_mode); - SET_MODE_GPIO(tdi_gpio, tdi_gpio_mode); - SET_MODE_GPIO(tck_gpio, tck_gpio_mode); - SET_MODE_GPIO(tms_gpio, tms_gpio_mode); - SET_MODE_GPIO(swclk_gpio, swclk_gpio_mode); - SET_MODE_GPIO(swdio_gpio, swdio_gpio_mode); - if (trst_gpio != -1) - SET_MODE_GPIO(trst_gpio, trst_gpio_mode); + if (transport_is_jtag()) { + SET_MODE_GPIO(tdo_gpio, tdo_gpio_mode); + 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) + SET_MODE_GPIO(trst_gpio, trst_gpio_mode); + } + + if (transport_is_swd()) { + SET_MODE_GPIO(swclk_gpio, swclk_gpio_mode); + SET_MODE_GPIO(swdio_gpio, swdio_gpio_mode); + } + if (srst_gpio != -1) SET_MODE_GPIO(srst_gpio, srst_gpio_mode); |