使用C程序通过sysfs文件系统控制gpio


前言

   上面一篇章介绍了使用命令通过sysfs文件系统控制GPIO。这种方式在实际开发中很常见,特别是调试阶段。 那么如果在实战商用阶段,那肯定是需要用程序来控制的。
所以,用可执行程序来控制GPIO的实际场景就很有意义了,可执行程序又是用C代码编写的,那么就需要写一个C代码编译成可执行程序来进行GPIO控制了。


参考资料

GPIO 控制和操作-使用命令通过sysfs文件系统控制GPIO
RK3568驱动指南|第十二篇 GPIO子系统-第129章 GPIO控制和操作实验

使用C程序控制sysfs文件系统控制GPIO

一、控制GPIO输出

目标

通过C代码编译可执行文件,实现控制LED的亮灭
比如:如下控制 ,执行可执行文件进行传参,比如如下

思路

在前面的文章中 GPIO 控制和操作-使用命令通过sysfs文件系统控制GPIO
控制LED灯亮灭,其实就是两个个命令,如下:

  • 导出GPIO
 echo 15 > /sys/class/gpio/export
  • 输入高低电平控制LED灯亮灭
echo 1 > /sys/class/gpio/gpio15/value  # 输出高电平
echo 0 > /sys/class/gpio/gpio15/value  # 输出低电平

所以我们目标就是把这个命令转换成C代码,编译成可执行文件,然后传参实现。

源码实现

gpioctrl_test.c 

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

int fd;                   // 文件描述符
int ret;                  // 返回值
char gpio_path[100];      // GPIO路径
int len;                  // 字符串长度

// 导出GPIO引脚
int gpio_export(char *argv)
{
   
   
    fd = open("/sys/class/gpio/export", O_WRONLY); // 打开export文件
    if (fd < 0)
    {
   
   
        printf("open /sys/class/gpio/export error \n"); // 打开文件失败
        return -1;
    }
    len = strlen(argv); // 获取参数字符串的长度
    ret = write(fd, argv, len); // 将参数字符串写入文件,导出GPIO引脚
    if (ret < 0)
    {
   
   
        printf("write /sys/class/gpio/export error \n"); // 写入文件失败
        return -2;
    }
    close(fd); // 关闭文件
}

// 取消导出GPIO引脚
int gpio_unexport(char *argv)
{
   
   
    fd = open("/sys/class/gpio/unexport", O_WRONLY); // 打开unexport文件
    if (fd < 0)
    {
   
   
        printf("open /sys/class/gpio/unexport error \n"); // 打开文件失败
        return -1;
    }
    len = strlen(argv); // 获取参数字符串的长度
    ret = write(fd, argv, len); // 将参数字符串写入文件,取消导出GPIO引脚
    if (ret < 0)
    {
   
   
        printf("write /sys/class/gpio/unexport error \n"); // 写入文件失败
        return -2;
    }
    close(fd); // 关闭文件
}

// 控制GPIO引脚的属性
int gpio_ctrl(char *arg, char *val)
{
   
   
    char file_path[100]; // 文件路径
    sprintf(file_path, "%s/%s", gpio_path, arg); // 构建文件路径,格式为“gpio_path/arg”
    fd = open(file_path, O_WRONLY); // 打开文件
    if (fd < 0)
    {
   
   
        printf("open file_path error \n"); // 打开文件失败
        return -1;
    }
    len = strlen(val); // 获取参数字符串的长度
    ret = write(fd, val, len); // 将参数字符串写入文件,控制GPIO引脚的属性
    if (ret < 0)
    {
   
   
        printf("write file_path error\n"); // 写入文件失败
        return -2;
    }
    close(fd); // 关闭文件
}

int main(int argc, char *argv[]) // 主函数
{
   
   
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]); // 构建GPIO路径,格式为“/sys/class/gpio/gpio引脚号”
    if (access(gpio_path, F_OK)) // 检查GPIO路径是否存在
    {
   
   
        gpio_export(argv[1]); // 不存在则导出GPIO引脚
    }
    else
    {
   
   
        gpio_unexport(argv[1]); // 存在则取消导出GPIO引脚
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值