imx6ull/linux应用编程学习(2)GPIO编程(下)

1.GPIO输入

加入了些自己的注释

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

// 全局变量用于存储GPIO路径
static char gpio_path[100];

// 配置GPIO属性的函数
static int gpio_config(const char *attr, const char *val)
{
    char file_path[100];  // 用于存储文件路径
    int len;  // 字符串长度
    int fd;  // 文件描述符

    // 生成属性文件的完整路径
    sprintf(file_path, "%s/%s", gpio_path, attr);

    // 打开属性文件
    if (0 > (fd = open(file_path, O_WRONLY))) {
        perror("open error");  // 打开文件出错时输出错误信息
        return fd;
    }

    len = strlen(val);  // 获取值字符串的长度

    // 写入值到属性文件
    if (len != write(fd, val, len)) {
        perror("write error");  // 写入出错时输出错误信息
        close(fd);  // 关闭文件
        return -1;
    }

    close(fd);  // 关闭文件
    return 0;
}

int main(int argc, char *argv[])
{
    char file_path[100];  // 用于存储文件路径
    char val;  // 用于存储读取的值
    int fd;  // 文件描述符

    // 校验传参个数,必须是2个
    if (2 != argc) {
        fprintf(stderr, "usage: %s <gpio>\n", argv[0]);  // 提示正确用法
        exit(-1);
    }

    // 生成GPIO路径
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);

    // 检查GPIO目录是否存在
    if (access(gpio_path, F_OK)) {  // 如果目录不存在,则需要导出

        int len;  // 字符串长度

        // 打开导出文件
        if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
            perror("open error");  // 打开文件出错时输出错误信息
            exit(-1);
        }

        len = strlen(argv[1]);  // 获取GPIO编号字符串的长度

        // 写入GPIO编号到导出文件
        if (len != write(fd, argv[1], len)) {  // 导出GPIO
            perror("write error");  // 写入出错时输出错误信息
            close(fd);  // 关闭文件
            exit(-1);
        }

        close(fd);  // 关闭文件
    }

    // 配置GPIO为输入模式
    if (gpio_config("direction", "in"))
        exit(-1);

    // 配置GPIO极性为默认(不反转)
    if (gpio_config("active_low", "0"))
        exit(-1);

    // 配置GPIO为非中断方式
    if (gpio_config("edge", "none"))
        exit(-1);

    // 读取GPIO电平状态
    sprintf(file_path, "%s/%s", gpio_path, "value");

    // 打开值文件
    if (0 > (fd = open(file_path, O_RDONLY
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值