Первая часть вводная.
Введение
Цель - моргать светодиодом на GPIO одноплатного компьютера в своём Qt проекте.
Первое, что приходит в голову - использовать готовое решение, такое как wiringOP. Однако для меня, как программиста микроконтроллеров, странно устанавливать пакет для работы с GPIO. Но помимо этого сторонний пакет ещё и нужно динамически линковать (связывать) с моим приложением. А тут возникает и вопрос совместимости с новой версией пакета, и вопрос того, будет ли пакет этот в системе установлен. Таким образом, я решил прикрутить wiringOP к своему проекту на Qt статически, да и ещё иметь возможность редактировать wiringOP как проект статической библиотеки прямо в Qt Creator.
Как оказалось, кодовая база проекта wiringOP является явно избыточной. Например, мне не нужен код для работы со сдвиговыми регистрами. Так что возможность удобно редактировать библиотеку оказывается очень кстати. Ключевой функцией является wiringPiSetup(), которая выясняет у Ubuntu адреса GPIO и других регистров в памяти путем чтения файла /dev/mem. Забегая вперед скажу, что это - дырка в безопасности, потому что читая /dev/mem - можно получить доступ не только к портам ввода-вывода, но и ко всей ОЗУ.
После инициализации с помощью wiringPiSetup() можно приступать к работе. Так, функция pinMode задает режим работы вывода гребенки: вход, выход, генерация PWM. Пример кода моргания светодиодом на выводе PIN8.
wiringPiSetup();
pinMode(3, OUTPUT);
while(1){
digitalWrite(3, LOW);
delay(1000); //for(volatile uint64_t i=0;i<0xFFF;i++);
digitalWrite(3, HIGH);
delay(1000); //for(volatile uint64_t i=0;i<0xFFF;i++);
}
Сам светодиод должен быть подключен к гребенке. В случае Orange Pi 4B ситуация следующая.
Статическая линковка wiringOP
Текст выше был о том, зачем всё это надо и как это использовать. А теперь пришло время для основной части. Итак, нужно скачать wiringOP
git clone https://github.com/orangepi-xunlong/wiringOP.git
Далее необходимо создать новую Statically Linked Library. В качестве системы сборки я выбрал qmake.
Далее нужно из скачанной wiringOP в созданную библиотеку перенести некоторые файлы согласно рисунку ниже.
В файле .pro библиотеки можно настроить важные параметры, влияющие на сборку. Во-первых, указать модель SBC. Во-вторых, было бы удобно, чтобы результирующий файл libmy_wiringOP_v5.a помещался в отдельную папку wiringOP_build_artifacts. Это можно настроить следующим образом
DEFINES += CONFIG_ORANGEPI
DEFINES += CONFIG_ORANGEPI_4
DESTDIR = $$PWD/../wiringOP_build_artifacts
Подсказка. Знаком две точки требуем переход на каталог назад; переменная $$PWD предоставляет текущий путь к проекту.
Наконец можно собрать библиотеку. В случае успеха вы получите файл libmy_wiringOP_v5.a
Перейдём к тестовому проекту, в моём случае консольному. Необходимо добавить в проект нашу библиотеку как External Library согласно скриншоту.
Обратите внимание, что один и тот же файл wiringPi.h используется как при создании библиотеки, так и в тестовой программе. Наконец можно написать программу для моргания светодиодом. Далее перенесем исходные коды на целевую машину.
rsync -avz /home/andrei/Документы/mywiringOP/my_wiringOP_base/my_wiringOP_v5 a@192.168.0.112:/home/a/Documents/QtProj
rsync -avz /home/andrei/Документы/mywiringOP/my_wiringOP_base/wOP_Test1 a@192.168.0.112:/home/a/Documents/QtProj
Если надо скачать логи с одноплатника, можно попробовать так
a@desktop:/$ rsync -rvz --progress a@192.168.0.112:/var/log/ /home/andrei/Документы/
А если вы используете авторизацию по ключу, нестандартный порт, то можно указать это так
a@desktop:/$ rsync -rvz -e "ssh -p 22 -i /home/andrei/my_board/qemu_ssh_key/my_qemu_ssh_key -o StrictHostKeyChecking=no" --progress a@192.168.0.112:/root /home/andrei/Документы/
Заключение. Оборачиваясь назад, можно было просто поместить файлы wiringOP в дерево своего проекта и вызывать функции. Получается, что мы пошли по тернистому пути, однако приобрели навык создания своей библиотеки и использования её в проекте. Теперь соберем библиотеку и пример на целевой машине. Запускать приложение нужно или с sudo или осуществив предварительную настройку. У меня мигает, а у вас?
Также вам может быть интересна статья Устройство GPIO-драйверов в Linux.