#include "io.h" #include #include #include #include #include #include #include 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; }