drivers/bcm2835: Add support for SWDIO direction control pin 71/6371/5
authorMatthew Mets <matt@blinkinlabs.com>
Mon, 19 Jul 2021 23:28:05 +0000 (01:28 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 31 Jul 2021 09:07:38 +0000 (10:07 +0100)
Adds a new, optional configuration "bcm2835gpio_swdio_dir_num" to
the BCM2835 driver, to control the direction of an external buffer
driver IC in SWD mode. For example, this is needed to use a level-
shifting buffer, such as the SN74LVC2T45 used on the JTAG Hat

Change-Id: If5c146f310ecf8ceae85443b3670936467d2786d
Signed-off-by: Matthew Mets <matt@blinkinlabs.com>
Reviewed-on: http://openocd.zylin.com/6371
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Tested-by: jenkins
src/jtag/drivers/bcm2835gpio.c

index 40cb5aa0b6d4d9bf1cb31fd7c8ebd00e92a72894..6db4340e81f9d3c2c6126fc8cf832383405578b2 100644 (file)
@@ -86,6 +86,8 @@ static int swclk_gpio = -1;
 static int swclk_gpio_mode;
 static int swdio_gpio = -1;
 static int swdio_gpio_mode;
+static int swdio_dir_gpio = -1;
+static int swdio_dir_gpio_mode;
 
 /* Transition delay coefficients */
 static int speed_coeff = 113714;
@@ -149,10 +151,20 @@ static int bcm2835gpio_reset(int trst, int srst)
 
 static void bcm2835_swdio_drive(bool is_output)
 {
-       if (is_output)
-               OUT_GPIO(swdio_gpio);
-       else
-               INP_GPIO(swdio_gpio);
+       if (swdio_dir_gpio > 0) {
+               if (is_output) {
+                       GPIO_SET = 1 << swdio_dir_gpio;
+                       OUT_GPIO(swdio_gpio);
+               } else {
+                       INP_GPIO(swdio_gpio);
+                       GPIO_CLR = 1 << swdio_dir_gpio;
+               }
+       } else {
+               if (is_output)
+                       OUT_GPIO(swdio_gpio);
+               else
+                       INP_GPIO(swdio_gpio);
+       }
 }
 
 static int bcm2835_swdio_read(void)
@@ -295,6 +307,15 @@ COMMAND_HANDLER(bcm2835gpio_handle_swd_gpionum_swdio)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(bcm2835gpio_handle_swd_dir_gpionum_swdio)
+{
+       if (CMD_ARGC == 1)
+               COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], swdio_dir_gpio);
+
+       command_print(CMD, "BCM2835 num: swdio_dir = %d", swdio_dir_gpio);
+       return ERROR_OK;
+}
+
 COMMAND_HANDLER(bcm2835gpio_handle_speed_coeffs)
 {
        if (CMD_ARGC == 2) {
@@ -374,6 +395,13 @@ static const struct command_registration bcm2835gpio_command_handlers[] = {
                .help = "gpio number for swdio.",
                .usage = "[swdio]",
        },
+       {
+               .name = "bcm2835gpio_swdio_dir_num",
+               .handler = &bcm2835gpio_handle_swd_dir_gpionum_swdio,
+               .mode = COMMAND_CONFIG,
+               .help = "gpio number for swdio direction control pin (set=output mode, clear=input mode)",
+               .usage = "[swdio_dir]",
+       },
        {
                .name = "bcm2835gpio_srst_num",
                .handler = &bcm2835gpio_handle_jtag_gpionum_srst,
@@ -541,6 +569,12 @@ static int bcm2835gpio_init(void)
                OUT_GPIO(srst_gpio);
        }
 
+       if (swdio_dir_gpio != -1) {
+               swdio_dir_gpio_mode = MODE_GPIO(swdio_dir_gpio);
+               GPIO_SET = 1 << swdio_dir_gpio;
+               OUT_GPIO(swdio_dir_gpio);
+       }
+
        LOG_DEBUG("saved pinmux settings: tck %d tms %d tdi %d "
                  "tdo %d trst %d srst %d", tck_gpio_mode, tms_gpio_mode,
                  tdi_gpio_mode, tdo_gpio_mode, trst_gpio_mode, srst_gpio_mode);
@@ -567,5 +601,8 @@ static int bcm2835gpio_quit(void)
        if (srst_gpio != -1)
                SET_MODE_GPIO(srst_gpio, srst_gpio_mode);
 
+       if (swdio_dir_gpio != -1)
+               SET_MODE_GPIO(swdio_dir_gpio, swdio_dir_gpio_mode);
+
        return ERROR_OK;
 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)