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