Files
hpw421/component/xc6xx_drivers/Drivers/xc_driver/xc_drv_gpio.c
T
2026-07-03 18:08:25 +08:00

315 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!
* \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"
#if XC_CHECK(XC_GPIO_ENABLED)
/*------------------------------------------------------------------------------------
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 中断回调处理函数 */
}
#endif // XC_CHECK(XC_GPIO_ENABLED)