Linux GPIO控制

文章介绍了如何在Linux系统中通过sysfs接口来控制GPIO,包括向/export文件写入GPIO编号以映射到用户空间,以及使用direction和value文件来设定GPIO的方向和读写值。示例代码展示了配置和操作GPIO的具体步骤,如打开、写入相关文件。
摘要由CSDN通过智能技术生成

Linux标准使用 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间显示到用户空间,GPIO 的操作接口包括 direction 和 value 等,direction 控制 GPIO 方向,而 value 可控制 GPIO 输出或获得 GPIO 输入。文件 IO 方式操作 GPIO,通常使用到的4个函数为 open、close、read、write。

应用层代码简单使用示例如下 :

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include <assert.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <signal.h>
#include <semaphore.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <regex.h>
#include <libgen.h>
#include <poll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdbool.h>
#include <stdarg.h>
#include <math.h>
#include <getopt.h>
#include <ctype.h>


#include <sys/epoll.h>
#include <sys/timerfd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/syscall.h>
#include <sys/eventfd.h>
#include <sys/socket.h>
#include <sys/reboot.h>
#include <sys/resource.h>
#include <sys/prctl.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/un.h>
#include <sys/shm.h>
#include <stddef.h>

/* common bus head file
#include <linux/input.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <linux/spi/spidev.h>
#include <linux/sockios.h>
#include <linux/ethtool.h>
#include <linux/netlink.h>
*/

static int gpio_fd;
int Linux_Gpio_Config(char *pin, char *mode, char *value)
{
  static int dev_fd, export_fd, dir_fd, ret;
  char DEV_PATH[64], EXPORT_PATH[64], DIRECT_PATH[64];
  char buf[10];

  sprintf(DEV_PATH, "/sys/class/gpio/gpio%s/value", pin);
  sprintf(EXPORT_PATH, "/sys/class/gpio/export");
  sprintf(DIRECT_PATH, "/sys/class/gpio/gpio%s/direction", pin);
  export_fd = open(EXPORT_PATH, O_WRONLY);
  if(export_fd == -1)
  {
    perror("export open failed!\n");
    return -1;
  }
  write(export_fd, pin, strlen(pin));
  
  dev_fd = open(DEV_PATH, O_RDWR);
  if(dev_fd == -1)
  {
    perror("dev open faield!\n");
    return -1;
  }

  dir_fd = open(DIRECT_PATH, O_RDWR);
  if(dir_fd == -1)
  {
    perror("dir open failed!\n");
    return -1;
  }

  memset(buf, 0, sizeof(buf));
  strcpy(buf, mode);
  ret = write(dir_fd, buf, strlen(mode));
  if(ret == -1)
  {
    perror("dir write failed!\n");
    close(export_fd);
    close(dir_fd);
    close(dev_fd);
    return -1;
  }

  memset(buf, 0, sizeof(buf));
  strcpy(buf, value);
  ret = write(dev_fd, buf, strlen(value));
  if(ret == -1)
  {
    perror("dev write failed!\n");
    return -1;
  }

  close(export_fd);
  close(dir_fd);
  return dev_fd;
}


int main(int argc,char *argv[])
{
  int ret;
  gpio_fd = Linux_Gpio_Config("94", "out", "0");//example config gpio94
  ret = write(gpio_fd, "0", 1);//output 0
  if(ret == -1)
  {
    perror("dev write failed!\n");
    return -1;
  }
  ret = write(gpio_fd, "1", 1); //output 1
  if(ret == -1)
  {
    perror("dev write failed!\n");
    return -1;
  }
  return 0;
}

Linux GPIO驱动部分调用函数说明:

int gpiod_ get_ raw_value(const struct gpio_desc *desc)

void gpiod_set_ raw_value(struct gpio_desc *desc, int value)

int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)

void gpiod_set_ raw_value_cansleep(struct gpio_desc *desc, int value)

int gpiod_direction_ output_raw(struct gpio_desc *desc, int value)

raw- value的意思就是不在乎DTS里面的ACTIVE,我set高电平,就是高电平。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a2591748032-随心所记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值