libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
hpm_gpio.hpp
Go to the documentation of this file.
1#pragma once
2
25#include "gpio.hpp"
26#include "hpm_gpio_drv.h"
27#include "hpm_plic_drv.h"
28#include "hpm_soc.h"
29
30namespace LibXR
31{
59class HPMGPIO final : public GPIO
60{
61 public:
76 HPMGPIO(GPIO_Type* gpio, uint32_t port, uint8_t pin, uint32_t irq = INVALID_IRQ,
77 uint16_t pad_index = INVALID_PAD_INDEX);
78
83 inline bool Read() override
84 {
85 const uint32_t level = gpio_read_pin(gpio_, port_, pin_);
86 return level == 1u;
87 }
88
94 inline void Write(bool value) override
95 {
96 gpio_write_pin(gpio_, port_, pin_, value ? 1u : 0u);
97 }
98
114 ErrorCode EnableInterrupt() override;
115
131 ErrorCode DisableInterrupt() override;
132
147 ErrorCode SetConfig(Configuration config) override;
148
167
178 static void CheckInterrupt(uint32_t port);
179
180 private:
181#if defined(GPIO_DI_GPIOZ)
182 static constexpr uint32_t PORT_COUNT =
183 GPIO_DI_GPIOZ + 1u;
184#elif defined(GPIO_DI_GPIOY)
185 static constexpr uint32_t PORT_COUNT =
186 GPIO_DI_GPIOY + 1u;
187#elif defined(GPIO_DI_GPIOX)
188 static constexpr uint32_t PORT_COUNT =
189 GPIO_DI_GPIOX + 1u;
190#elif defined(GPIO_DI_GPIOF)
191 static constexpr uint32_t PORT_COUNT =
192 GPIO_DI_GPIOF + 1u;
193#elif defined(GPIO_DI_GPIOE)
194 static constexpr uint32_t PORT_COUNT =
195 GPIO_DI_GPIOE + 1u;
196#elif defined(GPIO_DI_GPIOD)
197 static constexpr uint32_t PORT_COUNT =
198 GPIO_DI_GPIOD + 1u;
199#elif defined(GPIO_DI_GPIOC)
200 static constexpr uint32_t PORT_COUNT =
201 GPIO_DI_GPIOC + 1u;
202#else
203 static constexpr uint32_t PORT_COUNT = 15u;
204#endif
205 static constexpr uint32_t PIN_COUNT = 32;
206 static constexpr uint32_t INVALID_IRQ = 0xFFFFFFFFu;
207 static constexpr uint16_t INVALID_PAD_INDEX = 0xFFFFu;
208
218 {
219 GPIO_Type* controller = nullptr;
220 uint32_t irq = INVALID_IRQ;
221 uint32_t enabled_pin_count = 0u;
222 };
223
233 static uint16_t ResolvePadIndex(GPIO_Type* gpio, uint32_t port, uint8_t pin);
234
238 static GPIO_Type* port_controller_map[PORT_COUNT];
239 static PortIrqRouteState port_irq_route_map[PORT_COUNT];
240
241 GPIO_Type* gpio_;
242 uint32_t port_;
243 uint8_t pin_;
244 uint32_t irq_;
245 uint16_t pad_index_;
246 bool interrupt_enabled_ = false;
247};
248
249} // namespace LibXR
250
255extern "C" void libxr_hpm_gpio_check_interrupt(uint32_t port);
通用输入输出(GPIO)接口类。General Purpose Input/Output (GPIO) interface class.
Definition gpio.hpp:13
HPM 平台 GPIO 驱动实现 / GPIO driver implementation for HPM platform.
Definition hpm_gpio.hpp:60
GPIO_Type * gpio_
GPIO 控制器实例 / GPIO controller instance.
Definition hpm_gpio.hpp:241
ErrorCode EnableInterrupt() override
使能当前引脚中断 / Enable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:129
static constexpr uint32_t INVALID_IRQ
无效 IRQ 标记 / Invalid IRQ marker.
Definition hpm_gpio.hpp:206
static constexpr uint32_t PORT_COUNT
支持的端口数量 / Supported port count.
Definition hpm_gpio.hpp:203
static constexpr uint16_t INVALID_PAD_INDEX
无效 PAD 标记 / Invalid PAD marker.
Definition hpm_gpio.hpp:207
ErrorCode SetAnalogHighImpedance()
将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.
Definition hpm_gpio.cpp:343
static uint16_t ResolvePadIndex(GPIO_Type *gpio, uint32_t port, uint8_t pin)
根据控制器与端口引脚推导 IOC PAD 编号 / Resolve IOC PAD index from controller/port/pin tuple.
Definition hpm_gpio.cpp:430
bool interrupt_enabled_
当前 pin IRQ 使能状态 / Per-instance IRQ enabled flag.
Definition hpm_gpio.hpp:246
ErrorCode SetConfig(Configuration config) override
配置当前引脚模式 / Configure GPIO mode for current pin.
Definition hpm_gpio.cpp:234
uint16_t pad_index_
IOC PAD 编号 / IOC PAD index.
Definition hpm_gpio.hpp:245
bool Read() override
读取引脚电平 / Read current pin level.
Definition hpm_gpio.hpp:83
void Write(bool value) override
写引脚电平 / Write output pin level.
Definition hpm_gpio.hpp:94
static void CheckInterrupt(uint32_t port)
分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.
Definition hpm_gpio.cpp:393
uint32_t irq_
当前 port 对应 IRQ 号 / IRQ number for the current port.
Definition hpm_gpio.hpp:244
ErrorCode DisableInterrupt() override
失能当前引脚中断 / Disable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:178
static constexpr uint32_t PIN_COUNT
每个端口引脚数 / Pins per port.
Definition hpm_gpio.hpp:205
HPMGPIO(GPIO_Type *gpio, uint32_t port, uint8_t pin, uint32_t irq=INVALID_IRQ, uint16_t pad_index=INVALID_PAD_INDEX)
构造 HPM GPIO 对象 / Construct an HPM GPIO object.
Definition hpm_gpio.cpp:97
uint8_t pin_
GPIO 引脚号 / GPIO pin index.
Definition hpm_gpio.hpp:243
uint32_t port_
GPIO 端口号 / GPIO port index.
Definition hpm_gpio.hpp:242
static HPMGPIO * map[PORT_COUNT][PIN_COUNT]
GPIO 对象映射表 / GPIO object dispatch map.
Definition hpm_gpio.hpp:237
void libxr_hpm_gpio_check_interrupt(uint32_t port)
GPIO 中断分发的 C 接口 / C entry for GPIO interrupt dispatch.
Definition hpm_gpio.cpp:464
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
端口级 IRQ 路由状态 / Shared port-level IRQ routing state.
Definition hpm_gpio.hpp:218