GPIO使用Sample Code
-
编译gpio.c生成gpio。
-
执行./gpio
-
当echo 1 > value,读出来不是1,或者echo 0 > value,读出来不是0,则会打印一行红色字体的Log。
gpio.c代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <fcntl.h> #include <unistd.h> BOOL gexit; int GPIO_request(int volatile num) { int gpiofd = -1; char buf[3]; sprintf(buf, "%d", num); gpiofd = open("/sys/class/gpio/export", O_WRONLY); if(gpiofd == -1) { // fail to open gpio device printf("fail to open device!\n"); return -1; } //printf("open success!\r\n"); write(gpiofd, buf, sizeof(buf)); printf("/******************************************/"); printf("gpio_request success,pin num = %d\n", num); close(gpiofd); return 0; } int GPIO_set_direct(int volatile num, char* direct) { int fd = -1; char path[30]; sprintf(path, "/sys/class/gpio/gpio%d/direction", num); printf("path = %s\n", path); fd = open(path, O_WRONLY); if(fd == -1) { // fail to open watchdog device printf("fail to device!\n"); return -1; } write(fd, direct, sizeof(direct)); //printf("gpio_direction is %s\n", direct); close(fd); return 0; } int GPIO_set_value(int volatile num, int value) { FILE* fd = NULL; char buf = '0'; char path[40]; //printf("num=%d\n", num); sprintf(&buf, "%d", value); snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", num); //printf("path = %s\n", path); //printf("value = %c\n", buf); fd = fopen(path, "wb"); if(fd == NULL) { // fail to open device printf("fail to open value device!\n"); return -1; } fwrite(&buf, 1, 1, fd); printf("gpio_set %c\n", buf); fclose(fd); return 0; } int GPIO_get_value(int volatile num) { FILE* file = NULL; char buf[10] = {0}; char path[50] = {0}; sprintf(path, "/sys/class/gpio/gpio%d/value", num); file = fopen(path, "rb"); if(file == NULL) { // fail to open watchdog device printf("GPIO_get_value: fail to open!\n"); return -1; } fseek(file, 0, SEEK_END); //文件指针转到文件末尾 int len = ftell(file); rewind(file); fread(buf, 1, len, file); printf("GPIO_get_value:gpio_value is %s\n", buf); fclose(file); return atoi(buf); } int GPIO_cancel(int volatile num) { int gpiofd = -1; char buf[3]; sprintf(buf, "%d", num); gpiofd = open("/sys/class/gpio/unexport", O_WRONLY); if(gpiofd == -1) { // fail to open watchdog device printf("has no this gpio!\n"); return -1; } write(gpiofd, buf, sizeof(buf)); printf("GPIO %d cancel!\r\n", num); close(gpiofd); return 0; } int GPIO_Read(int volatile num) { int value; GPIO_request(num); GPIO_set_direct(num, "in"); value = GPIO_get_value(num); GPIO_cancel(num); return value; } int GPIO_Write(int volatile num, int value) { GPIO_request(num); GPIO_set_direct(num, "out"); int ret = GPIO_set_value(num, value); if(ret < 0) { printf("fail to write!\n"); return -1; } GPIO_cancel(num); return 0; } int main(int argc, char* argv[]) { int gpio_num = 0,gpio_set_value=0,gpio_get_value=0; int ret = 0; if(argc == 3) { gpio_num = atoi(argv[1]); gpio_set_value = atoi(argv[2]); printf("test gpio%d.....\n",gpio_num); GPIO_request(gpio_num); GPIO_set_direct(gpio_num, "out"); ret = GPIO_set_value(gpio_num, gpio_set_value); if(ret < 0) { printf("fail to write!\n"); } return 0; } for(;gpio_num < 126;gpio_num++) { if(gpio_num==3 || gpio_num==2)continue; // for I6e,this is PAD_PM_UART_TX PAD_PM_UART_RX sleep(1); GPIO_request(gpio_num); GPIO_set_direct(gpio_num, "out"); for(gpio_set_value=0;gpio_set_value<2;gpio_set_value++) { ret = GPIO_set_value(gpio_num, gpio_set_value); if(ret < 0) { printf("fail to write!\n"); continue; } gpio_get_value = GPIO_get_value(gpio_num); if(gpio_get_value != gpio_set_value) { printf("\033[0;31m""gpio_get_value != gpio_set_value : %d != %d\n",gpio_get_value,gpio_set_value); printf("\033[0m"); } } GPIO_cancel(gpio_num); } } /* void help(void) { printf("./gpio num direct value\n"); printf("num :the number of gpio you want to request. \n"); printf("direct:the direction of gpio.\n"); printf("value :if the direction was set to 'out',the value should be set '0 or 1'\n"); printf("for example:\n"); printf(" ./gpio 13 in :set gpio13 as in\n"); printf(" ./gpio 13 out 0 :set gpio13 as out and set value to 0\n"); } void* getGpioValue(void* argv) { int num, value; num = *(int*)argv; while(gexit) { value = GPIO_get_value(num); printf("getGpioValue is %d\n", value); } return NULL; } int main(int argc, char* argv[]) { #if 1 int num, value; pthread_t pthread; if(argc < 3) { help(); exit(0); } num = atoi(argv[1]); GPIO_request(num); if(strcmp(argv[2], "out") == 0) //配置端口为输出 { value = atoi(argv[3]); GPIO_set_direct(num, "out"); GPIO_set_value(num, value); } else if(strcmp(argv[2], "in") == 0) //配置端口输入 { //创建线程,轮询该接口的值,并输出。 gexit = 1; pthread_create(&pthread, NULL, getGpioValue, (void*)&num); } else { printf("argv[2] %d is not ok!\r\n", num); exit(0); } while(1) { char ch; scanf("%c", &ch); if('q' == ch || 'Q' == ch) break; } gexit = 0; GPIO_cancel(num); #else int volatile num, value; printf("GPIO read........\n"); num = atoi(argv[1]); value = atoi(argv[2]); GPIO_Read(num); sleep(2); printf("\n\n"); printf("GPIO write........\n"); GPIO_Write(num, value); #endif return 0; } */