/*! * \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 中断回调处理函数 */ }