Flute_Hello_World/src/drivers/xilinx_gpio.c

57 lines
1.4 KiB
C

#include "drivers/xilinx_gpio.h"
sys_ret_t xilinx_gpio_init(xilinx_gpio_handle_t *handle) {
handle->instance->TRI = 0xFFFFFFFF;
return RET_OK;
}
sys_ret_t xilinx_gpio_pinmode(xilinx_gpio_handle_t *handle, uint32_t pin, uint8_t output) {
if(output) {
handle->instance->TRI &= ~(1U << pin);
}
else {
handle->instance->TRI |= (1U << pin);
}
return RET_OK;
}
sys_ret_t xilinx_gpio_write(xilinx_gpio_handle_t *handle, uint32_t pin, uint8_t value) {
if(value) {
handle->instance->DATA |= (1U << pin);
}
else {
handle->instance->DATA &= ~(1U << pin);
}
return RET_OK;
}
uint8_t xilinx_gpio_read(xilinx_gpio_handle_t *handle, uint32_t pin) {
return (handle->instance->DATA & (1U << pin)) ? 1 : 0;
}
sys_ret_t xilinx_gpio_toggle(xilinx_gpio_handle_t *handle, uint32_t pin) {
handle->instance->DATA ^= (1U << pin);
return RET_OK;
}
sys_ret_t xilinx_gpio_port_mode(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t output_mask) {
if(bank == 0) {
handle->instance->TRI = ~output_mask;
}
else {
handle->instance->TRI2 = ~output_mask;
}
return RET_OK;
}
sys_ret_t xilinx_gpio_port_write(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t value) {
if(bank == 0) {
handle->instance->DATA = value;
}
else {
handle->instance->DATA2 = value;
}
return RET_OK;
}