generated from Embedded_Projects/MPyATE_Template
Yilin Sun
626cfa4521
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: Yilin Sun <imi415@imi.moe>
166 lines
4.3 KiB
C
166 lines
4.3 KiB
C
/* Board */
|
|
#include "pin_mux.h"
|
|
|
|
/* SDK drivers */
|
|
#include "fsl_gpio.h"
|
|
#include "fsl_swm.h"
|
|
|
|
/* App */
|
|
#include "app_gpio.h"
|
|
#include "app_reg_if.h"
|
|
|
|
#define APP_GPIO_REG_OFFSET_CFG (0x00U)
|
|
#define APP_GPIO_REG_OFFSET_INPUT (0x01U)
|
|
#define APP_GPIO_REG_OFFSET_OUTPUT (0x02U)
|
|
|
|
#define APP_GPIO_PIN_COUNT 4
|
|
|
|
#define APP_GPIO_CFG_OUTPUT_PP 0
|
|
#define APP_GPIO_CFG_OUTPUT_OD 1
|
|
#define APP_GPIO_CFG_INPUT 2
|
|
#define APP_GPIO_CFG_AF 3
|
|
|
|
static const uint8_t s_app_gpio_id_table[APP_GPIO_PIN_COUNT] = {
|
|
BOARD_INITIOPINS_IO0_PIN,
|
|
BOARD_INITIOPINS_IO1_PIN,
|
|
BOARD_INITIOPINS_IO2_PIN,
|
|
BOARD_INITIOPINS_IO3_PIN,
|
|
};
|
|
|
|
static const uint32_t s_app_gpio_mask_table[APP_GPIO_PIN_COUNT] = {
|
|
BOARD_INITIOPINS_IO0_PIN_MASK,
|
|
BOARD_INITIOPINS_IO1_PIN_MASK,
|
|
BOARD_INITIOPINS_IO2_PIN_MASK,
|
|
BOARD_INITIOPINS_IO3_PIN_MASK,
|
|
};
|
|
|
|
static inline uint16_t app_gpio_read_reg_cfg(void);
|
|
static inline uint16_t app_gpio_read_reg_input(void);
|
|
static inline uint16_t app_gpio_read_reg_output(void);
|
|
static inline void app_gpio_write_reg_cfg(uint16_t data);
|
|
static inline void app_gpio_write_reg_output(uint16_t data);
|
|
|
|
void app_gpio_init(void) {
|
|
GPIO->DIRCLR[0] = (BOARD_INITIOPINS_IO0_PIN_MASK | BOARD_INITIOPINS_IO1_PIN_MASK | BOARD_INITIOPINS_IO2_PIN_MASK |
|
|
BOARD_INITIOPINS_IO3_PIN_MASK);
|
|
}
|
|
|
|
uint16_t app_gpio_module_reg_read(uint8_t addr) {
|
|
uint16_t ret = 0x5555U;
|
|
|
|
switch (addr) {
|
|
case APP_GPIO_REG_OFFSET_CFG:
|
|
ret = app_gpio_read_reg_cfg();
|
|
break;
|
|
case APP_GPIO_REG_OFFSET_INPUT:
|
|
ret = app_gpio_read_reg_input();
|
|
break;
|
|
case APP_GPIO_REG_OFFSET_OUTPUT:
|
|
ret = app_gpio_read_reg_output();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void app_gpio_module_reg_write(uint8_t addr, uint16_t data) {
|
|
switch (addr) {
|
|
case APP_GPIO_REG_OFFSET_CFG:
|
|
app_gpio_write_reg_cfg(data);
|
|
break;
|
|
case APP_GPIO_REG_OFFSET_OUTPUT:
|
|
app_gpio_write_reg_output(data);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static inline uint16_t app_gpio_read_reg_cfg(void) {
|
|
/* CFG register fields:
|
|
* GPIO0_CFG: [1:0]
|
|
* GPIO1_CFG: [3:2]
|
|
* GPIO2_CFG: [5:4]
|
|
* GPIO3_CFG: [7:6]
|
|
*
|
|
* Values:
|
|
* 2'b00: OUTPUT_PP
|
|
* 2'b01: OUTPUT_OD
|
|
* 2'b10: INPUT
|
|
* 2'b11: Undefined
|
|
*/
|
|
|
|
uint16_t ret = 0x0000U;
|
|
|
|
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
|
|
uint32_t dir = GPIO->DIR[0] & (1U << s_app_gpio_id_table[i]);
|
|
if (dir == 0UL) {
|
|
/* Input mode */
|
|
ret |= (2U << (2 * i));
|
|
} else {
|
|
/* Output mode */
|
|
if ((IOCON->PIO[s_app_gpio_id_table[i]] & IOCON_PIO_OD_MASK) == IOCON_PIO_OD(1)) {
|
|
/* OD mode */
|
|
ret |= (1U << (2 * i));
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline void app_gpio_write_reg_cfg(uint16_t data) {
|
|
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
|
|
if (data & (2U << (2 * i))) {
|
|
/* Input mode */
|
|
GPIO->DIRCLR[0] = (1U << s_app_gpio_id_table[i]);
|
|
} else {
|
|
/* Output mode */
|
|
GPIO->DIRSET[0] = (1U << s_app_gpio_id_table[i]);
|
|
|
|
if (data & (1U << (2 * i))) {
|
|
/* OD mode */
|
|
IOCON->PIO[s_app_gpio_id_table[i]] |= IOCON_PIO_OD(1);
|
|
} else {
|
|
/* PP mode */
|
|
IOCON->PIO[s_app_gpio_id_table[i]] &= ~(IOCON_PIO_OD(1));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static inline uint16_t app_gpio_read_reg_input(void) {
|
|
uint16_t ret = 0x0000U;
|
|
|
|
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
|
|
if (GPIO->B[s_app_gpio_id_table[i]]) {
|
|
ret |= (1U << i);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline uint16_t app_gpio_read_reg_output(void) {
|
|
uint16_t ret = 0x0000U;
|
|
|
|
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
|
|
if (GPIO->SET[0] & (1U << s_app_gpio_id_table[i])) {
|
|
ret |= (1U << i);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline void app_gpio_write_reg_output(uint16_t data) {
|
|
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
|
|
if (data & (1 << i)) {
|
|
GPIO->SET[0] = (1U << s_app_gpio_id_table[i]);
|
|
} else {
|
|
GPIO->CLR[0] = (1U << s_app_gpio_id_table[i]);
|
|
}
|
|
}
|
|
} |