| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "io.h"
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdio.h>
- static int gpio_config(int gpio_id,const char *attr, const char *val)
- {
- char file_path[100];
- char gpio_path[100];
- int len;
- int fd;
- sprintf(file_path, "%s/%s", gpio_path, attr);
- if (0 > (fd = open(file_path, O_WRONLY))) {
- printf("open error");
- return fd;
- }
- len = strlen(val);
- if (len != write(fd, val, len)) {
- printf("write error");
- close(fd);
- return -1;
- }
- close(fd); //关闭文件
- return 0;
- }
- static int gpio_read_config(int gpio_id,const char *attr, int *val)
- {
- char tmp[4];
- char file_path[100];
- char gpio_path[100];
- int fd=-1;
- sprintf(file_path, "%s/%s", gpio_path, attr);
- if (0 > (fd = open(file_path, O_WRONLY))) {
- printf("open error");
- return fd;
- }
- if (read(fd, tmp, 1)<=0) {
- printf("read error");
- close(fd);
- return -1;
- }
- tmp[1] = 0;
- *val = atoi(tmp);
- close(fd); //关闭文件
- return 0;
- }
- /// @brief 初始化GPIO
- /// @param gpio_id
- /// @return
- int io_init(int gpio_id)
- {
- char gpio_path[100];
- sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
- //如果目录不存在 则需要导出
- if(access(gpio_path, F_OK))
- {
- int fd;
- int len;
- char id_buf[8];
- if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
- printf("open error");
- exit(-1);
- }
- sprintf(id_buf,"%d",gpio_id);
- len = strlen(id_buf);
- if (len != write(fd, id_buf, len)) {//导出gpio
- printf("write error");
- close(fd);
- exit(-1);
- }
- close(fd); //关闭文件
- }
- return 0;
- }
- /// @brief 释放GPIO
- /// @param gpio_id
- /// @return
- int io_deinit(int gpio_id)
- {
- char gpio_path[100];
- sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
- //如果目录不存在 则需要导出
- if(access(gpio_path, F_OK))
- {
- int fd;
- int len;
- char id_buf[8];
- if (0 > (fd = open("/sys/class/gpio/unexport", O_WRONLY))) {
- printf("open error");
- exit(-1);
- }
- sprintf(id_buf,"%d",gpio_id);
- len = strlen(id_buf);
- if (len != write(fd, id_buf, len)) {//导出gpio
- printf("write error");
- close(fd);
- exit(-1);
- }
- close(fd); //关闭文件
- }
- return 0;
- }
- /// @brief 设置GPIO方向
- /// @param gpio_id
- /// @param dir
- /// @return
- int io_set_dir(int gpio_id,int dir)
- {
- if(dir==0)
- gpio_config(gpio_id,"direction", "in");
- else if(dir==1)
- gpio_config(gpio_id,"direction", "out");
- return 0;
- }
- /// @brief 设置GPIO值
- /// @param gpio_id
- /// @param val
- /// @return
- int io_set_value(int gpio_id,int val)
- {
- if(val==0)
- gpio_config(gpio_id,"value", "0");
- else if(val==1)
- gpio_config(gpio_id,"value", "1");
- return 0;
- }
- /// @brief 获取GPIO值
- /// @param gpio_id
- /// @param val
- /// @return
- int io_get_value(int gpio_id,int* val)
- {
- gpio_read_config(gpio_id,"value",val);
- return 0;
- }
|