pikapython/package/PikaVSF/PikaVSF_GPIO.c

89 lines
2.4 KiB
C
Raw Normal View History

#include "pika_bsp.h"
2021-12-21 23:49:28 +08:00
#include "PikaObj.h"
#if VSF_HAL_USE_GPIO == ENABLED && GPIO_COUNT > 0
# define __PIKA_VSF_GPIO ENABLED
#endif
#if __PIKA_VSF_GPIO == ENABLED
static int __vsf_gpio_pin_get(char *pin) {
2021-12-22 01:00:40 +08:00
char ch_port, ch_pin;
2021-12-21 23:49:28 +08:00
int hw_port = 0, hw_pin = 0;
2021-12-22 01:00:40 +08:00
ch_port = *pin++;
VSF_ASSERT(ch_port == 'P');
ch_port = *pin++;
if ((ch_port >= 'A') && (ch_port <= 'Z')) {
hw_port = ch_port - 'A';
} else if ((ch_port >= '0') && (ch_port <= '9')) {
hw_port = ch_port - '0';
} else {
VSF_ASSERT(false);
}
if (*pin == '.') {
pin++;
}
while ((ch_pin = *pin++) != NULL) {
if (!((ch_pin >= '0') && (ch_pin <= '9'))) {
break;
}
hw_pin *= 10;
hw_pin += ch_pin - '0';
}
2021-12-21 23:49:28 +08:00
return vsf_hw_io_mapper_pin(hw_port, hw_pin);
}
#endif
void PikaVSF_GPIO_platformEnable(PikaObj *self) {
}
void PikaVSF_GPIO_platformDisable(PikaObj *self) {
}
void PikaVSF_GPIO_platformHigh(PikaObj *self) {
#if __PIKA_VSF_GPIO == ENABLED
char *pin = obj_getStr(self, "pin");
int pin_idx = __vsf_gpio_pin_get(pin);
vsf_io_mapper_set(&vsf_hw_io_mapper, pin_idx);
#else
vsf_trace_error("%s: platform has no gpio or gpio is disabled" VSF_TRACE_CFG_LINEEND);
#endif
}
void PikaVSF_GPIO_platformLow(PikaObj *self) {
#if __PIKA_VSF_GPIO == ENABLED
char *pin = obj_getStr(self, "pin");
int pin_idx = __vsf_gpio_pin_get(pin);
vsf_io_mapper_clear(&vsf_hw_io_mapper, pin_idx);
#else
vsf_trace_error("%s: platform has no gpio or gpio is disabled" VSF_TRACE_CFG_LINEEND);
#endif
}
void PikaVSF_GPIO_platformRead(PikaObj *self) {
#if __PIKA_VSF_GPIO == ENABLED
char *pin = obj_getStr(self, "pin");
int pin_idx = __vsf_gpio_pin_get(pin);
int pin_value = vsf_io_mapper_read(&vsf_hw_io_mapper, pin_idx);
obj_setInt(self, "readBuff", pin_value);
#else
vsf_trace_error("%s: platform has no gpio or gpio is disabled" VSF_TRACE_CFG_LINEEND);
#endif
}
void PikaVSF_GPIO_platformSetMode(PikaObj *self) {
#if __PIKA_VSF_GPIO == ENABLED
char *pin = obj_getStr(self, "pin");
char *mode = obj_getStr(self, "mode");
int pin_idx = __vsf_gpio_pin_get(pin);
if (strEqu(mode, "out")) {
vsf_io_mapper_set_output(&vsf_hw_io_mapper, pin_idx);
} else if (strEqu(mode, "in")) {
vsf_io_mapper_set_input(&vsf_hw_io_mapper, pin_idx);
}
#else
vsf_trace_error("%s: platform has no gpio or gpio is disabled" VSF_TRACE_CFG_LINEEND);
#endif
}