前言
上面一篇章介绍了使用命令通过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引脚

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



