Skip to content
Snippets Groups Projects
Commit bdcbbfc3 authored by trilader's avatar trilader
Browse files

feat(epicardium): Add (wristband) GPIO module

parent af4587a9
Branches
No related tags found
No related merge requests found
......@@ -90,6 +90,11 @@ typedef _Bool bool;
#define API_LIGHT_SENSOR_STOP 0x82
#define API_BUTTONS_READ 0x90
#define API_GPIO_SET_PIN_MODE 0xA0
#define API_GPIO_GET_PIN_MODE 0xA1
#define API_GPIO_WRITE_PIN 0xA2
#define API_GPIO_READ_PIN 0xA3
/* clang-format on */
typedef uint32_t api_int_id_t;
......@@ -338,6 +343,29 @@ enum epic_button {
*/
API(API_BUTTONS_READ, uint8_t epic_buttons_read(uint8_t mask));
/**
* Wristband GPIO
*/
enum gpio_button {
GPIO_WRISTBAND_1 = 1,
GPIO_WRISTBAND_2 = 2,
GPIO_WRISTBAND_3 = 3,
GPIO_WRISTBAND_4 = 4,
};
enum gpio_mode {
GPIO_MODE_IN = (1<<0),
GPIO_MODE_OUT = (1<<1),
GPIO_PULL_UP = (1<<6),
GPIO_PULL_DOWN = (1<<7),
};
API(API_GPIO_SET_PIN_MODE, void epic_gpio_set_pin_mode(uint8_t pin, uint8_t mode));
API(API_GPIO_GET_PIN_MODE, uint8_t epic_gpio_get_pin_mode(uint8_t pin));
API(API_GPIO_WRITE_PIN, void epic_gpio_write_pin(uint8_t pin, bool on));
API(API_GPIO_READ_PIN, uint32_t epic_gpio_read_pin(uint8_t pin));
/**
* LEDs
* ====
......
#include "epicardium.h"
#include "gpio.h"
#include "max32665.h"
/*
* Despite what the schematic (currently, 2019-08-18) says these are the correct
* pins for wristband GPIO 1-4 (not 0-3 as the schematic states)
*/
static gpio_cfg_t gpio_configs[] = {
[GPIO_WRISTBAND_1] = { PORT_0, PIN_21, GPIO_FUNC_OUT, GPIO_PAD_NONE },
[GPIO_WRISTBAND_2] = { PORT_0, PIN_22, GPIO_FUNC_OUT, GPIO_PAD_NONE },
[GPIO_WRISTBAND_3] = { PORT_0, PIN_29, GPIO_FUNC_OUT, GPIO_PAD_NONE },
[GPIO_WRISTBAND_4] = { PORT_0, PIN_20, GPIO_FUNC_OUT, GPIO_PAD_NONE },
};
void epic_gpio_set_pin_mode(uint8_t pin, uint8_t mode)
{
if (pin < GPIO_WRISTBAND_1 || pin > GPIO_WRISTBAND_4)
return;
gpio_cfg_t *cfg = &gpio_configs[pin];
uint32_t func_value = 0;
if (mode & GPIO_MODE_IN)
func_value |= GPIO_FUNC_IN;
if (mode & GPIO_MODE_OUT)
func_value |= GPIO_FUNC_OUT;
uint32_t pad_value = 0;
if (mode & GPIO_PULL_UP)
pad_value |= GPIO_PAD_PULL_UP;
if (mode & GPIO_PULL_DOWN)
pad_value |= GPIO_PAD_PULL_DOWN;
cfg->func = func_value;
cfg->pad = pad_value;
GPIO_Config(cfg);
}
uint8_t epic_gpio_get_pin_mode(uint8_t pin)
{
if (pin < GPIO_WRISTBAND_1 || pin > GPIO_WRISTBAND_4)
return 0;
gpio_cfg_t *cfg = &gpio_configs[pin];
uint8_t res = 0;
if ((cfg->func & GPIO_FUNC_IN) == GPIO_FUNC_IN)
res |= GPIO_MODE_IN;
if ((cfg->func & GPIO_FUNC_OUT) == GPIO_FUNC_OUT)
res |= GPIO_MODE_OUT;
if ((cfg->pad & GPIO_PAD_PULL_UP) == GPIO_PAD_PULL_UP)
res |= GPIO_PULL_UP;
if ((cfg->pad & GPIO_PAD_PULL_DOWN) == GPIO_PAD_PULL_DOWN)
res |= GPIO_PULL_DOWN;
return res;
}
void epic_gpio_write_pin(uint8_t pin, bool on)
{
if (pin < GPIO_WRISTBAND_1 || pin > GPIO_WRISTBAND_4)
return;
gpio_cfg_t *cfg = &gpio_configs[pin];
if (on)
GPIO_OutSet(cfg);
else
GPIO_OutClr(cfg);
}
uint32_t epic_gpio_read_pin(uint8_t pin)
{
if (pin < GPIO_WRISTBAND_1 || pin > GPIO_WRISTBAND_4)
return 0U;
gpio_cfg_t *cfg = &gpio_configs[pin];
if ((cfg->func & GPIO_FUNC_OUT) == GPIO_FUNC_OUT) {
return GPIO_OutGet(cfg);
} else if ((cfg->func & GPIO_FUNC_IN) == GPIO_FUNC_IN) {
return GPIO_InGet(cfg);
} else {
return -1;
}
}
......@@ -3,6 +3,7 @@ module_sources = files(
'dispatcher.c',
'display.c',
'fileops.c',
'gpio.c',
'hardware.c',
'leds.c',
'lifecycle.c',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment