GPIO使用Sample Code

  1. 编译gpio.c生成gpio。

  2. 执行./gpio

  3. 当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;
    }
    */