Skip to main content
 首页 » 编程设计

Android GPIO学习——用户空间操作

2022年07月19日46zhoujg

Kernel: 4.4

Soc: msm8996

1.用户空间通过sysfs操作GPIO

(1)启用GPIO sysfs interface

首先看系统中有没有“/sys/class/gpio”这个文件夹。如果没有在编译内核的时候打开 Device Drivers-> GPIO Support-> /sys/class/gpio/… (sysfs interface),使能 CONFIG_GPIO_SYSFS

obj-$(CONFIG_GPIO_SYSFS)+= gpiolib-sysfs.o

(2)用户空间通过sysfs控制GPIO

# echo 9 > /sys/class/gpio/export     执行此命令会在gpio/下生成gpio9目录

# echo out > gpio9/direction             设置GPIO9方向为输出

# echo 1 > gpio9/value                          设置GPIO9为高电平

# echo 0 > gpio9/value                          设置GPIO9为低电平

# echo 9 > /sys/class/gpio/unexport     关闭对GPIO9的控制

(3)用户空间编程控制GPIO

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
 
#define GPIO9    9 
 
int main(void) 
{ 
    FILE *filep = NULL; 
    int i=0; 
 
    filep = fopen("/sys/class/gpio/export", "w"); 
    fprintf(filep, "%d", GPIO9); 
    fclose(filep); 
 
    filep = fopen("/sys/class/gpio/gpio9/direction", "w"); 
    fprintf(filep, "out"); 
    fclose(filep); 
 
    for(i = 0; i < 50; i++) 
    { 
        printf("gpio9 value is 1.\n"); 
        filep = fopen("/sys/class/gpio/gpio9/value", "w"); 
        fprintf(filep,"%d",1); 
        sleep(1); 
        fclose(filep); 
 
        printf("gpio9 value is 0.\n"); 
        filep = fopen("/sys/class/gpio/gpio9/value", "w"); 
        fprintf(filep, "%d", 0); 
        sleep(1); 
        fclose(filep); 
 
    } 
 
    filep = fopen("/sys/class/gpio/unexport", "w"); 
    fprintf(filep, "%d", GPIO9); 
    fclose(filep); 
 
    return 0; 
}

2. GPIO使用总结

(1)每个GPIO引脚只能使用gpio_request获取一次,第二次获取就会报-EBUSY,如果知道已经获取了,那么就直接可以使用gpio_set_value()来控制GPIO引脚电平。

(2)使用regulator-fix probe的GPIO无法通过这种sysfs接口来设置GPIO的值,就是更改不了其值。

3. Qcom平台需要打开"OEM解锁"后导出gpio号才能成功。若是没有打开OEM解锁,执行会成功,但是就是不会导出sysfs。刷机后首次开机,导出无效,重启后才行。


本文参考链接:https://www.cnblogs.com/hellokitty2/p/10535903.html