313 lines
11 KiB
C
313 lines
11 KiB
C
/*!
|
||
* \file xc_drv_aotimer.c
|
||
*
|
||
* \brief Target xc aotimer driver implementation
|
||
*
|
||
* \copyright Revised BSD License, see section \ref LICENSE.
|
||
*
|
||
* \code
|
||
*
|
||
* _ __ _ ________ _
|
||
* | |/ /(_)___ / ____/ /_ (_)___
|
||
* | // / __ \/ / / __ \/ / __ \
|
||
* / |/ / / / / /___/ / / / / /_/ /
|
||
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
|
||
* /_/
|
||
* (C) 2022-2025 XinChip
|
||
*
|
||
* \endcode
|
||
*
|
||
* \author ( XinChip ) Alex-J
|
||
*
|
||
* \author ( XinChip )
|
||
*/
|
||
|
||
/*-----------------------------------------------------------------------------------
|
||
INCLUDE HEADE FILES
|
||
------------------------------------------------------------------------------------*/
|
||
#include "xc_drv_gpio.h"
|
||
|
||
/*------------------------------------------------------------------------------------
|
||
Local Variables
|
||
-------------------------------------------------------------------------------------*/
|
||
|
||
/*------------------------------------------------------------------------------------
|
||
Func Prototype
|
||
-------------------------------------------------------------------------------------*/
|
||
|
||
/*------------------------------------------------------------------------------------
|
||
Functions
|
||
-------------------------------------------------------------------------------------*/
|
||
|
||
|
||
/**
|
||
**************************************************************************************
|
||
* @brief xc_gpio_init
|
||
* @details Initializes the GPIO port based on structure parameters
|
||
* @param[in] init_cfg :This is the structure parameter that the GPIO initializes
|
||
* @param[out] void
|
||
* @retval void
|
||
* @other
|
||
GPIO_InitCfg.Mux = GPIO_Mux0;
|
||
GPIO_InitCfg.FunSel = GPIO_Dx;
|
||
GPIO_InitCfg.Pull = GPIO_NOPULL;
|
||
// Board Led1 Initialization
|
||
GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT;
|
||
GPIO_InitCfg.Int = NOT_INT;
|
||
GPIO_InitCfg.Pin = GPIO_0;
|
||
xc_gpio_init(&GPIO_InitCfg);
|
||
// Gpio NVIC Enable
|
||
//NVIC_EnableIRQ(GPIO_IRQn);
|
||
***************************************************************************************
|
||
*/
|
||
void xc_gpio_init(GPIO_InitCfg_t *init_cfg)
|
||
{
|
||
xc_gpio_mux_ctl(init_cfg->Pin, init_cfg->Mux);
|
||
xc_gpio_fun_sel(init_cfg->Pin, init_cfg->FunSel);
|
||
|
||
xc_gpio_direction_config(init_cfg->Pin, init_cfg->Dir);
|
||
xc_gpio_it_config(init_cfg->Pin, init_cfg->Int);
|
||
|
||
xc_gpio_pull_config(init_cfg->Pin, init_cfg->Pull);
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
**************************************************************************************
|
||
* @brief xc_gpio_init
|
||
* @details GPIO Function Selection
|
||
|
||
* @param[in] num : GPIO number (GPIO_0 -> GPIO_35)
|
||
* @param[in] mux : Function Selection
|
||
* @param[out] void
|
||
* @retval void
|
||
* @other
|
||
- GPIO0 : < mux=0 gpio_d[0] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO1 : < mux=0 gpio_d[1] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO2 : < mux=0 gpio_d[2] > < mux=1 test_pin[2] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO3 : < mux=0 gpio_d[3] > < mux=1 pwm_capture[0] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO4 : < mux=0 gpio_d[4] > < mux=1 pwm_brk[0] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO5 : < mux=0 gpio_d[5] > < mux=1 pwm_brk[1] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO6 : < mux=0 gpio_d[6] > < mux=1 pwm_brk[2] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO7 : < mux=0 gpio_d[7] > < mux=1 fmc_d[2] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO8 : < mux=0 gpio_d[8] > < mux=1 pwm_capture[1] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO9 : < mux=0 gpio_d[9] > < mux=1 pwm_capture[2] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO10: < mux=0 gpio_d[10] > < mux=1 fmc_d[3] > < mux=2 NA > < mux=3 NA >
|
||
- GPIO11: < mux=0 BOOT_CTL > < mux=1 NA > < mux=2 txen > < mux=3 NA >
|
||
- GPIO12: < mux=0 SWI的 SWCK > < mux=1 NA > < mux=2 rxen > < mux=3 NA >
|
||
- GPIO13: < mux=0 SWI的 SWD > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO14: < mux=0 gpio_d[14] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO15: < mux=0 gpio_d[15] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO16: < mux=0 gpio_d[16] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO17: < mux=0 gpio_d[17] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO18: < mux=0 gpio_d[18] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO19: < mux=0 gpio_d[19] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO20: < mux=0 gpio_d[20] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO21: < mux=0 gpio_d[21] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO22: < mux=0 gpio_d[22] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO23: < mux=0 gpio_d[23] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO24: < mux=0 gpio_d[24] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO25: < mux=0 gpio_d[25] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO27: < mux=0 gpio_d[27] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO28: < mux=0 gpio_d[28] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO29: < mux=0 gpio_d[29] > < mux=1 gpio_d[29] > < mux=1 NA > < mux=2 NA >
|
||
- GPIO30: < mux=0 gpio_d[30] > < mux=1 gpio_d[30] > < mux=1 NA > < mux=2 NA >
|
||
- GPIO31: < mux=0 gpio_d[31] > < mux=1 gpio_d[31] > < mux=1 NA > < mux=2 NA >
|
||
- GPIO32: < mux=0 gpio_d[32] > < mux=1 NA > < mux=2 NA > < mux=3 NA >
|
||
- GPIO33: < mux=0 gpio_d[33] > < mux=1 gpio_d[29] > < mux=1 NA > < mux=2 NA >
|
||
- GPIO34: < mux=0 gpio_d[34] > < mux=1 gpio_d[30] > < mux=1 NA > < mux=2 NA >
|
||
- GPIO35: < mux=0 gpio_d[35] > < mux=1 gpio_d[31] > < mux=1 NA > < mux=2 NA >
|
||
|
||
***************************************************************************************
|
||
*/
|
||
void xc_gpio_mux_ctl(uint8_t num, GPIO_MUX_TypeDef mux)
|
||
{
|
||
uint8_t reg_idx = num >> 4UL;
|
||
uint8_t pin_idx = num & 0xFUL;
|
||
|
||
uint32_t val;
|
||
|
||
if (mux > 3)
|
||
return;
|
||
if (num >= 35)
|
||
return;
|
||
|
||
if (reg_idx == 0) {
|
||
val = cpr_ctl_muxctl1_get();
|
||
val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
|
||
cpr_ctl_muxctl1_set(val);
|
||
} else if (reg_idx == 1) {
|
||
val = cpr_ctl_muxctl2_get();
|
||
val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
|
||
cpr_ctl_muxctl2_set(val);
|
||
} else if (reg_idx == 2) {
|
||
val = cpr_ctl_muxctl3_get();
|
||
val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
|
||
cpr_ctl_muxctl3_set(val);
|
||
}
|
||
}
|
||
|
||
void xc_gpio_fun_sel(uint8_t num, GPIO_FUN_SEL_TypeDef sel)
|
||
{
|
||
uint32_t val;
|
||
uint8_t reg_idx = num >> 2UL;
|
||
uint8_t pin_idx = num & 0x3UL;
|
||
|
||
if (num > 28)
|
||
return;
|
||
|
||
val = cpr_gpio_fun_sel_get(reg_idx);
|
||
|
||
val = (val & ~(0x1FUL << (pin_idx << 3UL))) | (sel << (pin_idx << 3UL));
|
||
|
||
cpr_gpio_fun_sel_set(reg_idx, val);
|
||
}
|
||
|
||
void xc_gpio_pull_config(uint8_t num, GPIO_PULL_TypeDef pull)
|
||
{
|
||
uint8_t reg_idx;
|
||
uint8_t pin_idx;
|
||
uint32_t val;
|
||
|
||
reg_idx = num >> 4UL;
|
||
pin_idx = num & 0xFUL;
|
||
|
||
if (num >= 32) {
|
||
pin_idx += 2;
|
||
}
|
||
|
||
if (GPIO_PULLUP == pull) {
|
||
if (reg_idx == 0) {
|
||
val = cprao_aon_pectrl1_get();
|
||
SET_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl1_set(val);
|
||
} else if (reg_idx == 1) {
|
||
|
||
val = cprao_aon_pectrl2_get();
|
||
SET_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl2_set(val);
|
||
} else if (reg_idx == 2) {
|
||
|
||
val = cprao_aon_puctrl1_get();
|
||
SET_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_puctrl1_set(val);
|
||
}
|
||
} else if (GPIO_PULLDOWN == pull) {
|
||
if (reg_idx == 0) {
|
||
val = cprao_aon_pectrl1_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
SET_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl1_set(val);
|
||
} else if (reg_idx == 1) {
|
||
|
||
val = cprao_aon_pectrl2_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
SET_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl2_set(val);
|
||
} else if (reg_idx == 2) {
|
||
|
||
val = cprao_aon_puctrl1_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
SET_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_puctrl1_set(val);
|
||
}
|
||
} else if (GPIO_NOPULL == pull) {
|
||
if (reg_idx == 0) {
|
||
val = cprao_aon_pectrl1_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl1_set(val);
|
||
} else if (reg_idx == 1) {
|
||
|
||
val = cprao_aon_pectrl2_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_pectrl2_set(val);
|
||
} else if (reg_idx == 2) {
|
||
|
||
val = cprao_aon_puctrl1_get();
|
||
CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
|
||
CLEAR_BIT(val, 1 << (pin_idx << 1));
|
||
cprao_aon_puctrl1_set(val);
|
||
}
|
||
}
|
||
}
|
||
|
||
void xc_gpio_it_config(uint8_t num, GPIO_INT_TypeDef inter)
|
||
{
|
||
uint32_t val;
|
||
uint8_t reg_idx = num >> 2UL;
|
||
uint8_t pin_idx = num & 0x3UL;
|
||
|
||
val = gpio_intr_ctrl_get(reg_idx);
|
||
val = (val & ~(0xF0000UL) & ~(0xFUL << (pin_idx << 2UL))) |
|
||
(inter << (pin_idx << 2UL)) | ((0x01UL << pin_idx) << 16UL);
|
||
gpio_intr_ctrl_set(reg_idx, val);
|
||
}
|
||
|
||
void xc_gpio_direction_config(uint8_t num, GPIO_DIR_TypeDef direction)
|
||
{
|
||
uint8_t reg_idx = num >> 4UL;
|
||
uint8_t pin_idx = num & 0xFUL;
|
||
uint32_t val;
|
||
|
||
val = (direction << pin_idx) | (1 << 16 << pin_idx);
|
||
|
||
gpio_port_ddr_set(reg_idx, val);
|
||
}
|
||
|
||
uint32_t xc_gpio_read_pin(uint8_t num)
|
||
{
|
||
uint8_t reg_idx = num >> 5UL;
|
||
uint8_t pin_idx = num & 0x1FUL;
|
||
|
||
uint32_t value = gpio_ext_port_get(reg_idx);
|
||
|
||
return (value & (0x01UL << pin_idx)) ? (1) : (0);
|
||
}
|
||
|
||
void xc_gpio_write_pin(uint8_t num, GPIO_PinState pin_state)
|
||
{
|
||
uint8_t reg_idx = num >> 4UL;
|
||
uint8_t pin_idx = num & 0xFUL;
|
||
|
||
gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | pin_state) << pin_idx);
|
||
}
|
||
|
||
void xc_gpio_toggle_pin(uint8_t num)
|
||
{
|
||
uint8_t reg_idx = num >> 4UL;
|
||
uint8_t pin_idx = num & 0xFUL;
|
||
|
||
if ((gpio_port_dr_get(reg_idx) & (1 << pin_idx)) != GPIO_PIN_RESET) {
|
||
gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | GPIO_PIN_RESET) << pin_idx);
|
||
} else {
|
||
gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | GPIO_PIN_SET) << pin_idx);
|
||
}
|
||
}
|
||
|
||
void GPIO_Handler(void)
|
||
{
|
||
uint64_t intr_sta;
|
||
uint64_t val;
|
||
|
||
intr_sta = gpio_intr_status_c_get(0);
|
||
val = intr_sta;
|
||
gpio_intr_clr_set(0, (uint32_t)intr_sta);
|
||
|
||
intr_sta = gpio_intr_status_c_get(1);
|
||
val |= intr_sta << 32;
|
||
gpio_intr_clr_set(1, (uint32_t)intr_sta);
|
||
|
||
gpio_intr_callback(val);
|
||
}
|
||
|
||
__WEAK void gpio_intr_callback(uint64_t intr_sta)
|
||
{
|
||
/* Gpio 中断回调处理函数 */
|
||
}
|