bcm2835gpio: use maximum drive strength 33/1633/4
authorPaul Fertser <fercerpav@gmail.com>
Wed, 18 Sep 2013 19:42:50 +0000 (23:42 +0400)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 15 Oct 2013 20:38:21 +0000 (20:38 +0000)
According to the docs, the default drive strength for the GPIO pads is
8mA but they're capable of 16mA. Configure GPIO 0-27 to use the maximum
(as they might be used on high enough frequency with JTAG).

Change-Id: I621737a1b0a855bb97b56ce2cc46c0e385b74f5d
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/1633
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/jtag/drivers/bcm2835gpio.c

index 5af92c3..a2ba8e6 100644 (file)
@@ -33,6 +33,9 @@
 #define BCM2835_PERI_BASE      0x20000000
 #define BCM2835_GPIO_BASE      (BCM2835_PERI_BASE + 0x200000) /* GPIO controller */
 
+#define BCM2835_PADS_GPIO_0_27         (BCM2835_PERI_BASE + 0x100000)
+#define BCM2835_PADS_GPIO_0_27_OFFSET  (0x2c / 4)
+
 /* GPIO setup macros */
 #define MODE_GPIO(g) (*(pio_base+((g)/10))>>(((g)%10)*3) & 7)
 #define INP_GPIO(g) do { *(pio_base+((g)/10)) &= ~(7<<(((g)%10)*3)); } while (0)
@@ -319,6 +322,19 @@ static int bcm2835gpio_init(void)
                return ERROR_JTAG_INIT_FAILED;
        }
 
+       static volatile uint32_t *pads_base;
+       pads_base = mmap(NULL, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE,
+                               MAP_SHARED, dev_mem_fd, BCM2835_PADS_GPIO_0_27);
+
+       if (pads_base == MAP_FAILED) {
+               perror("mmap");
+               close(dev_mem_fd);
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       /* set 16mA drive strength */
+       pads_base[BCM2835_PADS_GPIO_0_27_OFFSET] = 0x5a000018 + 7;
+
        tdo_gpio_mode = MODE_GPIO(tdo_gpio);
        tdi_gpio_mode = MODE_GPIO(tdi_gpio);
        tck_gpio_mode = MODE_GPIO(tck_gpio);