libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
linux_gpio.hpp
1#pragma once
2
3#include <atomic>
4#include <cstddef>
5#include <cstdint>
6#include <string>
7
8#include "gpio.hpp"
9#include "thread.hpp"
10
11namespace LibXR
12{
13
25class LinuxGPIO : public GPIO
26{
27 public:
28 LinuxGPIO(const std::string& chip_path, unsigned int line_offset);
29 ~LinuxGPIO() override;
30
31 LinuxGPIO(const LinuxGPIO&) = delete;
32 LinuxGPIO& operator=(const LinuxGPIO&) = delete;
33
34 bool Read() override;
35 void Write(bool value) override;
36 ErrorCode EnableInterrupt() override;
37 ErrorCode DisableInterrupt() override;
38 ErrorCode SetConfig(Configuration config) override;
39
40 private:
41 static constexpr size_t EVENT_BUFFER_CAPACITY = 64;
42 static constexpr size_t INTERRUPT_THREAD_STACK_SIZE = 16384;
43
44 enum class AbiVersion : uint8_t
45 {
46 UNKNOWN = 0,
47 V2 = 1,
48 V1 = 2,
49 };
50
51 enum class RequestKind : uint8_t
52 {
53 NONE = 0,
54 HANDLE = 1,
55 EVENT = 2,
56 };
57
58 std::string chip_path_;
59 unsigned int line_offset_ = 0U;
60 int chip_fd_ = -1;
61 std::atomic<int> request_fd_{-1};
62 std::atomic<AbiVersion> abi_version_{AbiVersion::UNKNOWN};
63 std::atomic<RequestKind> request_kind_{RequestKind::NONE};
64 Configuration current_config_ = {Direction::INPUT, Pull::NONE};
65 bool has_config_ = false;
66 std::atomic<bool> interrupt_enabled_{false};
67 std::atomic<bool> interrupt_thread_started_{false};
68 std::atomic<bool> interrupt_thread_exit_{false};
69 std::atomic<bool> interrupt_poll_active_{false};
70 Thread interrupt_thread_;
71 int interrupt_wake_pipe_[2] = {-1, -1};
72
73 ErrorCode OpenChip();
74 void CloseChip();
75 void CloseRequest();
76 ErrorCode InitInterruptWakePipe();
77 void CloseInterruptWakePipe();
78 void NotifyInterruptThread();
79 void WaitForInterruptLoopIdle();
80 void WaitForInterruptThreadStopped();
81 ErrorCode DetectAbiVersion();
82 ErrorCode ReopenRequest(Configuration config);
83 ErrorCode OpenRequestV2(Configuration config);
84 ErrorCode ReconfigureRequestV2(Configuration config);
85 ErrorCode OpenRequestV1(Configuration config);
86 ErrorCode ReconfigureRequestV1(Configuration config);
87 ErrorCode PumpEventQueue(int fd, AbiVersion abi_version, size_t& event_count,
88 int timeout_ms) const;
89 ErrorCode ReadEventsV2(int fd, size_t& event_count) const;
90 ErrorCode ReadEventsV1(int fd, size_t& event_count) const;
91 void StartInterruptThread();
92 void InterruptLoop();
93 ErrorCode EnsureConfigured() const;
94 static bool IsInterruptDirection(Direction direction);
95 bool NeedsRequestReopen(Configuration config) const;
96};
97
98} // namespace LibXR
通用输入输出(GPIO)接口类。General Purpose Input/Output (GPIO) interface class.
Definition gpio.hpp:13
Direction
定义 GPIO 引脚的方向类型。Defines the direction types for GPIO pins.
Definition gpio.hpp:20
@ INPUT
输入模式。Input mode.
@ NONE
无上拉或下拉。No pull-up or pull-down.
基于 Linux GPIO character device uAPI 的 Linux GPIO 实现 Linux GPIO implementation based on the Linux GPIO...
ErrorCode EnableInterrupt() override
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
void Write(bool value) override
写入 GPIO 引脚状态。Writes the GPIO pin state.
bool Read() override
读取 GPIO 引脚状态。Reads the GPIO pin state.
ErrorCode SetConfig(Configuration config) override
配置 GPIO 引脚参数。Configures the GPIO pin settings.
ErrorCode DisableInterrupt() override
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
线程管理类,封装 POSIX 线程创建和调度 Thread management class encapsulating POSIX thread creation and scheduling
Definition thread.hpp:18
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
存储 GPIO 配置参数的结构体。Structure storing GPIO configuration parameters.
Definition gpio.hpp:46