当时这个测试程序是给Linux用户的示例 , 还有个对应的driver 。
程序功能介绍
这个程序是用来控制一些GPIO引脚和电源LED的。它接受两个或三个参数,分别是命令、GPIO编号和GPIO值。它会根据参数的设置,打开一个设备文件,并使用ioctl函数来执行相应的操作。它支持四种命令,分别是:
- 0: 读取输入GPIO的值
- 1: 设置输出GPIO的值
- 2: 获取输出GPIO的值
- 3: 设置电源LED的状态
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <linux/ioctl.h> #define IOCTL_READ_GPIO _IOR('a', 0, int *) #define IOCTL_SET_GPIO _IOW('a', 1, int *) #define IOCTL_GET_GPIO _IOR('a', 2, int *) #define IOCTL_SET_POWER_LED _IOW('a', 3, int *) int main(int argc, char *argv[]) { int file_desc; int gpio_val[2]; // 打开设备文件 file_desc = open("/dev/rockchip_gpio", 0); if (file_desc < 0) { printf("无法打开设备文件: /dev/rockchip_gpio"); exit(-1); } // 检查参数数量 if (argc < 3) { printf("参数数量不足\n"); exit(-1); } // 根据命令执行相应操作 switch (atoi(argv[1])) { case 0: // 读取输入GPIO gpio_val[0] = atoi(argv[2]); if (gpio_val[0] < 1 || gpio_val[0] > 4) { printf("无效的输入GPIO编号: %d\n", gpio_val[0]); exit(-1); } gpio_val[0] = gpio_val[0] - 1; if (ioctl(file_desc, IOCTL_READ_GPIO, &gpio_val) == -1) { printf("读取GPIO失败\n"); exit(-1); } printf("输入GPIO %d 的值为 %d\n", gpio_val[0] + 1, gpio_val[1]); break; case 1: // 设置输出GPIO if (argc < 4) { printf("参数数量不足\n"); exit(-1); } gpio_val[0] = atoi(argv[2]); gpio_val[1] = atoi(argv[3]); if (gpio_val[0] < 1 || gpio_val[0] > 4) { printf("无效的输出GPIO编号: %d\n", gpio_val[0]); exit(-1); } gpio_val[0] = gpio_val[0] - 1; if (ioctl(file_desc, IOCTL_SET_GPIO, &gpio_val) == -1) { printf("设置GPIO失败\n"); exit(-1); } printf("设置输出GPIO %d 的值为 %d\n", gpio_val[0] + 1, gpio_val[1]); break; case 2: // 获取输出GPIO的值 gpio_val[0] = atoi(argv[2]); if (gpio_val[0] < 1 || gpio_val[0] > 4) { printf("无效的输出GPIO编号: %d\n", gpio_val[0]); exit(-1); } gpio_val[0] = gpio_val[0] - 1; if (ioctl(file_desc, IOCTL_GET_GPIO, &gpio_val) == -1) { printf("获取GPIO值失败\n"); exit(-1); } printf("输出GPIO %d 的值为 %d\n", gpio_val[0] + 1, gpio_val[1]); break; case 3: // 设置电源LED的状态 gpio_val[0] = atoi(argv[2]); if (ioctl(file_desc, IOCTL_SET_POWER_LED, &gpio_val) == -1) { printf("设置电源LED失败\n"); exit(-1); } printf("设置电源LED的状态为 %d\n", gpio_val[0]); break; default: printf("无效的命令\n"); } // 关闭设备文件 close(file_desc); return 0; }
使用示例
要编译这个程序,需要在终端中输入:
./gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -o gpio gpio.c
要运行这个程序,需要在终端中输入:
./gpio [command] [gpio_num] [gpio_val]
其中:
- command: 命令编号,0~3之间的整数
- gpio_num: GPIO编号,1~4之间的整数
- gpio_val: GPIO值,0或1
例如:
./gpio 0 1 # 读取输入GPIO 1 的值
./gpio 1 2 1 # 设置输出GPIO 2 的值为 1
./gpio 2 3 # 获取输出GPIO 3 的值
./gpio 3 0 # 设置电源LED的状态为 0
然后就可以看到类似下面的输出
输入GPIO 1 的值为 0
设置输出GPIO 2 的值为 1
输出GPIO 3 的值为 0
设置电源LED的状态为 0