# GPIO测试
## 引言
官方文档使用的是传统的GPIO操作方法:
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RV1106/Luckfox-Pico-Pro-Max/Luckfox-pinout/Luckfox-Pico-GPIO
通用输入输出(GPIO)接口对于嵌入式系统至关重要,它允许各种硬件组件之间以及与主CPU之间进行通信。过去,在Linux平台上处理GPIO的主要方式是通过`/sys/class/gpio`接口。然而,随着libgpiod库的引入,一种更高效、用户友好的GPIO操作方法出现了。本文将介绍使用libgpiod进行的测试,比较其与传统GPIO使用方法的优缺点。
## 配置
选择 `Target packages -> Libraries -> Hardware handling`,选择`libgpiod`
## 编译
```bash
./build.sh
```
从下面的截图可以看出,下载的是`libgpiod 1.6.3`版本。
## 下载
重新打包下载到设备
```bash
[root
@luckfox root]# gpiodetect
gpiochip0 [gpio0] (32 lines)
gpiochip1 [gpio1] (32 lines)
gpiochip2 [gpio2] (32 lines)
gpiochip3 [gpio3] (32 lines)
gpiochip4 [gpio4] (24 lines)
[root@luckfox root]# gpioinfo
gpiochip0 - 32 lines:
line 0: unnamed unused inputactive-high
line 1: unnamed unused inputactive-high
line 2: unnamed unused inputactive-high
line 3: unnamed unused inputactive-high
line 4: unnamed unused inputactive-high
line 5: unnamed unused inputactive-high
line 6: unnamed unused inputactive-high
line 7: unnamed unused inputactive-high
line 8: unnamed unused inputactive-high
```
## 升级libgpiod
`libgpiod`最新的已经是v2了,v2和v1的API不兼容,这里用的Buildroot是`2023.02.6`版本,这个版本没有v2 libgpiod。我们来尝试集成一下最新的v2版本。
从最新的Buildroot源码中拷贝`package/libgpiod2`文件夹,修改`package/Config.in`文件,添加
```makefile
source "package/libgpiod2/Config.in"
```
再次执行`./build.sh buildrootconfig`,搜索`libgpiod`,出现了v2版本。和之前一样,选择`libgpiod2`。注意`libgpiod`和`libgpiod2`只能二选一,不能同时选择两个。
编译`./build.sh`,可以看到开始配置`libpgiod2 2.1.3`版本。
重新升级程序
验证版本信息,搞定!
```bash
[root@luckfox root]# gpiodetect -v
gpiodetect (libgpiod) v2.1.3
Copyright (C) 2017-2023 Bartosz Golaszewski
License: GPL-2.0-or-later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
> 注意:如果执行了`./build.sh clean`,上面的配置会丢失,需要重新配置。
## 编程测试
LUCKFOX rv1106 GPIO定义如下
通过编程测试这个引脚`GPIO1_C7_d `,组内number=2*8+7=23,这个23后面编程要用。
### C++测试
使用cmake写一个简单的demo
封装一个`GPIOCTRL`类,可以基于这个做扩展。
gpio-ctrl.hpp
```c++
#include
#include
#include
class GPIOCTRL
{
public:
GPIOCTRL();
~GPIOCTRL();
void gpioCtrl(bool on);
private:
std::vector> request_list;
};
```
gpio-ctrl.cpp
```c++
#include "gpio-ctrl.hpp"
GPIOCTRL::GPIOCTRL()
{
::std::filesystem::path chip_path("/dev/gpiochip0");
::gpiod::line::offset line_offset = 23;
auto request =
::gpiod::chip(chip_path)
.prepare_request()
.set_consumer("toggle-line-value")
.add_line_settings(
line_offset,
::gpiod::line_settings().set_direction(
::gpiod::line::direction::OUTPUT))
.do_request();
request_list.push_back(std::make_shared(std::move(request)));
}
GPIOCTRL::~GPIOCTRL() {}
void GPIOCTRL::gpioCtrl(bool on) {
::gpiod::line::value value = ::gpiod::line::value::ACTIVE;
if (!on) value = ::gpiod::line::value::INACTIVE;
int line_offset = 23;
auto& request = request_list[0];
request->set_value(line_offset, value);
}
```
测试程序 main.cpp
```c++
#include
#include
#include
#include
#include
#include
#include "gpio-ctrl.hpp"
int main()
{
bool ctrl = true;
GPIOCTRL gpio;
gpio.gpioCtrl(ctrl);
for (;;) {
std::this_thread::sleep_for(std::chrono::seconds(1));
::std::cout << "ctrl=" << ctrl << ::std::endl;
ctrl = !ctrl;
gpio.gpioCtrl(ctrl);
}
}
```
CMakeLists.txt,同时支持C和C++库
```cmake
cmake_minimum_required(VERSION 3.10)
project(GPIO_Demo VERSION 1.0)
# C++
find_library(GPIODCXX_LIBRARY gpiodcxx REQUIRED)
# C
find_library(GPIOD_LIBRARY gpiod REQUIRED)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(gpio_example main.cpp gpio-ctrl.cpp)
# add_executable(gpio_example toggle_line_value.c)
target_link_libraries(gpio_example PRIVATE ${GPIOD_LIBRARY} ${GPIODCXX_LIBRARY} stdc++fs stdc++)
```
编译
```bash
mkdir build
cd build
cmake ..
make
```
上传到开发板测试。
测量`GPIO1_C7_d`引脚电平。每隔一秒电平变化一次。
### 总结
在本篇文章中,我们探讨了使用 **libgpiod** 进行 GPIO 操作的过程与优势,并通过具体步骤展示了如何配置、编译和测试 GPIO 控制的示例应用,特别是在 **Luckfox-Pico** 平台上。文章从传统的 `/sys/class/gpio` 接口转向 libgpiod 提供的更高效、现代的 API,为嵌入式系统的 GPIO 操作提供了更好的支持。
我们详细描述了 **libgpiod** 的安装过程,介绍了如何将其升级到最新版本,并展示了如何编写 C++ 代码以封装 GPIO 控制逻辑。示例代码包括一个 `GPIOCTRL` 类,使用该类可以方便地控制 GPIO 引脚状态。最后,我们成功编译并在开发板上运行了测试程序,验证了 GPIO 的功能,通过测量引脚电平的变化,证明了我们的代码正确控制了 GPIO。
通过这篇文章,大家能够了解 libgpiod 的使用以及在实际嵌入式开发中如何有效地管理 GPIO 资源,提升开发效率并优化系统性能。
源码:
gpio-test.zip
(2.63 KB, 下载次数: 0)