C/C++ GPIO development

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


This document describes the recommended method for accessing GPIO using C/C++ on the Quectel Pi M2. The current development board has been verified to support libgpiod v1.6.3, and the libgpiod approach is recommended by default.

Environment Setup

sudo apt update
sudo apt install -y build-essential gpiod libgpiod-dev
gpiodetect --version
gpiodetect

Item

Description

Recommended Library

libgpiod

Compilation Option

-lgpiod

Main Controller

Currently verified as /dev/gpiochip0

Input Example

#include <gpiod.h>
#include <stdio.h>

int main(void)
{
    struct gpiod_chip *chip;
    struct gpiod_line_settings *settings;
    struct gpiod_line_config *line_cfg;
    struct gpiod_request_config *req_cfg;
    struct gpiod_line_request *request;
    unsigned int offset = 36;
    int value;

    chip = gpiod_chip_open("/dev/gpiochip0");
    if (!chip) {
        perror("gpiod_chip_open");
        return 1;
    }

    settings = gpiod_line_settings_new();
    gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT);

    line_cfg = gpiod_line_config_new();
    gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings);

    req_cfg = gpiod_request_config_new();
    gpiod_request_config_set_consumer(req_cfg, "m1-gpio-input");

    request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
    if (!request) {
        perror("gpiod_chip_request_lines");
        return 1;
    }

    value = gpiod_line_request_get_value(request, offset);
    printf("value=%d\n", value);

    gpiod_line_request_release(request);
    gpiod_line_config_free(line_cfg);
    gpiod_line_settings_free(settings);
    gpiod_request_config_free(req_cfg);
    gpiod_chip_close(chip);
    return 0;
}
gcc -Wall -o gpio_input gpio_input.c -lgpiod
sudo ./gpio_input

Output Example

#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    struct gpiod_chip *chip;
    struct gpiod_line_settings *settings;
    struct gpiod_line_config *line_cfg;
    struct gpiod_request_config *req_cfg;
    struct gpiod_line_request *request;
    unsigned int offset = 36;

    chip = gpiod_chip_open("/dev/gpiochip0");
    if (!chip) {
        perror("gpiod_chip_open");
        return 1;
    }

    settings = gpiod_line_settings_new();
    gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT);
    gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_ACTIVE);

    line_cfg = gpiod_line_config_new();
    gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings);

    req_cfg = gpiod_request_config_new();
    gpiod_request_config_set_consumer(req_cfg, "m1-gpio-output");

    request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
    if (!request) {
        perror("gpiod_chip_request_lines");
        return 1;
    }

    sleep(1);
    gpiod_line_request_set_value(request, offset, GPIOD_LINE_VALUE_INACTIVE);

    gpiod_line_request_release(request);
    gpiod_line_config_free(line_cfg);
    gpiod_line_settings_free(settings);
    gpiod_request_config_free(req_cfg);
    gpiod_chip_close(chip);
    return 0;
}
gcc -Wall -o gpio_output gpio_output.c -lgpiod
sudo ./gpio_output

Notes

  • The actual line offset must be confirmed against the development board’s pin definitions.

  • If execution fails, first use gpioinfo /dev/gpiochip0 to check whether the line is in use.

  • If the compiler reports that gpiod.h cannot be found, confirm that libgpiod-dev is installed.