测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android

简介: 测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android

当时这个测试程序是给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

相关文章
|
1天前
|
机器学习/深度学习 人工智能 测试技术
提升软件测试效率:智能化测试工具的应用与展望
【5月更文挑战第19天】 在快速发展的软件行业中,保证产品质量的同时提高测试效率已成为一个关键挑战。传统的手动测试方法由于其耗时且易出错的局限性,逐渐不能满足现代软件开发的需求。智能化测试工具的出现为解决这一问题提供了新的思路。本文将探讨智能化测试工具如何通过自动化和人工智能技术优化测试流程,减少重复性工作,并预测未来测试工具的发展趋势。我们将分析这些工具在实际应用中的表现,以及它们对提高软件测试效率和准确性的潜在影响。
17 8
|
4天前
|
敏捷开发 Java Devops
深入理解与应用软件测试中的Mock技术
【5月更文挑战第17天】 在现代软件开发过程中,单元测试是保证代码质量的重要手段。然而,对于依赖外部系统或服务的功能,如何有效进行单元测试一直是一大挑战。Mock技术的引入为这一难题提供了解决方案。本文将详细探讨Mock技术的概念、应用场景以及在实际软件测试中的优势和局限性,同时提供一些最佳实践和常见框架的使用指南。
|
4天前
|
Java 测试技术 数据库
深入理解与应用软件测试中的Mock对象
【5月更文挑战第17天】在软件开发过程中,单元测试是确保代码质量的重要环节。本文将深入探讨Mock对象在软件测试中的应用,分析其对提升测试效率和准确性的重要性。通过具体案例,我们将了解如何创建和使用Mock对象,以及它们如何帮助开发者隔离依赖,模拟外部系统行为,从而使得单元测试更加高效和可靠。
|
4天前
|
测试技术
深入理解与应用软件测试中的边界值分析法
【5月更文挑战第16天】 在追求软件产品质量的道路上,边界值分析法(Boundary Value Analysis, BVA)作为一种高效的测试设计技术,因其独特的关注点和较高的缺陷检出率而备受青睐。本文将探讨BVA的核心概念、操作流程及其在多变的测试场景中的应用优势。通过深入剖析边界值分析法的原理和执行步骤,揭示其在发现潜藏于输入、输出范围边界的软件缺陷方面的有效性,并讨论如何结合其他测试方法以优化测试覆盖率。文章还将展示通过案例分析和统计数据支撑的BVA应用效果,以及在实践中应注意的问题和可能的改进方向。
6 0
|
6天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
17 2
|
6天前
|
测试技术
深入理解与应用软件测试中的边界值分析法
【5月更文挑战第14天】 在软件开发的生命周期中,确保代码质量和功能正确性是至关重要的。本文将深入探讨一种高效的软件测试技术——边界值分析法(Boundary Value Analysis, BVA)。不同于通常的摘要形式,此部分将直接引导读者了解BVA的核心原理、应用方法及其在实际工作中的重要性。通过分析边界条件引发的缺陷案例,我们揭示了如何利用BVA提高测试覆盖率,优化测试用例设计,从而提升软件测试的有效性和效率。
|
6天前
|
Linux 测试技术 Windows
LabVIEW对NI Linux RT应用程序性能进行基准测试
LabVIEW对NI Linux RT应用程序性能进行基准测试
|
6天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
5天前
|
测试技术
如何管理测试用例?测试用例有什么管理工具?YesDev
该文档介绍了测试用例和测试用例库的管理。测试用例是描述软件测试方案的详细步骤,包括测试目标、环境、输入、步骤和预期结果。测试用例库用于组织和管理这些用例,强调简洁性、完整性和可维护性。管理者可以创建、删除、重命名用例库,搜索和管理用例,以及通过层级目录结构来组织用例。此外,还支持通过Excel导入和导出测试用例,以及使用脑图查看用例关系。后台管理允许配置全局别名,如用例状态、优先级和执行结果。