io.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "io.h"
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. static int gpio_config(int gpio_id,const char *attr, const char *val)
  10. {
  11. char file_path[100];
  12. char gpio_path[100];
  13. int len;
  14. int fd;
  15. sprintf(file_path, "%s/%s", gpio_path, attr);
  16. if (0 > (fd = open(file_path, O_WRONLY))) {
  17. printf("open error");
  18. return fd;
  19. }
  20. len = strlen(val);
  21. if (len != write(fd, val, len)) {
  22. printf("write error");
  23. close(fd);
  24. return -1;
  25. }
  26. close(fd); //关闭文件
  27. return 0;
  28. }
  29. static int gpio_read_config(int gpio_id,const char *attr, int *val)
  30. {
  31. char tmp[4];
  32. char file_path[100];
  33. char gpio_path[100];
  34. int fd=-1;
  35. sprintf(file_path, "%s/%s", gpio_path, attr);
  36. if (0 > (fd = open(file_path, O_WRONLY))) {
  37. printf("open error");
  38. return fd;
  39. }
  40. if (read(fd, tmp, 1)<=0) {
  41. printf("read error");
  42. close(fd);
  43. return -1;
  44. }
  45. tmp[1] = 0;
  46. *val = atoi(tmp);
  47. close(fd); //关闭文件
  48. return 0;
  49. }
  50. /// @brief 初始化GPIO
  51. /// @param gpio_id
  52. /// @return
  53. int io_init(int gpio_id)
  54. {
  55. char gpio_path[100];
  56. sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
  57. //如果目录不存在 则需要导出
  58. if(access(gpio_path, F_OK))
  59. {
  60. int fd;
  61. int len;
  62. char id_buf[8];
  63. if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
  64. printf("open error");
  65. exit(-1);
  66. }
  67. sprintf(id_buf,"%d",gpio_id);
  68. len = strlen(id_buf);
  69. if (len != write(fd, id_buf, len)) {//导出gpio
  70. printf("write error");
  71. close(fd);
  72. exit(-1);
  73. }
  74. close(fd); //关闭文件
  75. }
  76. return 0;
  77. }
  78. /// @brief 释放GPIO
  79. /// @param gpio_id
  80. /// @return
  81. int io_deinit(int gpio_id)
  82. {
  83. char gpio_path[100];
  84. sprintf(gpio_path, "/sys/class/gpio/gpio%d", gpio_id);
  85. //如果目录不存在 则需要导出
  86. if(access(gpio_path, F_OK))
  87. {
  88. int fd;
  89. int len;
  90. char id_buf[8];
  91. if (0 > (fd = open("/sys/class/gpio/unexport", O_WRONLY))) {
  92. printf("open error");
  93. exit(-1);
  94. }
  95. sprintf(id_buf,"%d",gpio_id);
  96. len = strlen(id_buf);
  97. if (len != write(fd, id_buf, len)) {//导出gpio
  98. printf("write error");
  99. close(fd);
  100. exit(-1);
  101. }
  102. close(fd); //关闭文件
  103. }
  104. return 0;
  105. }
  106. /// @brief 设置GPIO方向
  107. /// @param gpio_id
  108. /// @param dir
  109. /// @return
  110. int io_set_dir(int gpio_id,int dir)
  111. {
  112. if(dir==0)
  113. gpio_config(gpio_id,"direction", "in");
  114. else if(dir==1)
  115. gpio_config(gpio_id,"direction", "out");
  116. return 0;
  117. }
  118. /// @brief 设置GPIO值
  119. /// @param gpio_id
  120. /// @param val
  121. /// @return
  122. int io_set_value(int gpio_id,int val)
  123. {
  124. if(val==0)
  125. gpio_config(gpio_id,"value", "0");
  126. else if(val==1)
  127. gpio_config(gpio_id,"value", "1");
  128. return 0;
  129. }
  130. /// @brief 获取GPIO值
  131. /// @param gpio_id
  132. /// @param val
  133. /// @return
  134. int io_get_value(int gpio_id,int* val)
  135. {
  136. gpio_read_config(gpio_id,"value",val);
  137. return 0;
  138. }