GPIO控制接口代码接口

可以通过以下接口控制gpio高低电平

static int sys_gpio_write(int pin, int value)
{
    static const char values_str[] = "01";
    char path[BUFFER_MAX] = {0};
    int fd;

    snprintf(path, BUFFER_MAX, "/sys/class/gpio/gpio%d/value", pin);
    fd = open(path, O_WRONLY);
    if (fd < 0) {
        printf("failed to open gpio value for writing!\n");
        return -1;
    }

    if (write(fd, &values_str[value == 0 ? 0 : 1], 1) < 0) {
        printf("failed to write value!\n");
        return -1;
    }
    close(fd);
    return 0;
}

static int sys_gpio_export(int pin)
{
    char buffer[BUFFER_MAX] = {0};
    int len;
    int fd;

    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd < 0) {
        printf("Failed to open export for writing!\n");
        return (-1);
    }

    len = snprintf(buffer, BUFFER_MAX, "%d", pin);

    if (write(fd, buffer, len) < 0) {
        printf("Fail to export gpio!\n");
        return -1;
    }

    close(fd);
    return 0;
}

static int sys_gpio_direction(int pin, int dir)
{
    static const char dir_str[] = "in\0out";
    char path[BUFFER_MAX] = {0};
    int fd;

    snprintf(path, BUFFER_MAX, "/sys/class/gpio/gpio%d/direction", pin);

    fd = open(path, O_WRONLY);
    if (fd < 0) {
        printf("failed to open gpio direction for writing!\n");
        return -1;
    }

    if (write(fd, &dir_str[dir == IN ? 0 : 3], dir == IN ? 2 : 3) < 0) {
        printf("failed to set direction!\n");
        return -1;
    }
    close(fd);
    return 0;
}

static int set_gpio(int pin, int val)
{
    int retval = 0;
    char buffer[BUFFER_MAX] = {0};

    retval = access("/sys/class/gpio", 0);
    if (-1 == retval) {
        printf("/sys/class/gpio file does not exist\n");
        return -1;
    }
    snprintf(buffer, BUFFER_MAX, "/sys/class/gpio/gpio%d", pin);
    retval = access(buffer, 0);
    if (-1 == retval) {
        sys_gpio_export(pin);
        sys_gpio_direction(pin, OUT);
    }
    sys_gpio_write(pin, val);

    return 1;
}

此操作示例通过命令实现对GPIO的读写操作
步骤 1. 在控制台使用echo命令将要操作的GPIO编号export:

echo N > /sys/class/gpio/export 
N为要操作的GPIO编号,该编号等于GPIO组号 * 8 + 组内偏移号,例如GPIO4_2编号为4 * 8 + 2 = 34。
export之后就会生成/sys/class/gpio/gpioN目录
例如:exportGPIO4_2:
echo 34 > /sys/class/gpio/export

步骤 2. 在控制台使用echo命令设置GPIO方向:

   对于输入:echo in > /sys/class/gpio/gpioN/direction
   对于输出:echo out > /sys/class/gpio/gpioN/direction
例如:设置GPIO4_2方向
−	对于输入:echo in > /sys/class/gpio/gpio34/direction
−	对于输出:echo out > /sys/class/gpio/gpio34/direction

步骤 3. 在控制台使用cat或echo命令查看GPIO输入值或设置GPIO输出值:

查看输入值:cat /sys/class/gpio/gpioN/value
输出低:echo 0 > /sys/class/gpio/gpioN/value
输出高:echo 1 > /sys/class/gpio/gpioN/value

步骤 4. 在控制台使用echo命令将操作的GPIO编号unexport:

echo N > /sys/class/gpio/unexport
发布了95 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ding283595861/article/details/103673369
今日推荐