欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > RK3568技术笔记十九 SYSFS的方式使用GPIO

RK3568技术笔记十九 SYSFS的方式使用GPIO

2025/2/23 7:07:42 来源:https://blog.csdn.net/vfatfish/article/details/139993539  浏览:    关键词:RK3568技术笔记十九 SYSFS的方式使用GPIO

编写应用程序使用 GPIOLIB 操作 GPIO 引脚可以分为几个关键步骤,这里我将提供一个基本的示例程序来说明如何在 Linux 环境下使用 GPIOLIB。

1. 编写应用程序

首先,你需要创建一个 C 语言的应用程序,例如 `gpio_example.c`。

2. 包含必要的头文件

在程序的开头,你需要包含 Linux 内核提供的相关头文件,以及一些基本的头文件。

下面代码都是基于C语言的。其他语言请参考帮助文件。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <linux/gpio.h>
#include <sys/ioctl.h>

3. 定义 GPIO 相关参数

定义一些与 GPIO 相关的参数,如 GPIO 的编号、方向等。

#define GPIO_CHIP_NAME  "/dev/gpiochip0"  // GPIO 控制器设备节点
#define GPIO_LINE_OFFSET  10              // GPIO 引脚偏移量(示例)
#define GPIO_DIRECTION_OUT  1             // GPIO 输出方向
#define GPIO_DIRECTION_IN   0             // GPIO 输入方向int gpio_fd;  // GPIO 控制器设备文件描述符

4. 打开 GPIO 控制器设备节点

打开 GPIO 控制器的设备节点,获取设备文件描述符。

gpio_fd = open(GPIO_CHIP_NAME, O_RDONLY);
if (gpio_fd < 0) {perror("Failed to open GPIO device");return EXIT_FAILURE;
}

5. 设置 GPIO 引脚方向

使用 `ioctl()` 系统调用设置 GPIO 引脚的方向,这里以输出方向为例。

struct gpiohandle_request req;
struct gpiohandle_data data;
int ret;memset(&req, 0, sizeof(req));
req.lineoffsets[0] = GPIO_LINE_OFFSET; // GPIO 引脚偏移量
req.lines = 1;                         // 单个 GPIO 引脚
req.flags = GPIOHANDLE_REQUEST_OUTPUT; // 请求输出方向ret = ioctl(gpio_fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
if (ret < 0) {perror("Failed to get GPIO line handle");close(gpio_fd);return EXIT_FAILURE;
}

6. 控制 GPIO 引脚状态

设置 GPIO 引脚的输出状态,这里以设置高电平为例。

memset(&data, 0, sizeof(data));
data.values[0] = 1;  // 设置为高电平ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
if (ret < 0) {perror("Failed to set GPIO line values");close(gpio_fd);return EXIT_FAILURE;
}

7. 关闭 GPIO 控制器设备节点

最后,在程序结束时关闭 GPIO 控制器的设备节点。

close(gpio_fd);

8. 完整示例代码

下面是一个完整的示例代码,演示如何打开 GPIO 控制器、设置 GPIO 引脚方向和状态,然后关闭 GPIO 控制器。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <linux/gpio.h>
#include <sys/ioctl.h>#define GPIO_CHIP_NAME  "/dev/gpiochip0"  // GPIO 控制器设备节点
#define GPIO_LINE_OFFSET  10              // GPIO 引脚偏移量(示例)
#define GPIO_DIRECTION_OUT  1             // GPIO 输出方向
#define GPIO_DIRECTION_IN   0             // GPIO 输入方向int gpio_fd;  // GPIO 控制器设备文件描述符void cleanup(int sig) {if (gpio_fd > 0)close(gpio_fd);exit(0);
}int main() {struct gpiohandle_request req;struct gpiohandle_data data;int ret;signal(SIGINT, cleanup);// 打开 GPIO 控制器设备节点gpio_fd = open(GPIO_CHIP_NAME, O_RDONLY);if (gpio_fd < 0) {perror("Failed to open GPIO device");return EXIT_FAILURE;}// 设置 GPIO 引脚方向为输出memset(&req, 0, sizeof(req));req.lineoffsets[0] = GPIO_LINE_OFFSET; // GPIO 引脚偏移量req.lines = 1;                         // 单个 GPIO 引脚req.flags = GPIOHANDLE_REQUEST_OUTPUT; // 请求输出方向ret = ioctl(gpio_fd, GPIO_GET_LINEHANDLE_IOCTL, &req);if (ret < 0) {perror("Failed to get GPIO line handle");close(gpio_fd);return EXIT_FAILURE;}// 设置 GPIO 引脚输出高电平memset(&data, 0, sizeof(data));data.values[0] = 1;  // 设置为高电平ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);if (ret < 0) {perror("Failed to set GPIO line values");close(gpio_fd);return EXIT_FAILURE;}// 等待一段时间,演示输出高电平的效果sleep(5);// 关闭 GPIO 控制器设备节点close(gpio_fd);return EXIT_SUCCESS;
}

9.  编译和运行

将以上代码保存为 `gpiolib_test.c` 文件,然后使用交叉编译工具链,并运行生成的可执行文件。

Arm-linux-gcc -o gpio_example gpio_example.c//交叉编译

./gpio_example//放到SAIL-RK3568上运行。

这样,你就能在 Linux 环境下编写和运行一个使用 GPIOLIB 操作 GPIO 引脚的应用程序了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词