libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
hpm_gpio.hpp
1#pragma once
2
3#include "gpio.hpp"
4#include "hpm_gpio_drv.h"
5#include "hpm_plic_drv.h"
6#include "hpm_soc.h"
7
8namespace LibXR
9{
20class HPMGPIO final : public GPIO
21{
22 public:
32 HPMGPIO(GPIO_Type* gpio, uint32_t port, uint8_t pin, uint32_t irq = kInvalidIrq,
33 uint16_t pad_index = kInvalidPadIndex);
34
39 inline bool Read() override
40 {
41 const uint32_t level = gpio_read_pin(gpio_, port_, pin_);
42 return level == 1u;
43 }
44
50 inline void Write(bool value) override
51 {
52 gpio_write_pin(gpio_, port_, pin_, value ? 1u : 0u);
53 }
54
60 ErrorCode EnableInterrupt() override;
61
67 ErrorCode DisableInterrupt() override;
68
80 ErrorCode SetConfig(Configuration config) override;
81
87 ErrorCode SetAnalogHighImpedance();
88
99 static void CheckInterrupt(uint32_t port);
100
101 private:
102 static constexpr uint32_t kPortCount = 15;
103 static constexpr uint32_t kPinCount = 32;
104 static constexpr uint32_t kInvalidIrq = 0xFFFFFFFFu;
105 static constexpr uint16_t kInvalidPadIndex = 0xFFFFu;
106
116 static uint16_t ResolvePadIndex(GPIO_Type* gpio, uint32_t port, uint8_t pin);
117
121 static GPIO_Type* port_controller_map[kPortCount];
122
123 GPIO_Type* gpio_;
124 uint32_t port_;
125 uint8_t pin_;
126 uint32_t irq_;
127 uint16_t pad_index_;
128};
129
130} // namespace LibXR
131
136extern "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:21
static constexpr uint32_t kPortCount
支持的端口数量 / Supported port count.
Definition hpm_gpio.hpp:102
GPIO_Type * gpio_
GPIO 控制器实例 / GPIO controller instance.
Definition hpm_gpio.hpp:123
ErrorCode EnableInterrupt() override
使能当前引脚中断 / Enable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:78
static constexpr uint16_t kInvalidPadIndex
无效 PAD 标记 / Invalid PAD marker.
Definition hpm_gpio.hpp:105
ErrorCode SetAnalogHighImpedance()
将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.
Definition hpm_gpio.cpp:200
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:275
ErrorCode SetConfig(Configuration config) override
配置当前引脚模式 / Configure GPIO mode for current pin.
Definition hpm_gpio.cpp:118
uint16_t pad_index_
IOC PAD 编号 / IOC PAD index.
Definition hpm_gpio.hpp:127
bool Read() override
读取引脚电平 / Read current pin level.
Definition hpm_gpio.hpp:39
static constexpr uint32_t kInvalidIrq
无效 IRQ 标记 / Invalid IRQ marker.
Definition hpm_gpio.hpp:104
void Write(bool value) override
写引脚电平 / Write output pin level.
Definition hpm_gpio.hpp:50
static void CheckInterrupt(uint32_t port)
分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.
Definition hpm_gpio.cpp:238
uint32_t irq_
引脚对应 IRQ 号 / IRQ number for this pin.
Definition hpm_gpio.hpp:126
ErrorCode DisableInterrupt() override
失能当前引脚中断 / Disable GPIO interrupt for current pin.
Definition hpm_gpio.cpp:96
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.
Definition hpm_gpio.cpp:49
static HPMGPIO * map[kPortCount][kPinCount]
GPIO 对象映射表 / GPIO object dispatch map.
Definition hpm_gpio.hpp:120
static constexpr uint32_t kPinCount
每个端口引脚数 / Pins per port.
Definition hpm_gpio.hpp:103
uint8_t pin_
GPIO 引脚号 / GPIO pin index.
Definition hpm_gpio.hpp:125
uint32_t port_
GPIO 端口号 / GPIO port index.
Definition hpm_gpio.hpp:124
LibXR 命名空间
Definition ch32_can.hpp:14