Project

General

Profile

Can't read state of output GPIO pins » gpio_read_output_test_cpp20.cpp

C++ 20 test program demonstrating the issue - Tim Troester, 03/16/2026 05:43 PM

 
#include <fcntl.h>
#include <linux/gpio.h>
#include <sys/ioctl.h>

#include <cerrno>
#include <chrono>
#include <cstring>
#include <iostream>
#include <thread>

static constexpr auto s_which_gpio_chip = "/dev/gpiochip2";
static constexpr auto s_which_gpio_line = 10;

int main()
{
int chip_fd = open(s_which_gpio_chip, O_RDWR);
if (chip_fd < 0)
{
std::cout << "failed to open gpio chip: " << strerror(errno) << std::endl;
return -1;
}

gpio_v2_line_request request{};
request.num_lines = 1;
request.offsets[0] = s_which_gpio_line;
request.event_buffer_size = 16;
request.config.num_attrs = 0;
request.config.flags = GPIO_V2_LINE_FLAG_OUTPUT;

if (ioctl(chip_fd, GPIO_V2_GET_LINE_IOCTL, &request) != 0)
{
std::cout << "GPIO_V2_GET_LINE_IOCTL failed: " << strerror(errno) << std::endl;
return -2;
}

int line_fd = request.fd;
if (line_fd < 0)
{
std::cout << "GPIO_V2_GET_LINE_IOCTL returned unexpected fd: " << line_fd << std::endl;
return -3;
}

for (;;)
{
// set pin active
std::cout << "setting pin to ACTIVE!" << std::endl;
gpio_v2_line_values values_1{.bits = 1u, .mask = 1u};
if (ioctl(line_fd, GPIO_V2_LINE_SET_VALUES_IOCTL, &values_1) != 0)
{
std::cout << "GPIO_V2_LINE_SET_VALUES_IOCTL failed: " << strerror(errno) << std::endl;
return -4;
}

// read pin state
gpio_v2_line_values confirm_values_1{.bits = 0u, .mask = 1u};
if (ioctl(line_fd, GPIO_V2_LINE_GET_VALUES_IOCTL, &confirm_values_1) != 0)
{
std::cout << "GPIO_V2_LINE_GET_VALUES_IOCTL failed: " << strerror(errno) << std::endl;
return -5;
}
std::cout << "confirming pin state as " << ((confirm_values_1.bits & 1u) ? "ACTIVE" : "INACTIVE") << "!"
<< std::endl;

std::this_thread::sleep_for(std::chrono::seconds(5));

// set pin inactive
std::cout << "setting pin to INACTIVE!" << std::endl;
gpio_v2_line_values values_2{.bits = 0u, .mask = 1u};
if (ioctl(line_fd, GPIO_V2_LINE_SET_VALUES_IOCTL, &values_2) != 0)
{
std::cout << "GPIO_V2_LINE_SET_VALUES_IOCTL failed: " << strerror(errno) << std::endl;
return -4;
}

// read pin state
gpio_v2_line_values confirm_values_2{.bits = 0u, .mask = 1u};
if (ioctl(line_fd, GPIO_V2_LINE_GET_VALUES_IOCTL, &confirm_values_2) != 0)
{
std::cout << "GPIO_V2_LINE_GET_VALUES_IOCTL failed: " << strerror(errno) << std::endl;
return -5;
}
std::cout << "confirming pin state as " << ((confirm_values_2.bits & 1u) ? "ACTIVE" : "INACTIVE") << "!"
<< std::endl;

std::this_thread::sleep_for(std::chrono::seconds(5));
}
}
(1-1/2)