xref: /openbmc/gpioplus/src/gpioplus/chip.hpp (revision 7ba248ad685c8a2029f9cfdbae98d161e9664a3b)
105c6d5fcSWilliam A. Kennington III #pragma once
205c6d5fcSWilliam A. Kennington III #include <gpioplus/internal/fd.hpp>
305c6d5fcSWilliam A. Kennington III #include <gpioplus/internal/sys.hpp>
4*7ba248adSPatrick Williams 
5*7ba248adSPatrick Williams #include <cstdint>
605c6d5fcSWilliam A. Kennington III #include <string>
705c6d5fcSWilliam A. Kennington III 
805c6d5fcSWilliam A. Kennington III namespace gpioplus
905c6d5fcSWilliam A. Kennington III {
1005c6d5fcSWilliam A. Kennington III 
11e3c0b254SWilliam A. Kennington III /** @brief Information about the queried gpio chip */
1205c6d5fcSWilliam A. Kennington III struct ChipInfo
1305c6d5fcSWilliam A. Kennington III {
14e3c0b254SWilliam A. Kennington III     /** @brief Kernel name of the chip */
1505c6d5fcSWilliam A. Kennington III     std::string name;
16e3c0b254SWilliam A. Kennington III     /** @brief Functional name of the chip */
1705c6d5fcSWilliam A. Kennington III     std::string label;
18e3c0b254SWilliam A. Kennington III     /** @brief Number of lines on the chip */
1905c6d5fcSWilliam A. Kennington III     uint32_t lines;
2005c6d5fcSWilliam A. Kennington III };
2105c6d5fcSWilliam A. Kennington III 
22e3c0b254SWilliam A. Kennington III /** @brief Flags pertaining to the gpio line */
2305c6d5fcSWilliam A. Kennington III struct LineFlags
2405c6d5fcSWilliam A. Kennington III {
25e3c0b254SWilliam A. Kennington III     /** @brief Is the kernel currently using the line */
2605c6d5fcSWilliam A. Kennington III     bool kernel;
27e3c0b254SWilliam A. Kennington III     /** @brief Is the line used for output (otherwise input) */
2805c6d5fcSWilliam A. Kennington III     bool output;
29e3c0b254SWilliam A. Kennington III     /** @brief Is the line value active at low voltage */
3005c6d5fcSWilliam A. Kennington III     bool active_low;
31e3c0b254SWilliam A. Kennington III     /** @brief Is the line an open drain */
3205c6d5fcSWilliam A. Kennington III     bool open_drain;
33e3c0b254SWilliam A. Kennington III     /** @brief Is the line an open source */
3405c6d5fcSWilliam A. Kennington III     bool open_source;
3505c6d5fcSWilliam A. Kennington III 
36e3c0b254SWilliam A. Kennington III     /** @brief Converts the syscall flags to this struct
37e3c0b254SWilliam A. Kennington III      *
38e3c0b254SWilliam A. Kennington III      *  @param[in] flags - The int bitfield of flags
39e3c0b254SWilliam A. Kennington III      */
4005c6d5fcSWilliam A. Kennington III     LineFlags(uint32_t flags);
4105c6d5fcSWilliam A. Kennington III };
4205c6d5fcSWilliam A. Kennington III 
43e3c0b254SWilliam A. Kennington III /** @brief Information about the queried gpio line */
4405c6d5fcSWilliam A. Kennington III struct LineInfo
4505c6d5fcSWilliam A. Kennington III {
46e3c0b254SWilliam A. Kennington III     /** @brief Flags that apply to the line */
4705c6d5fcSWilliam A. Kennington III     LineFlags flags;
48e3c0b254SWilliam A. Kennington III     /** @brief name of the line as specified by the gpio chip */
4905c6d5fcSWilliam A. Kennington III     std::string name;
50e3c0b254SWilliam A. Kennington III     /** @brief the name of the consumer of the line */
5105c6d5fcSWilliam A. Kennington III     std::string consumer;
5205c6d5fcSWilliam A. Kennington III };
5305c6d5fcSWilliam A. Kennington III 
54e3c0b254SWilliam A. Kennington III /** @class Chip
55e3c0b254SWilliam A. Kennington III  *  @brief Handle to a gpio chip
56e3c0b254SWilliam A. Kennington III  *  @details Provides a c++ interface to gpio chip operations
57e3c0b254SWilliam A. Kennington III  */
5805c6d5fcSWilliam A. Kennington III class Chip
5905c6d5fcSWilliam A. Kennington III {
6005c6d5fcSWilliam A. Kennington III   public:
61e3c0b254SWilliam A. Kennington III     /** @brief Creates a new chip from chip id
62e3c0b254SWilliam A. Kennington III      *         Ids come from the /sys/bus/gpio/devices/gpiochip{id}
63e3c0b254SWilliam A. Kennington III      *
64e3c0b254SWilliam A. Kennington III      *  @param[in] id  - Id of the chip to open
65e3c0b254SWilliam A. Kennington III      *  @param[in] sys - Optional underlying syscall implementation
66e3c0b254SWilliam A. Kennington III      */
6705c6d5fcSWilliam A. Kennington III     Chip(unsigned id, const internal::Sys* sys = &internal::sys_impl);
6805c6d5fcSWilliam A. Kennington III 
69e3c0b254SWilliam A. Kennington III     /** @brief Gets the information about this chip
70e3c0b254SWilliam A. Kennington III      *
71e3c0b254SWilliam A. Kennington III      *  @throws std::system_error for underlying syscall failures
72e3c0b254SWilliam A. Kennington III      *  @return The chip information
73e3c0b254SWilliam A. Kennington III      */
7405c6d5fcSWilliam A. Kennington III     ChipInfo getChipInfo() const;
75e3c0b254SWilliam A. Kennington III 
76e3c0b254SWilliam A. Kennington III     /** @brief Gets the information about a line on the chip
77e3c0b254SWilliam A. Kennington III      *
78e3c0b254SWilliam A. Kennington III      *  @throws std::system_error for underlying syscall failures
79e3c0b254SWilliam A. Kennington III      *  @return The line information
80e3c0b254SWilliam A. Kennington III      */
8105c6d5fcSWilliam A. Kennington III     LineInfo getLineInfo(uint32_t offset) const;
8205c6d5fcSWilliam A. Kennington III 
83e3c0b254SWilliam A. Kennington III     /** @brief Get the file descriptor associated with the chip
84e3c0b254SWilliam A. Kennington III      *
85e3c0b254SWilliam A. Kennington III      *  @return The file descriptor
86e3c0b254SWilliam A. Kennington III      */
8705c6d5fcSWilliam A. Kennington III     const internal::Fd& getFd() const;
8805c6d5fcSWilliam A. Kennington III 
8905c6d5fcSWilliam A. Kennington III   private:
9005c6d5fcSWilliam A. Kennington III     internal::Fd fd;
9105c6d5fcSWilliam A. Kennington III };
9205c6d5fcSWilliam A. Kennington III 
9305c6d5fcSWilliam A. Kennington III } // namespace gpioplus
94