美文网首页
【C】通过linux文件系统操作GPIO

【C】通过linux文件系统操作GPIO

作者: snoopy_zc | 来源:发表于2016-07-27 16:13 被阅读273次

本文描述如果通过文件IO sysfs方式控制树莓派 GPIO端口。通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入。

参考博文:树莓派学习笔记——使用文件IO操作GPIO SysFs方式

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_MAX 100
#define DIRECTION_MAX 100
#define IN 0
#define OUT 1
#define LOW 0
#define HIGH 1
#define POUT 21

static int gpio_export(int pin);
static int gpio_unexport(int pin);
static int gpio_direction(int pin, int dir);
static int gpio_write(int pin, int value);
static int gpio_read(int pin);
/*
int main(int argc, char const *argv[])
{
        int i = 0;  
      
    gpio_export(POUT);  
    gpio_direction(POUT, OUT);  
      
    for (i = 0; i < 20; i++) {  
        gpio_write(POUT, i % 2);  
        usleep(500 * 1000);  
    }  
  
    gpio_unexport(POUT);  
    return 0;
}
*/
static int gpio_export(int pin)  
{  
    char buffer[BUFFER_MAX];  
    int len;  
    int fd;  
  
    fd = open("/sys/class/gpio/export", O_WRONLY);  
    if (fd < 0) {  
        fprintf(stderr, "Failed to open export for writing!\n");  
        return(-1);  
    }  
  
    len = snprintf(buffer, BUFFER_MAX, "%d", pin);  
    if (write(fd, buffer, len) < 0) {  
        fprintf(stderr, "Fail to export gpio!");  
        return -1;  
    }  
     
    close(fd);  
    return 0;  
}  

static int gpio_unexport(int pin)  
{  
    char buffer[BUFFER_MAX];  
    int len;  
    int fd;  
  
    fd = open("/sys/class/gpio/unexport", O_WRONLY);  
    if (fd < 0) {  
        fprintf(stderr, "Failed to open unexport for writing!\n");  
        return -1;  
    }  
  
    len = snprintf(buffer, BUFFER_MAX, "%d", pin);  
    if (write(fd, buffer, len) < 0) {  
        fprintf(stderr, "Fail to unexport gpio!");  
        return -1;  
    }  
     
    close(fd);  
    return 0;  
}  

static int gpio_direction(int pin, int dir)
{
    static const char dir_str[] = "in\0out";
    char path[DIRECTION_MAX];
    int fd;

    snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin);
    fd = open(path, O_WRONLY);
    if (fd < 0) {
        fprintf(stderr, "failed to open gpio direction for writing!\n");
        return -1;
    }

    if (write(fd, &dir_str[dir == IN ? 0 : 3], dir == IN ? 2 : 3) < 0) {
        fprintf(stderr, "failed to set direction!\n");
        return -1;
    }

    close(fd);
    return 0;
}

static int gpio_write(int pin, int value)  
{  
    static const char values_str[] = "01";  
    char path[DIRECTION_MAX];  
    int fd;  
  
    snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);  
    fd = open(path, O_WRONLY);  
    if (fd < 0) {  
        fprintf(stderr, "failed to open gpio value for writing!\n");  
        return -1;  
    }  
  
    if (write(fd, &values_str[value == LOW ? 0 : 1], 1) < 0) {  
        fprintf(stderr, "failed to write value!\n");  
        return -1;  
    }  
  
    close(fd);  
    return 0;  
}  

static int gpio_read(int pin)  
{  
    char path[DIRECTION_MAX];  
    char value_str[3];  
    int fd;  
  
    snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/value", pin);  
    fd = open(path, O_RDONLY);  
    if (fd < 0) {  
        fprintf(stderr, "failed to open gpio value for reading!\n");  
        return -1;  
    }  
  
    if (read(fd, value_str, 3) < 0) {  
        fprintf(stderr, "failed to read value!\n");  
        return -1;  
    }  
  
    close(fd);  
    return (atoi(value_str));  
}  

相关文章

  • 【C】通过linux文件系统操作GPIO

    本文描述如果通过文件IO sysfs方式控制树莓派 GPIO端口。通过sysfs方式控制GPIO,先访问/sys/...

  • linux GPIO

    GPIO(文件IO方式) gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映...

  • openwrt 命令行控制GPIO

    一、在openwrt文件系统中通过内核提供的接口操作GPIO 1、导出GPIO11目录 控制GPIO 1).cd ...

  • Linux基础知识

    Linux文件系统 Linux文件系统简介 在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘...

  • Linux运维之道(14)——Linux文件系统管理

    @(Linux)[文件系统管理] 1. 文件系统 1.1 各个操作系统上的文件系统 Linux文件系统 ext2 ...

  • L3. gpio_key按键驱动

    1.gpio_key.c介绍 1.1 功能介绍 Linux内核下的 drivers/input/keyboard/...

  • 文件总结

    文件的操作,首先我最先想到学操作系统的时候,文件的管理。c语言文件的管理,linux系统文件的管理。 文件系统是操...

  • Linux下常用文件系统介绍

    Linux教程:http://www.fdlly.com/m/linux Linux下常用文件系统介绍 不同的操作...

  • 迅为IMX6ULL开发板C程序调用shell

    本章节介绍的是在 linux 系统环境下 linux-C 调用 shell 命令控制GPIO输入输出步骤。shel...

  • 嵌入式系统学习进阶

    1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉...

网友评论

      本文标题:【C】通过linux文件系统操作GPIO

      本文链接:https://www.haomeiwen.com/subject/qybojttx.html