hpw421初始版本
This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
/*!
|
||||
* \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 中断回调处理函数 */
|
||||
}
|
||||
Reference in New Issue
Block a user