Керуйте штифтами GPIO від C


9

Більшість бібліотек, на декількох мовах, взаємодіє з GPIO контактів через /sys/class/gpio/export, /sys/class/gpio/import, /sys/class/gpio/gpio10/valueі т.д. Однак Linux Kernel документи ясно стан , що є спадщина способом ведення справ.

Який нездійсненний спосіб робити речі?

Якщо я правильно розумію в просторі ядра, я використовував би ці функції або стандартні драйвери ядра для загальних завдань GPIO.

Що б я використав для користувальницького простору? Чи є інтерфейс Sysfs для не спадщини?

PS: Я знаю, що документи ядра заявляють, що застарілий інтерфейс на основі цілих чисел, хоча вважається застарілим, все-таки можна використовувати з міркувань сумісності. Однак я не зацікавлений у використанні цього застарілого коду.


1
Більшість бібліотек НЕ взаємодіють із штифтами GPIO через те, що /sys/class/gpio/exportвони безпосередньо отримують доступ до обладнання, хоча МОЖУТЬ використовувати послуги ядра. Безумовно, WiringPi та AFAIK pigpiod безпосередньо мають доступ до регістрів SoC.
Міллівейс

Відповіді:



0

На сьогодні я розумію, що (як було зазначено) інтерфейс sysfs застарілий. У користувальницькому просторі є щонайменше два відносно нових API C (вибачення WiringPi та PiGpio). Один або обидва, схоже, мають мітку libgpiod

Їх можна встановити на “buster” (але не jessie) за допомогою:

apt-get install gpiod libgpiod-dev libgpiod-doc

Не впевнений у розтягуванні. Також не впевнений, який API вимагає встановлення.

1) Перший API API спирається на /usr/include/linux/gpio.h, який містить структури даних і визначає, які використовуються при системних викликах для взаємодії з gpios. Про це пише Лінус Валлей. Приклад цього API наведено нижче і є результатом розмови Лінуса Валлея, зазначеного в коментарях до коду. Програми, що використовують цей API, повинні мати #includes, показані в наведеному нижче прикладі, але їх не потрібно компілювати з будь-якими бібліотеками (AFAIK).

2) Другий API API покладається на /usr/include/gpiod.h, який забезпечує спрощений інтерфейс, який резюмує налаштування та обробляє та дозволяє без контексту читати, записувати та інші функції. Це підтримує Бартош Голашевський. Вступ до API наведено в деяких слайдах Bartosz, які можна знайти за адресою:

https://ostconf.com/system/attachments/files/000/001/532/original/Linux_Piter_2018_-_New_GPIO_interface_for_linux_userspace.pdf?1541021776

Деякі хороші приклади використання цього API можна знайти на:

https://framagit.org/cpb/example-programs-using-libgpiod/-/tree/master/

Зауважте, що програми, що використовують цей API, повинні:

#include <gpiod.h>

і буде складено з бібліотекою -lgpiod (наприклад):

gcc -o read-gpio -lgpiod read-gpio.c

Я успішно склав і запустив деякі приклади.

** Існує API C ++, також наданий Бартошем Голашевським, який залежить від /usr/include/gpiod.hpp. Це C ++ обгортка, заснована на API API і залежить від стандарту C ++ 11.

Програми, що використовують цей API, повинні:

#include <gpiod.hpp>

Приклад використання цього API знаходимо в тих же слайдах, що і API API.

https://ostconf.com/system/attachments/files/000/001/532/original/Linux_Piter_2018_-_New_GPIO_interface_for_linux_userspace.pdf?1541021776

Я ще не маю цих прикладів зібрати, але підозрюю, що є бібліотечне включення, яке я ще повинен виявити.


Нижче наводиться приклад програми для читання gpio, що використовує C API номер 1 зверху (автор автор Лінуса Валлеля). Він неодноразово читає gpio 4 on / dev / gpiochip0 і друкує його значення.

/****
* gpio-read.c -- example program for reading gpio values using the <linux/gpio.h> C API
* The API consists primarily of data structures used as parameters to system calls.
* Adapted from from a youtube video of Linus Walleij at the Embedded Linux Conference Europe
* GPIO for Engineers and Makers: starting at timestamp 44:11
* For simplicity, there is no error checking.
****/

//Need the gpio API and support for the system calls.
#include <linux/gpio.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <string.h>
#include <unistd.h>


int main(){


//Opening device and getting file descriptor.
int fd = open("/dev/gpiochip0",O_RDONLY);

//structure for holding chip information
//This structure is defined in /usr/include/linux/gpio.h
struct gpiochip_info cinfo;

//Getting the chip information via the ioctl system call
//GPIO_GET_CHIPINFO_IOCTL defined also in /usr/include/linux/gpio.h
int ret = ioctl(fd,GPIO_GET_CHIPINFO_IOCTL,&cinfo);

//print out the chip information
fprintf(stdout, "GPIO chip: %s, \"%s\", %u GPIO lines\n",
    cinfo.name, cinfo.label, cinfo.lines);

//structure for holding line information.
//structure defined in /usr/include/linux/gpio.h
struct gpioline_info linfo;

//get generic line information from system call
ret = ioctl(fd,GPIO_GET_LINEINFO_IOCTL, &linfo);

//Not sure what this line_offset is, but we specify the gpio number later.
fprintf(stdout,"line %2d: %s\n",linfo.line_offset,linfo.name);

//Reading lines
//Set up some handles for requests and data
struct gpiohandle_request req;
struct gpiohandle_data data;

//Although req and data can read multiple gpios at a time, we'll use just one
//This reads line offset 4, which corresponds to the BCM value in "gpio readall"
req.lineoffsets[0] = 4;
//have to indicate how many lines we are reading.
req.lines = 1;
//Make this an input request
req.flags = GPIOHANDLE_REQUEST_INPUT;

//Optionally give the line a name
strcpy(req.consumer_label, "First Switch");

//Get a line handle. Note that req.fd is provided a handle for the next ioctl. 
int lhfd = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);

//Loop with some delay that keeps checking the input and displaying the value
for(int ii = 0; ii < 1000; ++ii){

    ret = ioctl(req.fd,  GPIOHANDLE_GET_LINE_VALUES_IOCTL, &data);

    printf("line %d is %s\n",req.lineoffsets[0], data.values[0] ? "high" : "low");
    //wait 0.25 seconds
    usleep(250000);
}

return 0;
}

Компілювати з

gcc -o gpio-read gpio-read.c

Виконати:

./gpio-read

Це покаже значення конкретного зміщення гпіо кожні 0,25 секунди.


Отже, що таке API? Чи встановлено це за допомогою apt-get install gpiod? Чи є прототипи функцій всередині <linux/gpio.h>? Чи є файл бібліотеки, до якого слід зв’язати?
Дмитро Григор’єв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.