RK3568平台 C程序通过sysfs控制GPIO_access(gpio_path, f_ok)

}
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引脚
}

gpio_ctrl("direction", "out"); // 配置GPIO为输出模式
gpio_ctrl("value", argv[2]);   // 控制GPIO输出高低电平

gpio_unexport(argv[1]); // 最后取消导出GPIO引脚

return 0; // 返回0表示程序正常退出

}


通过 GPIO 输入应用程序读取 GPIO 口的输入电平。



#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; // 字符串长度
char file_path[100]; // 文件路径
char buf[2]; // 用于读取 GPIO 值的缓冲区

// 导出 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)
{
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); // 关闭文件
}

// 读取 GPIO 引脚的值
int gpio_read_value(char *arg)
{
sprintf(file_path, “%s/%s”, gpio_path, arg); // 构建文件路径,格式为 “gpio_path/arg”
fd = open(file_path, O_RDONLY); // 打开文件
if (fd < 0)
{
printf(“open file_path error\n”); // 打开文件失败
return -1;
}
ret = read(fd, buf, 1); // 读取文件内容到缓冲区
if (!strcmp(buf, “1”))
{
printf(“The value is high\n”); // GPIO 引脚值为高电平
return 1;
}
else if (!strcmp(buf,“0”))
{
printf(“The value is low\n”); // GPIO 引脚值为低电平
return 0;
}

close(fd); // 关闭文件
return -1;

}

int main(int argc, char *argv[]) // 主函数
{
int value;
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 引脚
}

gpio_ctrl("direction", "in");       // 配置 GPIO 为输入模式

value = gpio_read_value("value");   // 读取 GPIO 引脚的值
printf("The value is %d\n", value); // 打印读取的 GPIO 引脚的值
gpio_unexport(argv[1]);             // 最后取消导出 GPIO 引脚

return 0; // 返回 0 表示程序正常退出

}


使用 C 程序通过 sysfs 文件系统使用 GPIO 中断。



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

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

struct pollfd fds[1]; // poll结构体数组

// 导出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); // 写入引脚号到export文件
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); // 写入引脚号到unexport文件
if (ret < 0)
{
printf(“write /sys/class/gpio/unexport error \n”); // 写入失败
return -2;
}
close(fd); // 关闭文件
}

// 控制GPIO引脚的属性
int gpio_ctrl(char *arg, char *val)
{
sprintf(file_path, “%s/%s”, 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); // 写入属性值到属性文件
if (ret < 0)
{
printf(“write file_path error\n”); // 写入失败
return -2;
}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

[外链图片转存中…(img-pNaAotfv-1715595008569)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值