io.c 3.2 KB

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