Skip to content

Commit

Permalink
[sw/lib] ⚠️ rework GPIO pin set function
Browse files Browse the repository at this point in the history
function is now used to SET and CLR a specific GPIO output pin
  • Loading branch information
stnolting committed Jun 6, 2024
1 parent 7952e75 commit 639e020
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 25 deletions.
5 changes: 2 additions & 3 deletions sw/lib/include/neorv32_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,11 @@ typedef volatile struct __attribute__((packed,aligned(4))) {
**************************************************************************/
/**@{*/
int neorv32_gpio_available(void);
void neorv32_gpio_pin_set(int pin);
void neorv32_gpio_pin_clr(int pin);
void neorv32_gpio_pin_set(int pin, int value);
void neorv32_gpio_pin_toggle(int pin);
uint32_t neorv32_gpio_pin_get(int pin);

void neorv32_gpio_port_set(uint64_t d);
void neorv32_gpio_port_toggle(uint64_t toggle);
uint64_t neorv32_gpio_port_get(void);
/**@}*/

Expand Down
54 changes: 32 additions & 22 deletions sw/lib/source/neorv32_gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,34 +39,27 @@ int neorv32_gpio_available(void) {
* Set single pin of GPIO's output port.
*
* @param[in] pin Output pin number to be set (0..63).
* @param[in] value Set pint high (1) or low (0).
**************************************************************************/
void neorv32_gpio_pin_set(int pin) {
void neorv32_gpio_pin_set(int pin, int value) {

uint32_t mask = (uint32_t)(1 << (pin & 0x1f));

if (pin < 32) {
NEORV32_GPIO->OUTPUT_LO |= mask;
if (value) {
NEORV32_GPIO->OUTPUT_LO |= mask;
}
else {
NEORV32_GPIO->OUTPUT_LO &= ~mask;
}
}
else {
NEORV32_GPIO->OUTPUT_HI |= mask;
}
}


/**********************************************************************//**
* Clear single pin of GPIO's output port.
*
* @param[in] pin Output pin number to be cleared (0..63).
**************************************************************************/
void neorv32_gpio_pin_clr(int pin) {

uint32_t mask = (uint32_t)(1 << (pin & 0x1f));

if (pin < 32) {
NEORV32_GPIO->OUTPUT_LO &= ~mask;
}
else {
NEORV32_GPIO->OUTPUT_HI &= ~mask;
if (value) {
NEORV32_GPIO->OUTPUT_HI |= mask;
}
else {
NEORV32_GPIO->OUTPUT_HI &= ~mask;
}
}
}

Expand Down Expand Up @@ -126,6 +119,24 @@ void neorv32_gpio_port_set(uint64_t port_data) {
}


/**********************************************************************//**
* Toggle bit in entire GPIO output port.
*
* @param[in] toggle Bit mask; set bits will toggle the according output port (64-bit).
**************************************************************************/
void neorv32_gpio_port_toggle(uint64_t toggle) {

union {
uint64_t uint64;
uint32_t uint32[sizeof(uint64_t)/sizeof(uint32_t)];
} data;

data.uint64 = toggle;
NEORV32_GPIO->OUTPUT_LO ^= data.uint32[0];
NEORV32_GPIO->OUTPUT_HI ^= data.uint32[1];
}


/**********************************************************************//**
* Get complete GPIO input port.
*
Expand All @@ -143,4 +154,3 @@ uint64_t neorv32_gpio_port_get(void) {

return data.uint64;
}

0 comments on commit 639e020

Please sign in to comment.