From 26a7a36a69154c07ab403b0572e869fd1d6270bf Mon Sep 17 00:00:00 2001 From: Yilin Sun Date: Mon, 29 May 2023 23:39:34 +0800 Subject: [PATCH] Added GPIO interface. Signed-off-by: Yilin Sun --- lib/mpyate/include/mpyate_host.h | 11 +++++ lib/mpyate/include/private/mpyate_regs.h | 18 +++++--- lib/mpyate/src/mpyate_host.c | 53 ++++++++++++++++++++++++ src/main.c | 28 +++++++++++++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/lib/mpyate/include/mpyate_host.h b/lib/mpyate/include/mpyate_host.h index e52893f..348e952 100644 --- a/lib/mpyate/include/mpyate_host.h +++ b/lib/mpyate/include/mpyate_host.h @@ -1,6 +1,7 @@ #ifndef MPYATE_HOST_H #define MPYATE_HOST_H +#include #include typedef enum { @@ -8,6 +9,13 @@ typedef enum { ATE_RET_FAIL, } ate_ret_t; +typedef enum { + ATE_GPIO_MODE_OUTPUT_PP, + ATE_GPIO_MODE_OUTPUT_OD, + ATE_GPIO_MODE_INPUT, + ATE_GPIO_MODE_AF, +} ate_gpio_mode_t; + typedef ate_ret_t (*ate_i2c_read_t)(void *handle, uint8_t *data, uint8_t len); typedef ate_ret_t (*ate_i2c_write_t)(void *handle, uint8_t *data, uint8_t len); @@ -23,5 +31,8 @@ typedef struct { } ate_t; ate_ret_t ate_init(ate_t *ate); +ate_ret_t ate_gpio_init(ate_t *ate, uint8_t pin, ate_gpio_mode_t mode); +ate_ret_t ate_gpio_read(ate_t *ate, uint8_t pin, bool *value); +ate_ret_t ate_gpio_write(ate_t *ate, uint8_t pin, bool value); #endif // MPYATE_HOST_H diff --git a/lib/mpyate/include/private/mpyate_regs.h b/lib/mpyate/include/private/mpyate_regs.h index d02f635..ba9deb2 100644 --- a/lib/mpyate/include/private/mpyate_regs.h +++ b/lib/mpyate/include/private/mpyate_regs.h @@ -1,11 +1,19 @@ #ifndef MPYATE_COMMANDS_H #define MPYATE_COMMANDS_H -#define ATE_REG_CTRL 0x00U -#define ATE_REG_VER 0xFEU -#define ATE_REG_ID 0xFFU +#define ATE_REG_CFG 0x00U -#define ATE_REG_CTRL_RST_Pos 15 -#define ATe_REG_CTRL_RST_Msk (1U << ATE_REG_CTRL_RST_Pos) +#define ATE_REG_GPIO_CFG 0x10U +#define ATE_REG_GPIO_DATA_OUT 0x11U +#define ATE_REG_GPIO_DATA_IN 0x92U + +#define ATE_REG_VER 0xFEU +#define ATE_REG_ID 0xFFU + +#define ATE_REG_CFG_RST_Pos 15 +#define ATe_REG_CFG_RST_Msk (1U << ATE_REG_CFG_RST_Pos) + +#define ATE_REG_GPIO_CFG_MODE_Pos 0 +#define ATE_REG_GPIO_CFG_MODE_Msk (3U << ATE_REG_GPIO_CFG_MODE_Pos) #endif // MPYATE_COMMANDS_H diff --git a/lib/mpyate/src/mpyate_host.c b/lib/mpyate/src/mpyate_host.c index 1d1af5d..6683f9e 100644 --- a/lib/mpyate/src/mpyate_host.c +++ b/lib/mpyate/src/mpyate_host.c @@ -26,6 +26,59 @@ ate_ret_t ate_init(ate_t *ate) { return ret; } +ate_ret_t ate_gpio_init(ate_t *ate, uint8_t pin, ate_gpio_mode_t mode) { + ate_ret_t ret = ATE_RET_SUCCESS; + + uint16_t pin_cfg; + ret = ate_read_register(ate, ATE_REG_GPIO_CFG, &pin_cfg); + if (ret != ATE_RET_SUCCESS) { + return ret; + } + + pin_cfg &= ~(ATE_REG_GPIO_CFG_MODE_Msk << (2 * pin)); + pin_cfg |= (mode << (2 * pin)); + + ret = ate_write_register(ate, ATE_REG_GPIO_CFG, pin_cfg); + return ret; +} + +ate_ret_t ate_gpio_read(ate_t *ate, uint8_t pin, bool *value) { + ate_ret_t ret = ATE_RET_SUCCESS; + + uint16_t pin_data; + ret = ate_read_register(ate, ATE_REG_GPIO_DATA_IN, &pin_data); + if (ret != ATE_RET_SUCCESS) { + return ret; + } + + if (pin_data & (1U << pin)) { + *value = true; + } else { + *value = false; + } + + return ret; +} + +ate_ret_t ate_gpio_write(ate_t *ate, uint8_t pin, bool value) { + ate_ret_t ret = ATE_RET_SUCCESS; + + uint16_t pin_data; + ret = ate_read_register(ate, ATE_REG_GPIO_DATA_IN, &pin_data); + if (ret != ATE_RET_SUCCESS) { + return ret; + } + + pin_data &= ~(1U << pin); + + if (value) { + pin_data |= (1U << pin); + } + + ret = ate_write_register(ate, ATE_REG_GPIO_DATA_OUT, pin_data); + return ret; +} + static ate_ret_t ate_read_id(ate_t *ate, uint16_t *id) { return ate_read_register(ate, ATE_REG_ID, id); } diff --git a/src/main.c b/src/main.c index 00523ad..ce47a60 100644 --- a/src/main.c +++ b/src/main.c @@ -31,6 +31,34 @@ int main(void) { printf("ATE initialized.\r\n"); + bool pin_value = false; + + if(ate_gpio_read(&s_ate, 0, &pin_value) != ATE_RET_SUCCESS) { + printf("Failed to read GPIO value\r\n"); + + goto dead_loop; + } + + if(ate_gpio_write(&s_ate, 0, 1) != ATE_RET_SUCCESS) { + printf("Failed to write pin.\r\n"); + + goto dead_loop; + } + + if(ate_gpio_init(&s_ate, 0, ATE_GPIO_MODE_OUTPUT_PP) != ATE_RET_SUCCESS) { + printf("Failed to config pin."); + + goto dead_loop; + } + + if(ate_gpio_read(&s_ate, 0, &pin_value) != ATE_RET_SUCCESS) { + printf("Failed to read GPIO value\r\n"); + + goto dead_loop; + } + + printf("GPIO value: %d\r\n", pin_value); + dead_loop: for (;;) {