Не удается получить доступ к строке gpio с помощью gpiod_line_request_output() на Adafruit FT232H

#c #gpio #adafruit

#c #gpio #adafruit #libgpiod

Вопрос:

Я использую модуль Adafruit Ft232H для добавления портов GPIO на мой компьютер с Linux. Хотя у меня был некоторый успех в том, чтобы мигать светодиодом в libftdi и режиме bitbang, мне не повезло с, libgpiod потому что gpiod_line_request_output сбой.

Некоторая информация о gpio моей системы:

 sudo gpiodetect
gpiochip0 [ftdi-cbus] (4 lines)

sudo gpioinfo
gpiochip0 - 4 lines:
        line   0:      unnamed       unused   input  active-high 
        line   1:      unnamed       unused   input  active-high 
        line   2:      unnamed       unused   input  active-high 
        line   3:      unnamed       unused   input  active-high
  

Это программа на C, которая пытается получить доступ к строке 0.

 #include <stdio.h>
#include <stdlib.h>

#include <gpiod.h>

#define LINE_NUM 0

void gpio_fatal(struct gpiod_chip* chip, const char msg[20]);

int main(int argc, char** argv)
{
    struct gpiod_chip*  chip;
    struct gpiod_line*  line;
    const char path[] = "/dev/gpiochip0";

    chip = gpiod_chip_open(path);
    if(!chip)
    {
        fprintf(stderr, "Error opening pathn");
        return EXIT_FAILURE;
    }

    line = gpiod_chip_get_line(chip, LINE_NUM);
    if(!line)
    {
        fprintf(stderr, "error getting this linen");
        return EXIT_FAILURE;
    }

    int ret = gpiod_line_request_output(line,
                        "ftdi-cbus",
                        1);
    if(ret != 0)
        gpio_fatal(chip, "Request output failed");

    for(;;)
    {
        gpiod_line_set_value(line, 1);
        printf("Onn");
        sleep(1);
        gpiod_line_set_value(line, 0);
        printf("Offn");
        sleep(1);
    }

    gpiod_line_release(line);
    gpiod_chip_close(chip);

    return EXIT_SUCCESS;
}

void gpio_fatal(struct gpiod_chip* chip, const char* msg)
{
    fprintf(stderr, "%sn", msg);
    gpiod_chip_close(chip);
    exit(EXIT_FAILURE);
}
  

Запуск исполняемого файла с sudo дает мне:

 sudo g_gpiod/build/g_gpiod 
Password: 
Request output failed
  

gpiod.h для сбоящей функции указано следующее:

 /**
 * @brief Reserve a single line, set the direction to output.
 * @param line GPIO line object.
 * @param consumer Name of the consumer.
 * @param default_val Initial line value.
 * @return 0 if the line was properly reserved, -1 on failure.
 */
int gpiod_line_request_output(struct gpiod_line *line,
                  const char *consumer, int default_val) GPIOD_API;
  

Параметры кажутся правильными, по какой причине это может привести к сбою? Другие примеры, использующие libftdi или CircuitPython , могут получить доступ к портам и работать корректно.

Комментарии:

1. Работают ли инструменты оболочки из libgpiod ? Нравится gpioget gpiochip0 0 .

2. Запуск ` # gpioset —mode = time —sec = 5 gpiochip0 1 = 1 gpioset: ошибка при настройке значений строки GPIO: нет такого устройства ` Я не могу заставить его работать. РЕДАКТИРОВАТЬ Что происходит с тегами кода?

3. Как насчет получения значения, как я упоминал в комментарии?

4. Запуск gpioget gpiochip0 0 выдает ошибку: gpioget: error reading GPIO values: No such device РЕДАКТИРОВАТЬ: у меня нет никакого устройства для подключения для чтения данных.

5. Итак, в чем тогда вопрос? Сначала убедитесь, что в вашей системе присутствует */dev/ gpiochip0` (или другой номер).

Ответ №1:

Вам нужно прошить EEPROM, чтобы установить функцию вывода C5, например, с помощью команды ftdi_eeprom из libftdi. Сначала выгрузите модуль ftdi_sio и сохраните исходную EEPROM:

 $ sudo rmmod ftdi_sio
$ sudo ftdi_eeprom --verbose --device i:0x0403:0x6014 ft232h-orig.conf

FTDI eeprom generator v0.17
(c) Intra2net AG and the libftdi developers <opensource@intra2net.com>
FTDI read eeprom: 0
EEPROM size: 256
VID:     0x0403
PID:     0x6014
Release: 0x0900
Bus Powered: 100 mA
Manufacturer: ÿÿÿÿÿÿÿÿ
Product:      ÿÿÿÿÿÿ
Serial:       ÿÿÿÿÿÿÿÿ
Checksum      : ffff
PNP: 1
Channel A has Mode UART
FT1284 Mode Clock is idle LOW, MSB first, No Flow Control
ACBUS has 4 mA drive
ADBUS has 4 mA drive
C0 Function: TRISTATE
C1 Function: TRISTATE
C2 Function: TRISTATE
C3 Function: TRISTATE
C4 Function: TRISTATE
C5 Function: TRISTATE
C6 Function: TRISTATE
C7 Function: TRISTATE
C8 Function: DRIVE_1
C9 Function: DRIVE_0
FTDI close: 0
  

Файл ft232h-orig.conf содержит только одну строку filename="ft232h-orig.bin" .

Вы можете управлять 4 выводами GPIO FT232H с помощью модуля ftdi_sio:

 | line | pin | remarks   |
==========================
| 0    | C5  | -         |
| 1    | C6  | -         | 
| 2    | C8  | red led   |
| 3    | C9  | green led |
  

На плате Adafruit установлены катоды двух светодиодов (красного и зеленого), подключенных к контактам C8 и C9. В EEPROM по умолчанию для C9 установлено значение DRIVE_0, так что зеленый светодиод «включен» при включении платы.

Вот мой конфигурационный файл для ftdi_eeprom:

 $ cat ft232h-libgpiod.conf
vendor_id="0x0403"
product_id="0x6014"
manufacturer="Adafruit"
product="FT232H Breakout"

# whatever
serial="20211223"
use_serial=true

max_power=100
self_powered=false
remote_wakeup=false

cha_type=UART
cha_vcp=false

cbush5=IOMODE
cbush6=IOMODE

# red led
cbush8=IOMODE

# green led
cbush9=DRIVE_0 # power-on indicator
#cbush9=IOMODE

$ sudo ftdi_eeprom --verbose --device i:0x0403:0x6014 --flash-eeprom ft232h-libgpiod.conf
  

Теперь ваша программа отлично работает со строкой 0 на выводе C5. В качестве бонуса теперь вы можете управлять красным светодиодом с помощью команд libgpiod:

 # turn red LED on (low active)
sudo gpioset gpiochip0 2=0
  

Комментарии:

1. Я хотел бы проголосовать за это два раза, большое вам спасибо.