Как управлять gpio встроенного Linux?

Следующие команды оболочки прекрасно переключают Leopardboard gpio 31:

echo 31 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio31/direction
echo 0 > /sys/class/gpio/gpio31/value
echo 1 > /sys/class/gpio/gpio31/value
echo 0 > /sys/class/gpio/gpio31/value

Это используется в качестве примера кода ниже. Есть идеи, почему следующий код .vala не отключает gpio 31?

public void sync () {
    int fd = -1;
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd < 0) {
        GLib.stdout.printf("Error sync export\n");
        return;
    }
    write(fd, "31", 3);
    close(fd);
    fd = open("/sys/class/gpio/gpio31/direction", O_WRONLY);
    if (fd < 0) {
        GLib.stdout.printf("Error sync direction\n");
        return;
    }
    write(fd, "out", 4);
    close(fd);
    fd = open("/sys/class/gpio/gpio31/value", O_WRONLY);
    if (fd < 0) {
        GLib.stdout.printf("Error sync value\n");
        return;
    }
    write(fd, "0", 2);
    write(fd, "1", 2);
    Thread.usleep (1000); /* 1ms */
    write(fd, "0", 2);
    close(fd);
}

person jacknad    schedule 24.07.2012    source источник


Ответы (1)


echo 31 на самом деле приведет к \x33\x31\x0a, но ваш вызов write запишет \x33\x31\x00. Попробуйте что-то вроде этого:

write(fd, "31\n", 3);

И вы захотите внести аналогичные коррективы в другие вызовы write.

person nemequ    schedule 25.07.2012