3#include "hpm_interrupt.h"
4#include "hpm_ioc_regs.h"
27static inline void HPM_GPIO_ConfigMuxToGPIO(GPIO_Type* gpio, uint32_t port,
29 bool enable_loopback =
true)
31 uint32_t func_ctl = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
34 func_ctl |= IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
36 HPM_IOC->PAD[pad_index].FUNC_CTL = func_ctl;
39 if (port == GPIO_DI_GPIOY && (gpio == HPM_GPIO0 || gpio == HPM_FGPIO))
41 HPM_PIOC->PAD[pad_index].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(3);
55 pad_index_(pad_index == kInvalidPadIndex ? ResolvePadIndex(gpio, port, pin)
61 if (port_controller_map[
port_] ==
nullptr)
82 return ErrorCode::ARG_ERR;
85 intc_m_enable_irq_with_priority(
irq_, 1);
100 return ErrorCode::ARG_ERR;
103 intc_m_disable_irq(
irq_);
104 return ErrorCode::OK;
122 return ErrorCode::ARG_ERR;
143 gpio_config_pin_interrupt(
gpio_,
port_,
pin_, gpio_interrupt_trigger_edge_falling);
147 gpio_config_pin_interrupt(
gpio_,
port_,
pin_, gpio_interrupt_trigger_edge_rising);
151 gpio_config_pin_interrupt(
gpio_,
port_,
pin_, gpio_interrupt_trigger_edge_both);
154 return ErrorCode::ARG_ERR;
159 uint32_t pad_ctl = HPM_IOC->PAD[
pad_index_].PAD_CTL;
163 ~(IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_OD_MASK);
170 pad_ctl |= IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
173 pad_ctl |= IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(0);
176 return ErrorCode::ARG_ERR;
181 pad_ctl |= IOC_PAD_PAD_CTL_OD_SET(1);
187 return ErrorCode::OK;
204 return ErrorCode::ARG_ERR;
209 return ErrorCode::NOT_SUPPORT;
215 HPM_IOC->PAD[
pad_index_].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
217 uint32_t pad_ctl = HPM_IOC->PAD[
pad_index_].PAD_CTL;
218 pad_ctl &= ~(IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_OD_MASK);
221 return ErrorCode::OK;
245 GPIO_Type* controller = port_controller_map[port];
246 if (controller ==
nullptr)
251 const uint32_t flags = gpio_get_port_interrupt_flags(controller, port);
257 for (uint8_t pin = 0; pin <
kPinCount; ++pin)
259 if ((flags & (1u << pin)) == 0u)
264 gpio_clear_pin_interrupt_flag(controller, port, pin);
265 if (
auto* gpio =
map[port][pin])
267 gpio->callback_.Run(
true);
277 if (gpio != HPM_GPIO0 && gpio != HPM_FGPIO)
285 return static_cast<uint16_t
>(IOC_PAD_PA00 + pin);
287 return static_cast<uint16_t
>(IOC_PAD_PB00 + pin);
289 return pin < 8u ? static_cast<uint16_t>(IOC_PAD_PX00 + pin) :
kInvalidPadIndex;
291 return pin < 8u ? static_cast<uint16_t>(IOC_PAD_PY00 + pin) :
kInvalidPadIndex;
301extern "C" void libxr_hpm_gpio_check_interrupt(uint32_t port)
@ OUTPUT_PUSH_PULL
推挽输出模式。Push-pull output mode.
@ RISING_INTERRUPT
上升沿中断模式。Rising edge interrupt mode.
@ FALL_RISING_INTERRUPT
双沿触发中断模式。Both edge interrupt mode.
@ OUTPUT_OPEN_DRAIN
开漏输出模式。Open-drain output mode.
@ FALL_INTERRUPT
下降沿中断模式。Falling edge interrupt mode.
@ NONE
无上拉或下拉。No pull-up or pull-down.
@ DOWN
下拉模式。Pull-down mode.
HPM 平台 GPIO 驱动实现 / GPIO driver implementation for HPM platform.
static constexpr uint32_t kPortCount
支持的端口数量 / Supported port count.
GPIO_Type * gpio_
GPIO 控制器实例 / GPIO controller instance.
ErrorCode EnableInterrupt() override
使能当前引脚中断 / Enable GPIO interrupt for current pin.
static constexpr uint16_t kInvalidPadIndex
无效 PAD 标记 / Invalid PAD marker.
ErrorCode SetAnalogHighImpedance()
将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.
static uint16_t ResolvePadIndex(GPIO_Type *gpio, uint32_t port, uint8_t pin)
根据控制器与端口引脚推导 IOC PAD 编号 / Resolve IOC PAD index from controller/port/pin tuple.
ErrorCode SetConfig(Configuration config) override
配置当前引脚模式 / Configure GPIO mode for current pin.
uint16_t pad_index_
IOC PAD 编号 / IOC PAD index.
static constexpr uint32_t kInvalidIrq
无效 IRQ 标记 / Invalid IRQ marker.
static void CheckInterrupt(uint32_t port)
分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.
uint32_t irq_
引脚对应 IRQ 号 / IRQ number for this pin.
ErrorCode DisableInterrupt() override
失能当前引脚中断 / Disable GPIO interrupt for current pin.
HPMGPIO(GPIO_Type *gpio, uint32_t port, uint8_t pin, uint32_t irq=kInvalidIrq, uint16_t pad_index=kInvalidPadIndex)
构造 HPM GPIO 对象 / Construct an HPM GPIO object.
static HPMGPIO * map[kPortCount][kPinCount]
GPIO 对象映射表 / GPIO object dispatch map.
static constexpr uint32_t kPinCount
每个端口引脚数 / Pins per port.
uint8_t pin_
GPIO 引脚号 / GPIO pin index.
uint32_t port_
GPIO 端口号 / GPIO port index.
存储 GPIO 配置参数的结构体。Structure storing GPIO configuration parameters.
Pull pull
GPIO 上拉/下拉配置。GPIO pull-up/pull-down configuration.
Direction direction
GPIO 引脚方向。GPIO pin direction.