C/C++ GPIO开发

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


本文档说明 Quectel Pi M2 上使用 C/C++ 访问 GPIO 的推荐方式。当前开发板已验证可使用 libgpiod v1.6.3,默认推荐 libgpiod 路径。

环境准备

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

项目

说明

推荐库

libgpiod

编译参数

-lgpiod

主控制器

当前验证为 /dev/gpiochip0

读取示例

#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

输出示例

#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

注意事项

  • 实际 line offset 需结合开发板引脚定义确认。

  • 运行失败时先用 gpioinfo /dev/gpiochip0 检查线路是否被占用。

  • 若编译提示找不到 gpiod.h,确认已安装 libgpiod-dev