libgpiod控制IO口状态

从Linux4.8开始,可以使用libgpio软件包,而以往通过sysfs的GPIO控制方式逐渐被淘汰。libgpio是linux内核提供的GPIO控制库,允许用户在用户空间控制GPIO引脚,包括设置引脚的方向(输入/输出)、读取引脚状态等。要使用libgpio,需要在系统中进行安装:

sudo apt install libgpiod-dev          // 安装开发库,其中包含GPIO控制代码头文件和开发工具
sudo apt install gpiod                 // 安装GPIO命令行工具

可以通过配置寄存器的方式,指定选择MIO端口为GPIO
查看寄存器的数据

root@phytium-Ubuntu:~# devmem2 0x281a0020
root@phytium-Ubuntu:~# devmem2 0x281a0020
/dev/mem opened.
Memory mapped at address 0xffff8ca18000.
Value at address 0x281A0020 (0xffff8ca18020): 0x0

配置寄存器,写入数据 0x02

root@phytium-Ubuntu:~# devmem2 0x281a0020 w 2
/dev/mem opened.
Memory mapped at address 0xffff89a35000.
Value at address 0x281A0020 (0xffff89a35020): 0x0
Written 0x2; readback 0x2

将寄存器配置为普通GPIO,就可以使用sysfs或libgpio控制引脚电平状态。
查看系统中所有的GPIO信息

gpiodetect                      // 列举系统中的所有GPIO控制器
gpioinfo gpiochip4              // 查看gpiochip4控制器的引脚信息

如果系统同时安装了sysfs系统控制GPIO,则会显示被sysfs使用的GPIO端口。
在这里插入图片描述
如果端口已经被sysfs使用( sys/class/gpio),则不能使用GPIO控制IO口状态。需要先取消sysfs对相应GPIO的占用。

root@phytium-Ubuntu:~# echo 503 > /sys/class/gpio/unexport

在这里插入图片描述
设置相应的端口输出高电平

root@phytium-Ubuntu:~# gpioset gpiochip0 7=1

测量输出IO为高电平
读取引脚引脚电平

root@phytium-Ubuntu:~# gpioget gpiochip0 7
1
root@phytium-Ubuntu:~#
root@phytium-Ubuntu:~# gpioset gpiochip0 7=0

测量输出IO为低电平

读取引脚引脚电平(读取瞬间变高)

root@phytium-Ubuntu:~# gpioget gpiochip0 7
1
root@phytium-Ubuntu:~#

libgpio编程方式
gpiolib的头文件位于/usr/include/gpiod.h,它定义了用户访问GPIO的函数、结构和符号。根据调用其中的函数,可以完成对GPIO的控制。以下是一个简单的示例:

#include <stdio.h>
#include <gpiod.h>
int main()
{
    struct gpiod_chip *chip;
    struct gpiod_line *line;
    int retflag = 0;
    // 获取gpio4控制器
    chip = gpiod_chip_open("/dev/gpiochip4");
    if (!chip) {
        printf("Failed to open chip");
        return -1;
    }

    // 获取gpio4_13引脚  
    line = gpiod_chip_get_line(chip, 13); 
    if (!line) {
        printf("Failed to get line");
        retflag = -1;
        goto chip_close;
    }
    // 将gpio4_13引脚设置为输出
    int ret = gpiod_line_request_output(line, "ExampleOutput", GPIOD_LINE_ACTIVE_STATE_LOW);
    if (ret < 0) {
        printf("Failed to request output");
        retflag = -1;
        goto line_release;
    }

    // 设置 GPIO 引脚状态为高电平
    ret = gpiod_line_set_value(line, 1);
    if (ret < 0) {
        printf("Failed to set value");
        retflag = -1;
        goto line_release;
    }

    // 读取 GPIO 引脚状态
    int value = gpiod_line_get_value(line);
    if (value < 0) {
        printf("Failed to get value");
        retflag = -1;
    }

line_release:
    gpiod_line_release(line);

chip_close:
    gpiod_chip_close(chip);

    return retflag;
}

编译程序,需要添加 -lgpiod 指定库文件。

 gcc -o libgpio libgpio.c -lgpiod
要获取海康工业相机的IO状态,首先需要了解IO是指相机的输入输出接,用于与其他设备进行数据传输和控制。 海康工业相机通常具有多个IO,我们可以通过以下步骤来获取其状态: 1. 了解相机的IO类型:海康工业相机一般支持数字IO和模拟IO两种接类型,数字IO一般用于数字输入和输出信号的传输,而模拟IO一般用于模拟信号的输入和输出。 2. 确定IO的编号和功能:每个IO都有一个编号和特定的功能。我们可以查看相机的用户手册或相关文档,找到IO的编号和对应的功能,比如输出控制、输入检测等。 3. 使用相机的SDK进行编程:海康工业相机通常提供SDK(软件开发工具包),我们可以使用SDK来控制相机的IO。首先需要在代码中引入SDK库文件,并建立与相机的连接。 4. 通过SDK的接获取IO状态:使用SDK提供的接函数,通过指定IO的编号,我们可以获取其对应的状态。对于数字IO,可以通过读取引脚的电平状态(高电平、低电平)来获取状态。对于模拟IO,可以通过读取引脚的模拟电压值来获取状态。 5. 处理获取到的IO状态:根据获取到的状态,我们可以进行相应的处理,比如输出控制状态下可以向外部设备发送信号,输入检测状态下可以根据信号做出相应的响应。 总之,要获取海康工业相机的IO状态,需要了解相机的IO类型、编号和功能,并通过相机的SDK进行编程来获取和处理IO状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hdh717

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值