Вывод GPIO может быть установлен от 0 до 1, но не обратно до 0 - PullRequest
0 голосов
/ 05 октября 2018

Для одного из моих проектов я немного модифицирую драйвер последовательного порта Linux, чтобы я мог довести вывод GPIO до 1 непосредственно перед началом сеанса Tx и до 0 снова после завершения сеанса.Я делаю это путем включения заголовка gpio в драйвер и вызова соответствующих функций:

РЕДАКТИРОВАТЬ: После предложений @sawdust в комментариях новый код выглядит следующим образомэто

В начале передачи:

static void imx_start_tx(struct uart_port *port)
{
    struct imx_port *sport = (struct imx_port *)port;
    unsigned long temp;

    gpio_set_value(140, 1);

В остановке передачи:

static void imx_stop_tx(struct uart_port *port)
{
    struct imx_port *sport = (struct imx_port *)port;
    unsigned long temp;

    gpio_set_value(140, 0);

Пока выполняется запрос GPIO в imx_startup:

static int imx_startup(struct uart_port *port)
{
    struct imx_port *sport = (struct imx_port *)port;
    int retval, i;
    unsigned long flags, temp;

    /* Request GPIO #140, used for control flow */
    int gpio_num = 140;
    const char* label = "f";

    if (!gpio_is_valid(gpio_num)){
        printk(KERN_INFO "GPIO_RS485: invalid GPIO pin\n");
        return -ENODEV;
    }

    int gpio_req = gpio_request(gpio_num, label);

    if(gpio_req != 0){
        printk(KERN_INFO "GPIO_RS485: GPIO access request failed with %d\n", gpio_req); 
    } else {
        printk(KERN_INFO "GPIO_RS485: GPIO access request succeeded!\n");
    }

И gpio_free ();вызывается в imx_shutdown

static void imx_shutdown(struct uart_port *port)
{
    struct imx_port *sport = (struct imx_port *)port;
    unsigned long temp;
    unsigned long flags;
    gpio_free(140);

Однако проблема остается.Другое дело, что теперь я получаю следующие сообщения в dmesg, что означает, что драйвер инициализируется несколько раз?

dmesg output

РЕДАКТИРОВАТЬ КОНЕЦ ЗДЕСЬ

Проблема с этим кодом состоит в том, что я могу подтвердить, что вывод правильно установлен на 1, но затем он никогда не возвращается к 0. Почему это происходит и как я могу исправитьэто?

...