Возникли проблемы с моим кодом C для КНОПКИ PUSH и светодиодом для встроенной платы SAMA5D27 - PullRequest
0 голосов
/ 19 сентября 2019

Я использую SAMA5D27-SOM1-EK1 встроенную плату.Я разработал код C, который дает мне возможность управлять светодиодом с помощью кнопки.

зеленый светодиод на ПИН 33 , красный светодиод на ПИН 10 , Кнопка находится на PIN 29 .

Вот код:

/*
 * A simple application for Key scan and led on/off control using:
 * - input event interface for buttons 
 * - led sysfs class in /sys/class/leds for leds
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>

#include <linux/input.h>

#define BTN_FILE_PATH "/dev/input/event0"
#define LED_PATH "/sys/class/leds"
#define red "red"
#define green "green"

void change_led_state(char *led_path, int led_value)
{
    char    lpath[64];
    FILE    *led_fd;

    strncpy(lpath, led_path, sizeof(lpath) - 1);
    lpath[sizeof(lpath) - 1] = '\0';

    led_fd = fopen(lpath, "w");

    if (led_fd == NULL) {
        fprintf(stderr, "simplekey: unable to access led\n");
        return;
    }

    fprintf(led_fd, "%d\n", led_value);

    fclose(led_fd);
}

void reset_leds(void)
{
    change_led_state(LED_PATH "/" red "/brightness", 0);
    change_led_state(LED_PATH "/" green "/brightness", 0);
}

int configure_leds(void)
{
    FILE    *l_fd;
    FILE    *r_fd;
    char    *none_str = "none";

    /* Configure leds for hand control */
    l_fd = fopen(LED_PATH "/" red "/trigger", "w");
    r_fd = fopen(LED_PATH "/" green "/trigger", "w");

    if (l_fd == NULL || r_fd == NULL) {
        perror("simplekey: unable to configure led");
        return -EACCES;
    }

    fprintf(r_fd, "%s\n", none_str);
    fprintf(l_fd, "%s\n", none_str);

    fclose(r_fd);
    fclose(l_fd);

    /* Switch off leds */
    reset_leds();

    return 0;
}

void eval_keycode(int code)
{
    static int red_state = 0;
    static int green_state = 0;

    switch (code) {
    case BTN_LEFT:
        printf("BTN left pressed\n");

        /* figure out red state */
        red_state = red_state ? 0 : 1;

        change_led_state(LED_PATH "/" red "/brightness", red_state);
        break;

    case BTN_RIGHT:
        printf("BTN right pressed\n");

        /* figure out green state */
        green_state = green_state ? 0 : 1;

        change_led_state(LED_PATH "/" green "/brightness", green_state);
        break;
    }
}


int main(void)
{
    int file;
    /* how many bytes were read */
    size_t  rb;
    int ret;
    int yalv;
    /* the events (up to 64 at once) */
    struct input_event  ev[64];
    char    *str = BTN_FILE_PATH;

    printf("Starting simplekey app\n");

    ret = configure_leds();
    if (ret < 0)
        exit(1);

    printf("File Path: %s\n", str);

    if((file = open(str, O_RDONLY)) < 0) {
        perror("simplekey: File can not open");
        exit(1);
    }

    for (;;) {
        /* Blocking read */
        rb= read(file, &ev, sizeof(ev));

        if (rb < (int) sizeof(struct input_event)) {
            perror("simplekey: short read");
            exit(1);
        }

        for (yalv = 0;
            yalv < (int) (rb / sizeof(struct input_event));
            yalv++) {
            if (ev[yalv].type == EV_KEY) {
                printf("%ld.%06ld ",
                    ev[yalv].time.tv_sec,
                    ev[yalv].time.tv_usec);
                printf("type %d code %d value %d\n",
                        ev[yalv].type,
                        ev[yalv].code, ev[yalv].value);

                /* Change state on button pressed */
                if (ev[yalv].value == 0)
                    eval_keycode(ev[yalv].code);
            }
        }
    }

Код отлично работает с кнопкой: когда я выполняю код и нажимаю кнопкуон показывает мне:

Starting simplekey app
File Path: /dev/input/event0
1568889981.534414 type 1 code 260 value 1
1568889981.974358 type 1 code 260 value 0
1568889984.184353 type 1 code 260 value 1
1568889984.554362 type 1 code 260 value 0

Но светодиод не горит.

Я что-то упустил в коде?

Спасибо

...