15. GPIO 应用编程
1. 应用层如何操控 GPIO
GPIO 也是通过 sysfs 方式进行操控的,在/sys/class/gpio
目录下
- gpiochipX: I.MX6UL 有 5 个 GPIO,X 由小到大分别对应 1 ~ 5 GPIO,随便进入一个目录,可以看到一些属性文件,这里介绍 3 个
- base: 与 X 相同,表示该控制器所管理的这组 GPIO 引脚中最小的编号
- label: 该组 GPIO 的名字
- ngpio: 所管理的 GPIO 引脚的数量,范围是 base ~ base + ngpio -1
- export: 用于将指定编号的 GPIO 引脚导出。使用 gpio 引脚之前,需要将其导出。export 是只写文件,不能读取,将一个指定的 X 写入到 export 文件中即可将对应的 gpio 引脚导出,导出之后可以发现在 gpio 目录下生成了一个新的目录,就是导出的 gpio 引脚对应的目录。不是所有的引脚都可以导出,如果对应的 GPIO 已经在内核中被使用,是无法成功导出的。
- unexport: 将导出的引脚剔除,也是只写文件。
- gpioX: 这是导出后生成的目录,这里只关心 4 个文件
- direction: 配置 GPIO 引脚为输入
in
或输出out
模式。该文件可读可写。echo "out" > direction
- value: 在输出模式下,写 0 表示输出低电平,写 1 表示输出高电平
echo "in" > direction echo "1" > value
- active_low: 用于控制极性,可读可写,默认情况为 0,此时 value=1 表示输出高电平;为 1 时,value=1 输出低电平。
- edge: 控制中断的触发模式,该文件可读可写。配置该文件之前,需要将 GPIO 设置为输入模式。
echo "none" > edge # 非中断引脚 echo "rising" > edge # 上升沿触发 echo "falling" > edge # 下降沿触发 echo "both" > edge # 边沿触发
- direction: 配置 GPIO 引脚为输入
2. GPIO 应用编程之输出
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
using namespace std;
char *gpio_path;
char *attr_path;
void USAGE(char *argv[])
{
printf("usage: %s GPIO编号 输出电平\n",argv[0]);
}
void set(char *path,char *str)
{
sprintf(attr_path,"gpio_pat