Files
hpw421/component/boot2/bsp/bsp_gpio.c
2026-07-03 18:08:25 +08:00

339 lines
11 KiB
C

/*----------------------------------------------------------------------------------------------------
INCLUDE HEADE FILES
----------------------------------------------------------------------------------------------------*/
#include "Includes.h"
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern void Init_gpio(void)
{
__write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL, 0x40004); /*gpio_pclk enable*/
__write_hw_reg32(CPR_OTHERCLKEN_GRCTL, 0x10001); /*gpio_clk enable*/
// NVIC_EnableIRQ(GPIO_IRQn);
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips:
- GPIO0 : 【mux=0 连接到gpio_d[0] 】 【mux=1 kbs_mko_0】 【mux=2 pwm2】 【mux=3 NA】
- GPIO1 : 【mux=0 连接到gpio_d[1] 】 【mux=1 kbs_mko_1】 【mux=2 pwm3】 【mux=3 NA】
- GPIO2 : 【mux=0 连接到gpio_d[2] 】 【mux=1 kbs_mko_2】 【mux=2 clk_12M_out】【mux=3 NA】
- GPIO3 : 【mux=0 连接到gpio_d[3] 】 【mux=1 kbs_mko_3】 【mux=2 NA】 【mux=3 NA】
- GPIO4 : 【mux=0 连接到gpio_d[4] 】 【mux=1 kbs_mko_4】 【mux=2 NA】 【mux=3 NA】
- GPIO5 : 【mux=0 连接到gpio_d[5] 】 【mux=1 kbs_mko_5】 【mux=2 NA】 【mux=3 NA】
- GPIO6 : 【mux=0 连接到gpio_d[6] 】 【mux=1 kbs_mko_6】 【mux=2 txen】 【mux=3 NA】
- GPIO7 : 【mux=0 连接到gpio_d[7] 】 【mux=1 kbs_mko_7】 【mux=2 rxen】 【mux=3 NA】
- GPIO8 : 【mux=0 连接到gpio_d[8] 】 【mux=1 kbs_mki_0】 【mux=2 NA】 【mux=3 NA】
- GPIO9 : 【mux=0 连接到gpio_d[9] 】 【mux=1 kbs_mki_1】 【mux=2 NA】 【mux=3 NA】
- GPIO10: 【mux=0 连接到gpio_d[10]】 【mux=1 kbs_mki_8】 【mux=2 NA】 【mux=3 NA】
- GPIO11: 【mux=0 连接到BOOT_CTL0 】 【mux=1 连接到gpio_d[11]】 【mux=2 NA】 【mux=3 NA】
- GPIO12: 【mux=0 连接到SWI的 SWCK】 【mux=1 连接到gpio_d[12]】 【mux=2 NA】 【mux=3 pwm4】
- GPIO13: 【mux=0 连接到SWI的 SWD 】 【mux=1 连接到gpio_d[13]】 【mux=2 NA】 【mux=3 pwm5】
- GPIO14: 【mux=0 连接到gpio_d[14]】 【mux=1 kbs_mki_9】 【mux=2 SPI2_CLK】 【mux=3 NA】
- GPIO15: 【mux=0 连接到gpio_d[15]】 【mux=1 kbs_mki_10】 【mux=2 SPI2_CS】 【mux=3 NA】
- GPIO16: 【mux=0 连接到gpio_d[16]】 【mux=1 kbs_mki_11】 【mux=2 SPI2_RX】 【mux=3 NA】
- GPIO17: 【mux=0 连接到gpio_d[17]】 【mux=1 kbs_mki_12】 【mux=2 SPI2_TX】 【mux=3 NA】
- GPIO18: 【mux=0 连接到gpio_d[18]】 【mux=1 kbs_mki_16】 【mux=2 NA】 【mux=3 NA】
- GPIO19: 【mux=0 连接到gpio_d[19]】 【mux=1 kbs_mki_17】 【mux=2 NA】 【mux=3 NA】
- GPIO20: 【mux=0 连接到gpio_d[20]】 【mux=1 kbs_mki_2】 【mux=2 NA】 【mux=3 NA】
- GPIO21: 【mux=0 连接到gpio_d[21]】 【mux=1 kbs_mki_3】 【mux=2 NA】 【mux=3 NA】
- GPIO22: 【mux=0 连接到gpio_d[22]】 【mux=1 kbs_mki_4】 【mux=2 ssi2_clk】 【mux=3 NA】
- GPIO23: 【mux=0 连接到gpio_d[23]】 【mux=1 kbs_mki_5】 【mux=2 ssi2_ssn】 【mux=3 NA】
- GPIO24: 【mux=0 连接到gpio_d[24]】 【mux=1 kbs_mki_6】 【mux=2 ssi2_d0 tx】 【mux=3 NA】
- GPIO25: 【mux=0 连接到gpio_d[25]】 【mux=1 kbs_mki_7】 【mux=2 ssi2_d1 rx】 【mux=3 NA】
- GPIO26: 【mux=0 连接到gpio_d[26]】 【mux=1 kbs_mki_13】 【mux=2 ssi2_d2】 【mux=3 NA】
- GPIO27: 【mux=0 连接到gpio_d[27]】 【mux=1 kbs_mki_14】 【mux=2 ssi2_d3】 【mux=3 NA】
- GPIO28: 【mux=0 连接到gpio_d[28]】 【mux=1 kbs_mki_15】 【mux=2 adcclk】 【mux=3 NA】
- GPIO29: 【mux=0 连接到gpio_d[29]】 【mux=1 kbs_mki_16】 【mux=2 adcdata】 【mux=3 NA】
- GPIO30: 【mux=0 连接到gpio_d[30]】 【mux=1 kbs_mki_17】 【mux=2 i2s_sclk】 【mux=3 NA】
- GPIO31: 【mux=0 连接到gpio_d[31]】 【mux=1 uart2_rx】 【mux=2 i2s_ws】 【mux=3 NA】
- GPIO32: 【mux=0 连接到gpio_d[27]】 【mux=1 uart2_tx】 【mux=2 i2s_din】 【mux=3 NA】
- GPIO33: 【mux=0 连接到gpio_d[28]】 【mux=1 NA】 【mux=2 i2s_dout】 【mux=3 NA】
- GPIO34: 【mux=0 连接到gpio_d[29]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
- GPIO35: 【mux=0 连接到gpio_d[30]】 【mux=1 NA】 【mux=2 BOOT_CTL1】 【mux=3 NA】
*/
extern void gpio_mux_ctl(uint8_t num, uint8_t mux) //(num:0-31 32-34)
{
if (mux > 3)
return;
uint32_t tv = 0;
if (num < 32)
{
__read_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), tv);
tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2));
__write_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), tv);
}
else
{
__read_hw_reg32(CPR_CTL_MUXCTL3, tv);
tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2));
__write_hw_reg32(CPR_CTL_MUXCTL3, tv);
}
}
extern void gpio_mux_ctl_u(uint8_t num, uint8_t mux) //(num:32-34)
{
if (mux > 3)
return;
uint32_t tv = 0;
__read_hw_reg32(CPR_CTL_MUXCTL3, tv);
tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2));
__write_hw_reg32(CPR_CTL_MUXCTL3, tv);
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: gpio编号0-34 中断类型0无中断 5上升沿中断 7下降沿中断
*/
extern void gpio_fun_inter(uint8_t num, uint8_t inter)
{
unsigned int tv = 0;
if (inter > 0xF)
return;
switch (num % 4)
{
case 3:
__read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
tv &= 0x0FFF;
tv |= ((inter << 12) | 0xF0000);
__write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
break;
case 2:
__read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
tv &= 0xF0FF;
tv |= ((inter << 8) | 0xF0000);
__write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
break;
case 1:
__read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
tv &= 0xFF0F;
tv |= ((inter << 4) | 0xF0000);
__write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
break;
case 0:
__read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
tv &= 0xFFF0;
tv |= ((inter) | 0xF0000);
__write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv);
break;
default:
break;
}
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: sel复用【0:GPIO_Dx】 【1:UART0_TX】 【2:UART0_RX】 【3:UART0_CTS】【4:UART0_RTS】【5:I2C_SCL】
【6:I2C_SDA】 【7:UART1_RX】 【8:UART1_TX】 【9:SIM_IO】 【10:SIM_RST】 【11:SIM_CLK_OUT】
【12:PWM0】 【13:PWM1】 【14:SSI1_CLK】【15:SSI1_SSN】【16:SSI1_RX】 【17:SSI1_TX】
【18:PWM0_INV】【19:PWM1_INV】【20:PWM2_INV】【21:PWM3_INV】
*/
extern void gpio_fun_sel(uint8_t num, uint8_t sel) //(num:0-28)
{
unsigned int tv = 0;
if (sel > 21)
return;
switch (num % 4)
{
case 0:
__read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
tv &= 0xFFFFFF00;
tv |= sel;
__write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
break;
case 1:
__read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
tv &= 0xFFFF00FF;
tv |= (sel << 8);
__write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
break;
case 2:
__read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
tv &= 0xFF00FFFF;
tv |= (sel << 16);
__write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
break;
case 3:
__read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
tv &= 0x00FFFFFF;
tv |= (sel << 24);
__write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv);
break;
default:
break;
}
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern void gpio_output_high(uint8_t num)
{
__write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010001 << (num & 0x0F)));
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern void gpio_output_low(uint8_t num)
{
__write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010000 << (num & 0x0F)));
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern void GPIO_Handler(void)
{
uint32_t val[2];
__read_hw_reg32(GPIO_INTR_STATUS_C00, val[0]);
__read_hw_reg32(GPIO_INTR_STATUS_C01, val[1]);
__write_hw_reg32(GPIO_INTR_CLR0, val[0]);
__write_hw_reg32(GPIO_INTR_CLR1, val[1]);
if (DETECT_INTER_NUM(8, val)) // 判断是否为GPIO24中断
{
printf("GPIO8 interrupt\n");
}
if (DETECT_INTER_NUM(9, val)) // 判断是否为GPIO24中断
{
printf("GPIO9 interrupt\n");
}
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern uint8_t gpio_input_val(uint8_t num)
{
uint32_t val;
__read_hw_reg32((GPIO_EXT_PORT0 + (num >> 5)), val);
return (val & (0x01L << (num & 0x1F))) ? (1) : (0);
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: NA
*/
extern void gpio_direction_output(uint8_t num)
{
__write_hw_reg32((GPIO_PORT_DDR0 + (num >> 4)), ((0x10001) << (num & 0x0F)));
}
/**
* Copyright (c) 2022 - 2025, XinChip
*
* All rights reserved.
*
* Author : D
*
* Tips: gpio编号(0-34) 上下拉状态(0代表上拉 1代表下拉 其他代表无上下拉
【pull_up_type=0 GPIO上拉:GPIO_Mode_Input_Up 】
【pull_up_type=1 GPIO下拉:GPIO_Mode_Input_Down 】
【pull_up_type=2 GPIO浮空:GPIO_Mode_Input_Float】
*/
extern void gpio_direction_input(uint8_t num, uint8_t pull_up_type)
{
uint8_t tv = num;
uint32_t val;
uint32_t *base_reg = 0x0;
if (num > 0 && num <= 15)
{
base_reg = (uint32_t *)(0x40002400 + 0x34);
}
else if (num >= 16 && num <= 31)
{
base_reg = (uint32_t *)(0x40002400 + 0x38);
num = num % 16;
}
else if (num >= 32 && num <= 34)
{
base_reg = (uint32_t *)(0x40002400 + 0x3c);
num = 2 + num % 16;
}
__read_hw_reg32(base_reg, val);
if (pull_up_type == 1) // 下拉
{
setbit(val, num * 2);
clrbit(val, num * 2 + 1);
}
else if (pull_up_type == 0) // 上拉
{
clrbit(val, num * 2);
setbit(val, num * 2 + 1);
}
else // 无上下拉
{
clrbit(val, num * 2);
clrbit(val, num * 2 + 1);
}
__write_hw_reg32(base_reg, val);
__write_hw_reg32((GPIO_PORT_DDR0 + (tv >> 4)), ((0x10000) << (tv & 0x0F)));
__write_hw_reg32((GPIO_DEBOUNCE0 + (tv >> 4)), ((0x10001) << (tv & 0x0F)));
}
void test_gpio(void)
{
Init_gpio();
gpio_mux_ctl(8, 0);
gpio_fun_inter(8, 5);
gpio_fun_sel(8, 0);
gpio_direction_input(8, 1);
gpio_mux_ctl(9, 0);
gpio_fun_inter(9, 5);
gpio_fun_sel(9, 0);
gpio_direction_input(9, 1);
}