libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
hpm_gpio.hpp
Go to the documentation of this file.
1#pragma once
2
26#include "gpio.hpp"
27#include "hpm_gpio_drv.h"
28#include "hpm_plic_drv.h"
29#include "hpm_soc.h"
30
31namespace LibXR
32{
60class HPMGPIO final : public GPIO
61{
62 public:
77 HPMGPIO(GPIO_Type* gpio, uint32_t port, uint8_t pin, uint32_t irq = INVALID_IRQ,
78 uint16_t pad_index = INVALID_PAD_INDEX);
79
84 inline bool Read() override
85 {
86 const uint32_t level = gpio_read_pin(gpio_, port_, pin_);
87 return level == 1u;
88 }
89
95 inline void Write(bool value) override
96 {
97 gpio_write_pin(gpio_, port_, pin_, value ? 1u : 0u);
98 }
99
115 ErrorCode EnableInterrupt() override;
116
132 ErrorCode DisableInterrupt() override;
133
148 ErrorCode SetConfig(Configuration config) override;
149
168
179 static void CheckInterrupt(uint32_t port);
180
181 private:
182#if defined(GPIO_DI_GPIOZ)
183 static constexpr uint32_t PORT_COUNT =
184 GPIO_DI_GPIOZ + 1u;
185#elif defined(GPIO_DI_GPIOY)
186 static constexpr uint32_t PORT_COUNT =
187 GPIO_DI_GPIOY + 1u;
188#elif defined(GPIO_DI_GPIOX)
189 static constexpr uint32_t PORT_COUNT =
190 GPIO_DI_GPIOX + 1u;
191#elif defined(GPIO_DI_GPIOF)
192 static constexpr uint32_t PORT_COUNT =
193 GPIO_DI_GPIOF + 1u;
194#elif defined(GPIO_DI_GPIOE)
195 static constexpr uint32_t PORT_COUNT =
196 GPIO_DI_GPIOE + 1u;
197#elif defined(GPIO_DI_GPIOD)
198 static constexpr uint32_t PORT_COUNT =
199 GPIO_DI_GPIOD + 1u;
200#elif defined(GPIO_DI_GPIOC)
201 static constexpr uint32_t PORT_COUNT =
202 GPIO_DI_GPIOC + 1u;
203#else
204 static constexpr uint32_t PORT_COUNT = 15u;
205#endif
206 static constexpr uint32_t PIN_COUNT = 32;
207 static constexpr uint32_t INVALID_IRQ =
208 0xFFFFFFFFu;
209 static constexpr uint16_t INVALID_PAD_INDEX =
210 0xFFFFu;
211
220 struct PortIrqRouteState
221 {
222 GPIO_Type* controller = nullptr;
223 uint32_t irq = INVALID_IRQ;
224 uint32_t enabled_pin_count = 0u;
225 };
226
236 static uint16_t ResolvePadIndex(GPIO_Type* gpio, uint32_t port, uint8_t pin);
237
240 static HPMGPIO* map[PORT_COUNT][PIN_COUNT];
241 static GPIO_Type* port_controller_map[PORT_COUNT];
242 static PortIrqRouteState port_irq_route_map[PORT_COUNT];
243
244 GPIO_Type* gpio_;
245 uint32_t port_;
246 uint8_t pin_;
247 uint32_t irq_;
248 uint16_t pad_index_;
249 bool interrupt_enabled_ =
250 false;
251};
252
253} // namespace LibXR
254
262extern "C" void libxr_hpm_gpio_check_interrupt(uint32_t port);
通用输入输出(GPIO)接口类。 General Purpose Input/Output (GPIO) interface class.
Definition gpio.hpp:14
HPM 平台 GPIO 驱动实现 / GPIO driver implementation for HPM platform.
Definition hpm_gpio.hpp:61
ErrorCode EnableInterrupt() override
使能当前引脚中断 / Enable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:129
ErrorCode SetAnalogHighImpedance()
将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.
Definition hpm_gpio.cpp:343
ErrorCode SetConfig(Configuration config) override
配置当前引脚模式 / Configure GPIO mode for current pin.
Definition hpm_gpio.cpp:234
bool Read() override
读取引脚电平 / Read current pin level.
Definition hpm_gpio.hpp:84
void Write(bool value) override
写引脚电平 / Write output pin level.
Definition hpm_gpio.hpp:95
static void CheckInterrupt(uint32_t port)
分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.
Definition hpm_gpio.cpp:393
ErrorCode DisableInterrupt() override
失能当前引脚中断 / Disable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:178
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
void libxr_hpm_gpio_check_interrupt(uint32_t port)
GPIO 中断分发的 C 接口 / C entry for GPIO interrupt dispatch.
Definition hpm_gpio.cpp:464
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes