MPyATE_Firmware/src/app_sys_utils.c

144 lines
3.7 KiB
C

/* App */
#include "app_led.h"
#include "app_reg_if.h"
/* Private */
#include "app_sys_utils.h"
#define APP_SYS_REG_OFFSET_CFG (0x00U)
#define APP_SYS_REG_OFFSET_AUX (0x01U)
#define APP_SYS_REG_OFFSET_VER (0x0EU)
#define APP_SYS_REG_OFFSET_ID (0x0FU)
#define APP_SYS_CONST_ID (0xEACEU)
#define APP_SYS_CONST_VER (0x0000U)
#define APP_SYS_CFG_GPIO0_FUNC_Pos (0U)
#define APP_SYS_CFG_GPIO0_FUNC_Msk (3U << APP_SYS_CFG_GPIO0_FUNC_Pos)
#define APP_SYS_CFG_GPIO1_FUNC_Pos (2U)
#define APP_SYS_CFG_GPIO1_FUNC_Msk (3U << APP_SYS_CFG_GPIO1_FUNC_Pos)
#define APP_SYS_CFG_GPIO2_FUNC_Pos (4U)
#define APP_SYS_CFG_GPIO2_FUNC_Msk (3U << APP_SYS_CFG_GPIO2_FUNC_Pos)
#define APP_SYS_CFG_GPIO3_FUNC_Pos (6U)
#define APP_SYS_CFG_GPIO3_FUNC_Msk (3U << APP_SYS_CFG_GPIO3_FUNC_Pos)
#define APP_SYS_CFG_RST_Pos (15U)
#define APP_SYS_CFG_RST_Msk (1U << APP_SYS_CFG_RST_Pos)
#define APP_SYS_AUX_LED_R_Pos (0U)
#define APP_SYS_AUX_LED_R_Msk (1U << APP_SYS_AUX_LED_R_Pos)
#define APP_SYS_AUX_LED_G_Pos (1U)
#define APP_SYS_AUX_LED_G_Msk (1U << APP_SYS_AUX_LED_G_Pos)
#define APP_SYS_AUX_LED_B_Pos (2U)
#define APP_SYS_AUX_LED_B_Msk (1U << APP_SYS_AUX_LED_B_Pos)
static inline uint16_t app_sys_utils_read_reg_cfg(void);
static inline uint16_t app_sys_utils_read_reg_aux(void);
static inline uint16_t app_sys_utils_read_reg_ver(void);
static inline uint16_t app_sys_utils_read_reg_id(void);
static inline void app_sys_utils_write_reg_cfg(uint16_t data);
static inline void app_sys_utils_write_reg_aux(uint16_t data);
void app_sys_utils_init(void) {
app_led_off(APP_LED_RED);
app_led_off(APP_LED_GREEN);
app_led_off(APP_LED_BLUE);
}
uint16_t app_sys_utils_module_reg_read(uint8_t addr) {
uint16_t ret = 0x5555;
switch (addr) {
case APP_SYS_REG_OFFSET_CFG:
ret = app_sys_utils_read_reg_cfg();
break;
case APP_SYS_REG_OFFSET_AUX:
ret = app_sys_utils_read_reg_aux();
break;
case APP_SYS_REG_OFFSET_VER:
ret = app_sys_utils_read_reg_ver();
break;
case APP_SYS_REG_OFFSET_ID:
ret = app_sys_utils_read_reg_id();
break;
default:
break;
}
return ret;
}
void app_sys_utils_module_reg_write(uint8_t addr, uint16_t data) {
switch (addr) {
case APP_SYS_REG_OFFSET_CFG:
app_sys_utils_write_reg_cfg(data);
break;
case APP_SYS_REG_OFFSET_AUX:
app_sys_utils_write_reg_aux(data);
break;
default:
break;
}
}
static inline uint16_t app_sys_utils_read_reg_cfg(void) {
return 0x0000U;
}
static inline uint16_t app_sys_utils_read_reg_aux(void) {
uint16_t ret = 0x0000U;
if (app_led_status(APP_LED_RED)) {
ret |= APP_SYS_AUX_LED_R_Msk;
}
if (app_led_status(APP_LED_GREEN)) {
ret |= APP_SYS_AUX_LED_G_Msk;
}
if (app_led_status(APP_LED_BLUE)) {
ret |= APP_SYS_AUX_LED_B_Msk;
}
return ret;
}
static inline uint16_t app_sys_utils_read_reg_ver(void) {
return APP_SYS_CONST_VER;
}
static inline uint16_t app_sys_utils_read_reg_id(void) {
return APP_SYS_CONST_ID;
}
static inline void app_sys_utils_write_reg_cfg(uint16_t data) {
if (data & APP_SYS_CFG_RST_Msk) {
NVIC_SystemReset();
}
}
static inline void app_sys_utils_write_reg_aux(uint16_t data) {
if (data & APP_SYS_AUX_LED_R_Msk) {
app_led_on(APP_LED_RED);
} else {
app_led_off(APP_LED_RED);
}
if (data & APP_SYS_AUX_LED_G_Msk) {
app_led_on(APP_LED_GREEN);
} else {
app_led_off(APP_LED_GREEN);
}
if (data & APP_SYS_AUX_LED_B_Msk) {
app_led_on(APP_LED_BLUE);
} else {
app_led_off(APP_LED_BLUE);
}
}