适用于Linux的GPIO示例代码

时间:2013-10-07 07:10:43

标签: c linux

static int
GPIOUnexport(int pin)
{
    char buffer[BUFFER_MAX];
    ssize_t bytes_written;
    int fd;

    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    if (-1 == fd) {
        fprintf(stderr, "Failed to open unexport for writing!\n");
        return(-1);
    }

    bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
    write(fd, buffer, bytes_written);
    close(fd);
    return(0);
}

我有一些与上述GPIO代码相关的问题

1)为什么要使用ssize_t?为什么不直接使用int?

2)是/ sys / class / gpio / unexport“系统文件?如果不是它的话?

3)snprintf将某些东西打印到缓冲区,然后写入函数是多余的?或者什么写功能可以做不同的事情?

4)而不是使用open,我可以使用ioctl函数吗?

1 个答案:

答案 0 :(得分:1)

  1. 我不知道为什么代码示例使用ssize_t; snprintf的返回类型为int,因此使用int会更好(避免隐式转换)。 ssize_t已签名,在大多数情况下,它至少与int一样大,因此可能没有任何损害。

  2. 是的,它是Linux上的系统文件。将GPIO引脚的编号写入此文件将从通用GPIO驱动程序“取消导出”GPIO引脚,从而有效地使驱动程序声明它将不再处理该引脚(允许其他GPIO驱动程序使用它)。

  3. 您可以使用dprintf直接写入文件描述符fd,然后就不需要临时缓冲区了。 dprintf对其他printf变体的了解程度较低,这可能就是为什么原始代码的作者决定使用中间缓冲区然后只调用标准的低级write函数

  4. 您的意思是什么ioctl功能?