Added GPIO interface.
continuous-integration/drone/push Build is passing Details

Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
Yilin Sun 2023-05-29 23:38:52 +08:00
parent ecb417abdc
commit c52e1a865a
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
13 changed files with 364 additions and 18 deletions

View File

@ -44,6 +44,8 @@ set(TARGET_SOURCES
"board/peripherals.c"
"board/pin_mux.c"
"src/app_i2c_if.c"
"src/app_gpio.c"
"src/app_periodic_tasks.c"
"src/app_reg_if.c"
"src/main.c"
)

View File

@ -28,6 +28,10 @@
<pin_label pin_num="30" pin_signal="PIO0_22" label="LED_R" identifier="LED_R"/>
<pin_label pin_num="31" pin_signal="PIO0_18" label="LED_G" identifier="LED_G"/>
<pin_label pin_num="32" pin_signal="PIO0_16/ACMP_I4/ADC_3" label="LED_B" identifier="LED_B"/>
<pin_label pin_num="16" pin_signal="PIO0_15/ADC_8" label="IO0" identifier="IO0"/>
<pin_label pin_num="8" pin_signal="PIO0_11/ADC_6/WKTCLKIN" label="IO1" identifier="IO1"/>
<pin_label pin_num="9" pin_signal="PIO0_10/ADC_7" label="IO2" identifier="IO2"/>
<pin_label pin_num="15" pin_signal="PIO0_20" label="IO3" identifier="IO3"/>
</pin_labels>
</pins_profile>
<functions_list>
@ -196,6 +200,43 @@
</pin>
</pins>
</function>
<function name="BOARD_InitIOPins">
<description>Configures pin routing and optionally pin electrical features.</description>
<options>
<callFromInitBoot>true</callFromInitBoot>
<coreID>core0</coreID>
<enableClock>true</enableClock>
</options>
<dependencies>
<dependency resourceType="SWComponent" resourceId="platform.drivers.common" description="Pins initialization requires the COMMON Driver in the project." problem_level="2" source="Pins:BOARD_InitIOPins">
<feature name="enabled" evaluation="equal" configuration="core0">
<data>true</data>
</feature>
</dependency>
</dependencies>
<pins>
<pin peripheral="GPIO" signal="PIO0, 15" pin_num="16" pin_signal="PIO0_15/ADC_8">
<pin_features>
<pin_feature name="mode" value="repeater"/>
</pin_features>
</pin>
<pin peripheral="GPIO" signal="PIO0, 11" pin_num="8" pin_signal="PIO0_11/ADC_6/WKTCLKIN">
<pin_features>
<pin_feature name="mode" value="repeater"/>
</pin_features>
</pin>
<pin peripheral="GPIO" signal="PIO0, 10" pin_num="9" pin_signal="PIO0_10/ADC_7">
<pin_features>
<pin_feature name="mode" value="repeater"/>
</pin_features>
</pin>
<pin peripheral="GPIO" signal="PIO0, 20" pin_num="15" pin_signal="PIO0_20">
<pin_features>
<pin_feature name="mode" value="repeater"/>
</pin_features>
</pin>
</pins>
</function>
</functions_list>
</pins>
<clocks name="Clocks" version="11.0" enabled="true" update_project_code="true">

View File

@ -16,6 +16,10 @@ pin_labels:
- {pin_num: '30', pin_signal: PIO0_22, label: LED_R, identifier: LED_R}
- {pin_num: '31', pin_signal: PIO0_18, label: LED_G, identifier: LED_G}
- {pin_num: '32', pin_signal: PIO0_16/ACMP_I4/ADC_3, label: LED_B, identifier: LED_B}
- {pin_num: '16', pin_signal: PIO0_15/ADC_8, label: IO0, identifier: IO0}
- {pin_num: '8', pin_signal: PIO0_11/ADC_6/WKTCLKIN, label: IO1, identifier: IO1}
- {pin_num: '9', pin_signal: PIO0_10/ADC_7, label: IO2, identifier: IO2}
- {pin_num: '15', pin_signal: PIO0_20, label: IO3, identifier: IO3}
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
*/
/* clang-format on */
@ -37,6 +41,7 @@ void BOARD_InitBootPins(void)
BOARD_InitADCPins();
BOARD_InitDACPins();
BOARD_InitI2CPins();
BOARD_InitIOPins();
}
/* clang-format off */
@ -257,6 +262,64 @@ void BOARD_InitI2CPins(void)
/* Disable clock for switch matrix. */
CLOCK_DisableClock(kCLOCK_Swm);
}
/* clang-format off */
/*
* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
BOARD_InitIOPins:
- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}
- pin_list:
- {pin_num: '16', peripheral: GPIO, signal: 'PIO0, 15', pin_signal: PIO0_15/ADC_8, mode: repeater}
- {pin_num: '8', peripheral: GPIO, signal: 'PIO0, 11', pin_signal: PIO0_11/ADC_6/WKTCLKIN, mode: repeater}
- {pin_num: '9', peripheral: GPIO, signal: 'PIO0, 10', pin_signal: PIO0_10/ADC_7, mode: repeater}
- {pin_num: '15', peripheral: GPIO, signal: 'PIO0, 20', pin_signal: PIO0_20, mode: repeater}
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
*/
/* clang-format on */
/* FUNCTION ************************************************************************************************************
*
* Function Name : BOARD_InitIOPins
* Description : Configures pin routing and optionally pin electrical features.
*
* END ****************************************************************************************************************/
/* Function assigned for the Cortex-M0P */
void BOARD_InitIOPins(void)
{
/* Enables clock for IOCON.: enable */
CLOCK_EnableClock(kCLOCK_Iocon);
IOCON->PIO[8] = ((IOCON->PIO[8] &
/* Mask bits to zero which are setting */
(~(IOCON_PIO_MODE_MASK)))
/* Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
| IOCON_PIO_MODE(PIO0_10_MODE_REPEATER));
IOCON->PIO[7] = ((IOCON->PIO[7] &
/* Mask bits to zero which are setting */
(~(IOCON_PIO_MODE_MASK)))
/* Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
| IOCON_PIO_MODE(PIO0_11_MODE_REPEATER));
IOCON->PIO[10] = ((IOCON->PIO[10] &
/* Mask bits to zero which are setting */
(~(IOCON_PIO_MODE_MASK)))
/* Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
| IOCON_PIO_MODE(PIO0_15_MODE_REPEATER));
IOCON->PIO[22] = ((IOCON->PIO[22] &
/* Mask bits to zero which are setting */
(~(IOCON_PIO_MODE_MASK)))
/* Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
| IOCON_PIO_MODE(PIO0_20_MODE_REPEATER));
/* Disable clock for switch matrix. */
CLOCK_DisableClock(kCLOCK_Swm);
}
/***********************************************************************************************************************
* EOF
**********************************************************************************************************************/

View File

@ -113,6 +113,69 @@ void BOARD_InitDACPins(void); /* Function assigned for the Cortex-M0P */
*/
void BOARD_InitI2CPins(void); /* Function assigned for the Cortex-M0P */
/*!
* @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
#define PIO0_10_MODE_REPEATER 0x03u
/*!
* @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
#define PIO0_11_MODE_REPEATER 0x03u
/*!
* @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
#define PIO0_15_MODE_REPEATER 0x03u
/*!
* @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Repeater. Repeater mode. */
#define PIO0_20_MODE_REPEATER 0x03u
/*! @name PIO0_15 (number 16), IO0
@{ */
/* Symbols to be used with GPIO driver */
#define BOARD_INITIOPINS_IO0_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
#define BOARD_INITIOPINS_IO0_GPIO_PIN_MASK (1U << 15U) /*!<@brief GPIO pin mask */
#define BOARD_INITIOPINS_IO0_PORT 0U /*!<@brief PORT device index: 0 */
#define BOARD_INITIOPINS_IO0_PIN 15U /*!<@brief PORT pin number */
#define BOARD_INITIOPINS_IO0_PIN_MASK (1U << 15U) /*!<@brief PORT pin mask */
/* @} */
/*! @name PIO0_11 (number 8), IO1
@{ */
/* Symbols to be used with GPIO driver */
#define BOARD_INITIOPINS_IO1_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
#define BOARD_INITIOPINS_IO1_GPIO_PIN_MASK (1U << 11U) /*!<@brief GPIO pin mask */
#define BOARD_INITIOPINS_IO1_PORT 0U /*!<@brief PORT device index: 0 */
#define BOARD_INITIOPINS_IO1_PIN 11U /*!<@brief PORT pin number */
#define BOARD_INITIOPINS_IO1_PIN_MASK (1U << 11U) /*!<@brief PORT pin mask */
/* @} */
/*! @name PIO0_10 (number 9), IO2
@{ */
/* Symbols to be used with GPIO driver */
#define BOARD_INITIOPINS_IO2_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
#define BOARD_INITIOPINS_IO2_GPIO_PIN_MASK (1U << 10U) /*!<@brief GPIO pin mask */
#define BOARD_INITIOPINS_IO2_PORT 0U /*!<@brief PORT device index: 0 */
#define BOARD_INITIOPINS_IO2_PIN 10U /*!<@brief PORT pin number */
#define BOARD_INITIOPINS_IO2_PIN_MASK (1U << 10U) /*!<@brief PORT pin mask */
/* @} */
/*! @name PIO0_20 (number 15), IO3
@{ */
/* Symbols to be used with GPIO driver */
#define BOARD_INITIOPINS_IO3_GPIO GPIO /*!<@brief GPIO peripheral base pointer */
#define BOARD_INITIOPINS_IO3_GPIO_PIN_MASK (1U << 20U) /*!<@brief GPIO pin mask */
#define BOARD_INITIOPINS_IO3_PORT 0U /*!<@brief PORT device index: 0 */
#define BOARD_INITIOPINS_IO3_PIN 20U /*!<@brief PORT pin number */
#define BOARD_INITIOPINS_IO3_PIN_MASK (1U << 20U) /*!<@brief PORT pin mask */
/* @} */
/*!
* @brief Configures pin routing and optionally pin electrical features.
*
*/
void BOARD_InitIOPins(void); /* Function assigned for the Cortex-M0P */
#if defined(__cplusplus)
}
#endif

7
include/app_gpio.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef APP_GPIO_H
#define APP_GPIO_H
void app_gpio_init(void);
void app_gpio_update(void);
#endif // APP_GPIO_H

25
include/app_led.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef APP_LED_H
#define APP_LED_H
#include "fsl_common_arm.h"
#include "pin_mux.h"
typedef enum {
APP_LED_RED = BOARD_INITLEDPINS_LED_R_PIN,
APP_LED_GREEN = BOARD_INITLEDPINS_LED_G_PIN,
APP_LED_BLUE = BOARD_INITLEDPINS_LED_B_PIN,
} app_led_t;
static inline void app_led_on(app_led_t led) {
GPIO->B[0][led] = 0U;
}
static inline void app_led_off(app_led_t led) {
GPIO->B[0][led] = 1U;
}
static inline void app_led_toggle(app_led_t led) {
GPIO->B[0][led] ^= 1U;
}
#endif // APP_LED_H

View File

@ -0,0 +1,6 @@
#ifndef APP_PERIODIC_TASKS_H
#define APP_PERIODIC_TASKS_H
void app_periodic_tasks_init(void);
#endif // APP_PERIODIC_TASKS_H

View File

@ -4,9 +4,18 @@
#include <stdbool.h>
#include <stdint.h>
#define APP_REG_CFG 0x00U
#define APP_REG_GPIO_CFG 0x10U
#define APP_REG_GPIO_DATA_OUT 0x11U
#define APP_REG_GPIO_DATA_IN 0x92U
#define APP_REG_IF_REG_ID 0xFFU
uint16_t app_reg_if_read(uint8_t reg);
void app_reg_if_write(uint8_t reg, uint16_t data, bool check_attr);
uint16_t app_reg_if_external_read(uint8_t reg);
void app_reg_if_external_write(uint8_t reg, uint16_t data);
uint16_t app_reg_if_internal_read(uint8_t reg);
void app_reg_if_internal_write(uint8_t reg, uint16_t data);
#endif // APP_REG_IF_H

75
src/app_gpio.c Normal file
View File

@ -0,0 +1,75 @@
/* Board */
#include "pin_mux.h"
/* SDK drivers */
#include "fsl_gpio.h"
/* App */
#include "app_gpio.h"
#include "app_reg_if.h"
#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,
};
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);
/* 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: AF
*/
app_reg_if_internal_write(APP_REG_GPIO_CFG, 0x00AAU);
app_reg_if_internal_write(APP_REG_GPIO_DATA_IN, 0x0000U);
app_reg_if_internal_write(APP_REG_GPIO_DATA_OUT, 0x0000U);
}
void app_gpio_update(void) {
uint16_t cfg = app_reg_if_internal_read(APP_REG_GPIO_CFG);
uint16_t out = app_reg_if_internal_read(APP_REG_GPIO_DATA_OUT);
uint16_t in = 0x0000U;
for (uint8_t i = 0; i < APP_GPIO_PIN_COUNT; i++) {
uint8_t mode = (cfg >> (2 * i)) & 0x03U;
if ((mode & 0x02U) == 0U) {
/* Output mode, either OD or PP */
GPIO->DIRSET[0] = s_app_gpio_mask_table[i];
GPIO->B[0][s_app_gpio_id_table[i]] = (out & (1 << i)) ? 1 : 0;
} else if((mode & 0x01U) == 0x00U) {
/* Input mode */
GPIO->DIRCLR[0] = s_app_gpio_mask_table[i];
} /* Don't touch: AF mode */
/* Update input register no matter what function the pin is, since this data is always available. */
in |= (GPIO->B[0][s_app_gpio_id_table[i]] << i);
}
app_reg_if_internal_write(APP_REG_GPIO_DATA_IN, in);
}

View File

@ -59,7 +59,6 @@ int app_i2c_if_init(void) {
}
void I2C0_IRQHandler(void) {
GPIO_PinWrite(BOARD_INITLEDPINS_LED_B_GPIO, BOARD_INITLEDPINS_LED_B_PORT, BOARD_INITLEDPINS_LED_B_PIN, 0U);
uint32_t flags = APP_I2C_INSTANCE->STAT;
/* Clear interrupt flags */
@ -90,7 +89,7 @@ void I2C0_IRQHandler(void) {
if (s_app_i2c_write_ptr < APP_I2C_READ_LEN) {
if (s_app_i2c_read_ptr == 0U) {
/* First read, read register to buffer */
uint16_t reg_data = app_reg_if_read(s_app_i2c_read_reg_addr);
uint16_t reg_data = app_reg_if_external_read(s_app_i2c_read_reg_addr);
s_app_i2c_read_buffer[0] = reg_data & 0xFFU;
s_app_i2c_read_buffer[1] = (reg_data >> 8U) & 0xFFU;
@ -103,7 +102,7 @@ void I2C0_IRQHandler(void) {
s_app_i2c_read_reg_addr++;
s_app_i2c_read_ptr = 0U;
uint16_t reg_data = app_reg_if_read(s_app_i2c_read_reg_addr);
uint16_t reg_data = app_reg_if_external_read(s_app_i2c_read_reg_addr);
s_app_i2c_read_buffer[0] = reg_data & 0xFFU;
s_app_i2c_read_buffer[1] = (reg_data >> 8U) & 0xFFU;
@ -121,6 +120,11 @@ void I2C0_IRQHandler(void) {
if (s_app_i2c_write_ptr == APP_I2C_WRITE_LEN) {
/* Complete write, write register. */
uint16_t reg_data = (s_app_i2c_write_buffer[2] << 8U) | s_app_i2c_write_buffer[1];
app_reg_if_external_write(s_app_i2c_write_buffer[0], reg_data);
} else if (s_app_i2c_write_ptr == 1) {
/* Select register to read */
s_app_i2c_read_reg_addr = s_app_i2c_write_buffer[0];

38
src/app_periodic_tasks.c Normal file
View File

@ -0,0 +1,38 @@
/* Board */
#include "clock_config.h"
/* SDK drivers */
#include "fsl_mrt.h"
/* App */
#include "app_gpio.h"
#include "app_periodic_tasks.h"
#define APP_PERIODIC_RATE 1000
void app_periodic_tasks_init(void) {
CLOCK_EnableClock(kCLOCK_Mrt);
mrt_config_t mrt_cfg = {
.enableMultiTask = false,
};
MRT_Init(MRT0, &mrt_cfg);
MRT_SetupChannelMode(MRT0, kMRT_Channel_0, kMRT_RepeatMode);
MRT_EnableInterrupts(MRT0, kMRT_Channel_0, kMRT_TimerInterruptEnable);
EnableIRQ(MRT0_IRQn);
NVIC_SetPriority(MRT0_IRQn, 2);
MRT_StartTimer(MRT0, kMRT_Channel_0, (CLOCK_GetCoreSysClkFreq() / APP_PERIODIC_RATE));
}
static void app_periodic_task(void) {
app_gpio_update();
}
void MRT0_IRQHandler(void) {
app_periodic_task();
MRT_ClearStatusFlags(MRT0, kMRT_Channel_0, kMRT_TimerInterruptFlag);
}

View File

@ -1,19 +1,25 @@
#include "app_reg_if.h"
#define APP_REG_IF_ATTR_RO (1U << 0U)
#define APP_REG_IF_FILE_SIZE 256
#define APP_REG_IF_RO_START 0x80U
uint16_t app_reg_if_read(uint8_t reg) {
switch (reg) {
case APP_REG_IF_REG_ID:
return 0xEACE;
default:
return 0x0000;
static uint16_t app_if_reg_file[APP_REG_IF_FILE_SIZE] = {
[APP_REG_IF_REG_ID] = 0xEACE,
};
uint16_t app_reg_if_external_read(uint8_t reg) {
return app_if_reg_file[reg];
}
void app_reg_if_external_write(uint8_t reg, uint16_t data) {
if (reg < APP_REG_IF_RO_START) {
app_if_reg_file[reg] = data;
}
}
void app_reg_if_write(uint8_t reg, uint16_t data, bool check_attr) {
switch (reg) {
default:
break;
}
uint16_t app_reg_if_internal_read(uint8_t reg) {
return app_if_reg_file[reg];
}
void app_reg_if_internal_write(uint8_t reg, uint16_t data) {
app_if_reg_file[reg] = data;
}

View File

@ -4,16 +4,23 @@
#include "pin_mux.h"
/* App */
#include "app_gpio.h"
#include "app_i2c_if.h"
#include "app_led.h"
#include "app_periodic_tasks.h"
int main(void) {
BOARD_InitBootPins();
BOARD_InitBootClocks();
app_gpio_init();
app_i2c_if_init();
/* Must be the last */
app_periodic_tasks_init();
for (;;) {
GPIO_PortToggle(BOARD_INITLEDPINS_LED_R_GPIO, BOARD_INITLEDPINS_LED_R_PORT, BOARD_INITLEDPINS_LED_R_PIN_MASK);
app_led_toggle(APP_LED_RED);
SDK_DelayAtLeastUs(500 * 1000, CLOCK_GetCoreSysClkFreq());
}
}