aboutsummaryrefslogtreecommitdiff
path: root/src/jtag/drivers/bcm2835gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/jtag/drivers/bcm2835gpio.c')
-rw-r--r--src/jtag/drivers/bcm2835gpio.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/jtag/drivers/bcm2835gpio.c b/src/jtag/drivers/bcm2835gpio.c
index 5af92c36..a2ba8e64 100644
--- a/src/jtag/drivers/bcm2835gpio.c
+++ b/src/jtag/drivers/bcm2835gpio.c
@@ -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);