summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c18
-rw-r--r--c/src/lib/libbsp/arm/raspberrypi/include/rpi-gpio.h3
2 files changed, 11 insertions, 10 deletions
diff --git a/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c b/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
index 642666ab02..40acd84483 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
+++ b/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
@@ -52,15 +52,15 @@ static rtems_status_code rpi_select_pin_function(
uint32_t type
) {
/* Calculate the pin function select register address. */
- volatile unsigned int *pin_addr = (unsigned int *) BCM2835_GPIO_REGS_BASE +
- (pin / 10);
-
- if ( type == RPI_DIGITAL_IN ) {
- *(pin_addr) &= ~SELECT_PIN_FUNCTION(RPI_DIGITAL_IN, pin);
- }
- else {
- *(pin_addr) |= SELECT_PIN_FUNCTION(type, pin);
- }
+ volatile uint32_t *pin_addr = (uint32_t *) BCM2835_GPIO_REGS_BASE +
+ (pin / 10);
+ uint32_t reg_old;
+ uint32_t reg_new;
+
+ reg_new = reg_old = *pin_addr;
+ reg_new &= ~SELECT_PIN_FUNCTION(RPI_ALT_FUNC_MASK, pin);
+ reg_new |= SELECT_PIN_FUNCTION(type, pin);
+ *pin_addr = reg_new;
return RTEMS_SUCCESSFUL;
}
diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/rpi-gpio.h b/c/src/lib/libbsp/arm/raspberrypi/include/rpi-gpio.h
index 7f4d802b0f..82ba4b1f2a 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/include/rpi-gpio.h
+++ b/c/src/lib/libbsp/arm/raspberrypi/include/rpi-gpio.h
@@ -26,7 +26,7 @@ extern "C" {
/**
* @brief Raspberry Pi GPIO functions.
*/
-#define RPI_DIGITAL_IN 7
+#define RPI_DIGITAL_IN 0
#define RPI_DIGITAL_OUT 1
#define RPI_ALT_FUNC_0 4
#define RPI_ALT_FUNC_1 5
@@ -34,6 +34,7 @@ extern "C" {
#define RPI_ALT_FUNC_3 7
#define RPI_ALT_FUNC_4 3
#define RPI_ALT_FUNC_5 2
+#define RPI_ALT_FUNC_MASK 7
/**
* @brief Setups a JTAG interface.