GPIO控制

GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2C、网络、电压检测的通讯引脚。

Linux提供了GPIO子系统驱动框架,使用该驱动框架即可灵活地控制板子上的GPIO。

2.1. GPIO命名

Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。

  • 控制器和GPIO控制器数量⼀致

  • 端口固定 A、B、C和D,每个端口仅有8个索引号,(a=0,b=1,c=2,d=3)

  • 索引序号固定 0、1、2、3、4、5、6、7

rk3588具有5个GPIO控制器,每个控制器可以控制32个IO,作为GPIO功能时,端口⾏为由GPIO控制器寄存器配置。

GPIO1_C4表达的意思为第1组控制器,端口号为C,索引号为4。该引脚号的计算公式为32 x 1 + 2 x 8 + 4 = 52

部分板卡除了主控芯片原生IO,也有使用i2c扩展gpio,例如鲁班猫5,使用两颗XL9535芯片,每个扩展芯片可以扩展16路gpio,使用与原生gpio无异。

2.2. 使用GPIO sysfs接口控制IO

在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/directiongpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。

GPIO举例计算

引脚

控制器

端口号

索引号

计算结果

GPIO1_C4

1

C

4

52 (32 x 1 + 8 x 2 + 4)

GPIO3_B2

3

B

2

106 (32 x 3 + 8 x 1 + 2)

GPIO0_D6

0

D

6

30 (32 x 0 + 8 x 3 + 6)

 123456789
10
11
12
13
14
15
16
17
18
#以下所有操作均需要打开管理者权限使用
#使能引脚GPIO1_C4
echo 52 > /sys/class/gpio/export#设置引脚为输入模式
echo in > /sys/class/gpio/gpio52/direction
#读取引脚的值
cat /sys/class/gpio/gpio52/value#设置引脚为输出模式
echo out > /sys/class/gpio/gpio52/direction
#设置引脚为低电平
echo 0 > /sys/class/gpio/gpio52/value
#设置引脚为高电平
echo 1 > /sys/class/gpio/gpio52/value#复位引脚
echo 52 > /sys/class/gpio/unexport

2.3. 使用libgpiod控制IO

libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 )实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。

1
2
#安装gpiod 命令行工具
sudo apt install gpiod
  • gpiod工具的使用方法与sysfs接口的不同,gpiod是以控制器为单位,然后再详细到端口号和索引号,即gpiod使用两个数据确定引脚

GPIO举例计算

引脚

控制器

端口号

索引号

gpiod的使用结果

GPIO1_C4

1

C

4

1 20(8 x 2 + 4)

GPIO3_B2

3

B

2

3 10(8 x 1 + 2)

GPIO0_D6

0

D

6

0 30(8 x 3 + 6)

常用的命令行如下,可使用 -h 查看命令相对应的使用说明(以GPIO1_C4为例)

libgpiod命令

命令

作用

使用举例

说明

gpiodetect

列出所有的GPIO控制器

gpiodetect(无参数)

列出所有的GPIO控制器

gpioinfo

列出gpio控制器的引脚情况

gpioinfo 1

列出第一组控制器引脚组情况

gpioset

设置gpio

gpioset 1 20=0

设置第一组控制器编号20引脚为低电平

gpioget

获取gpio引脚状态

gpioget 1 20

获取第一组控制器编号20的引脚状态

gpiomon

监控gpio的状态

gpiomon 1 20

监控第一组控制器编号20的引脚状态

重要

Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。其中端口号和索引号会合并成一个数值传入到gpiod里去 并不是所有的引脚都能够使用libgpiod控制,例如led之类的一些已经被使用的引脚。当使用这些被定义的引脚就会出现,设备繁忙,进而无法使用

2.4. FAQs

Q1:当使用GPIO时出现 gpioset: error setting the GPIO line values: Device or resource busy 或者 -bash: echo: 写错误: 设备或资源忙

A1:说明GPIO被占用了,占用的原因可能是设备树里把该引脚作为gpio或者其他复用功能被使用了。

Next  Previous

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库

介绍 Nexus 是广泛使用的仓库管理工具,常用于管理 Java 构件(如 JAR、WAR、EAR 文件)。它可以作为一个本地的 Maven 仓库,用来存储和管理项目的依赖包和构建产物。支持多种仓库类型,能够帮助开发团队更高效地管理构件…

Android 13 默认打开 使用屏幕键盘

原生设置里,系统-语言和输入法-实体键盘-使用屏幕键盘 选项, 关闭时,外接物理键盘,如USB键盘,输入时不会弹出软键盘。 打开时,外接物理键盘,如USB键盘,输入时会弹出软键盘。 这个选…

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下:gtsam需要连接boost, 解决办法: 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的,因此1不太可能(我试过重新编译完boost,在编译gtsam完…

android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析

1. 概要 基础库 libbase.a 基于 android ndk r18b 编译, 被算法库 libfoo.so 和算法库 libbar.a 依赖, 算法库则分别被 libapp1.so 和 libapp2.so 依赖。 libapp1.so 的开发者向 libfoo.so 的开发者反馈了链接报错: error: undefined symb…

如何清除windows 远程桌面连接的IP记录

问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…

使用 React Native实现鸿蒙开发的详细方案

一、环境准备 1. 基础环境要求 操作系统:Windows 10/11 或 macOS (建议版本最新)Node.js: v16.x 或更高版本npm: v8.x 或更高版本Java JDK: 11 或更高版本DevEco Studio: 3.1 或更高版本 (鸿蒙官方IDE)2. 安装 DevEco Studio 从华为开发者官网下载安装时选择以下组件: Harmo…

贪心算法应用:顶点覆盖问题详解

贪心算法应用:顶点覆盖问题详解 贪心算法是解决顶点覆盖问题的经典方法之一。下面我将从基础概念到高级优化,全面详细地讲解顶点覆盖问题及其贪心算法解决方案。 一、顶点覆盖问题基础 1. 问题定义 顶点覆盖问题(Vertex Cover Problem&am…

Excel安全防护:开源批量加密工具推荐与使用指南

先放下载链接:https://tool.nineya.com/s/1iqsn2sh0 在日常办公里,像财务数据、客户信息、项目报表这类核心资料,常常是以 Excel 文件的形式来存储的。要是手动一个一个地给这些文件加密,那可太费时间和精力了,而且还…

【C++】学习、项目时Debug总结

这里写目录标题 1. 内存问题1.1. 内存泄漏1.1.1. 内存泄漏案例检查方法1.1.2. 主线程提前退出导致【控】1.1.3. PostThreadMessage失败导致的内存泄漏**【控】**1.1.4. SendMessage 时关闭客户端【控】1.1.5. 线程机制导致【**控】**1.1.6. exit(0)导致【…

2025 后端自学UNIAPP【项目实战:旅游项目】1、创建项目框架

1、创建项目 ①项目名称:自定义,【我是travel】 ②vue版本:vue3 ③其他默认,最后创建 2、创建页面 ①展开自己刚才创建的项目 ②单击选中pages文件夹 --->鼠标右键---->新建页面 ③页面名称:自定义favouri…

WPF 子界面修改后通知到主页面

子页面: public partial class MyPopupWindow : Window { public event Action OnClose; private void CloseWindowButton_Click(object sender, RoutedEventArgs e) { OnClose?.Invoke(); this.Close(); } } 主界面&#xff1a…

Python中的标识、相等性与别名:深入理解对象引用机制

在Python编程中,理解变量如何引用对象以及对象之间的比较方式是至关重要的基础概念。本文将通过Lewis Carroll的笔名示例,深入探讨Python中的对象标识、相等性判断以及别名机制。 别名现象:变量共享同一对象 >>> charles {name: …

python 闭包获取循环数据经典 bug

问题代码 def create_functions():functions []for i in range(3):# 创建一个函数,期望捕获当前循环的i值functions.append(lambda: print(f"My value is: {i}"))return functions# 创建三个函数 f0, f1, f2 create_functions()# 调用这些函数 f0() # 期望输出 &…

克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策!KrigingNSGAII熵权TOPSIS!!matlab2023b语言运行! 1.克里金模型(Kriging Model)是一种基于空间统计学的插值方法…

Prompt Engineering 提示词工程学习

一、Prompt Engineering 简介 Prompt Engineering 是设计和优化输入提示(Prompt)以获得预期输出的过程。在与大型语言模型(如 GPT-4)交互时,如何构造提示会显著影响模型的回答质量。 二、Prompt 的重要性 提高生成准确性:通过正确的 Prompt 引导,模型能够更好地理解用…

MATLAB安装常见问题及解决方案详解(含代码示例)

MATLAB作为科学计算和工程分析的核心工具,其安装过程可能因操作系统版本、硬件配置或网络环境等因素而出现各种问题。本文基于MATLAB官方文档和社区经验,系统总结了安装过程中常见的问题,并提供详细的解决方案和代码示例,帮助用户…

免安装 + 快速响应Photoshop CS6 精简版低配置电脑修图

各位PS小白和修图大神们,今天来给大家聊聊Photoshop CS6精简版这个宝藏软件! Photoshop CS6精简版就是Adobe Photoshop CS6的“瘦身版”,它把一些不常用的功能给简化了,只留下核心工具,特别适合那些想高效操作、节省系…

微服务架构实战:从服务拆分到RestTemplate远程调用

微服务架构实战:从服务拆分到RestTemplate远程调用 一 . 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo1.3 小结 二 . 服务间调用2.1 注册 RestTemplate2.2 实现远程调用2.3 小结 三 . 提供方和消费方 在分布式系统设计中,微服务架构因其灵活性、可…

MySQL 索引与事务详解

目录 一、索引(Index) 二、事务(Transaction) 三、总结 一、索引(Index) 索引的本质:一种数据结构(如 BTree、Hash),用于快速定位数据,避免全…

macOS Python 环境配置指南

1. 检查现有 Python 环境 python3 --version # 检查 Python 3 版本 pip3 --version # 检查 pip 版本 2. 安装 pyenv(Python 版本管理工具) # 使用 Homebrew 安装 pyenvbrew install pyenv# 配置 pyenv 环境变量(添加到 ~/.zshrc&#…