2019-04-24

关键字: rk平台控制GPIO功能、rk串口控制引脚电平

本篇文章介绍了如何通过串口来控制 RK3128、RK3288 平台的 GPIO 。



我们可以很便捷地通过串口命令来控制 RK 的 CPU 芯片的 GPIO。

首先通过串口进入到以下目录,注意要提升我们的权限到 root

cd /sys/class/gpio

通常在这个目录至少能看到 export 和 unexport 两个文件,笔者的开发板这个目录有如下文件

shell@rk312x:/sys/class/gpio # ll
--w------- root root -- : export
lrwxrwxrwx root root -- : gpiochip0 -> ..
lrwxrwxrwx root root -- : gpiochip128 ->
lrwxrwxrwx root root -- : gpiochip32 -> .
lrwxrwxrwx root root -- : gpiochip64 -> .
lrwxrwxrwx root root -- : gpiochip96 -> .
--w------- root root -- : unexport

然后映射我们需要操作的 GPIO 端口号出来

echo  > export

不知道对应的端口号是多少? 看这里

执行完后,可以看到能多出一个目录出来

--w------- root     root          -- : export
lrwxrwxrwx root root -- : gpio33 -> ../../devices/.pinctrl/gpio/gpio33
...

如果您发现您在执行完命令后并没有如期多出一个映射目录出来,请戳这里

然后我们就可以通过操作这个目录里面的文件来达到控制 GPIO 功能的目的了。

比如我们可以查询一下这个 GPIO 口当前的方向以及电平值

shell@rk312x:/sys/class/gpio # cat gpio33/direction
in
shell@rk312x:/sys/class/gpio # cat gpio33/value

如果要更改电平,可以有如下操作

shell@rk312x:/sys/class/gpio # echo out > gpio33/direction
shell@rk312x:/sys/class/gpio # echo > gpio33/value

这一套流程组合起来即为

echo xx > /sys/class/gpio/export
echo out > /sys/class/gpio/gpioxx/direction
echo > /sys/class/gpio/gpioxx/value

端口号查询

各个 GPIO 的端口值是通过查表和计算得出来的。

我们知道 GPIO 通常分为好几组,如 GPIO1, GPIO2, GPIO3 ...

那我们的计算公式即为

num =  * GPIO_X + PORT

GPIO_X 即为 GPIO 的组号,其对应关系如下

GPIO0  -->
GPIO1 -->
GPIO2 -->
...

而 PORT 的值如下表所示

#define GPIO_A0                 0
#define GPIO_A1                 1
#define GPIO_A2                 2
#define GPIO_A3                 3
#define GPIO_A4                 4
#define GPIO_A5                 5
#define GPIO_A6                 6
#define GPIO_A7                 7
#define GPIO_B0                 8
#define GPIO_B1                 9
#define GPIO_B2                 10
#define GPIO_B3                 11
#define GPIO_B4                 12
#define GPIO_B5                 13
#define GPIO_B6                 14
#define GPIO_B7                 15
#define GPIO_C0                 16
#define GPIO_C1                 17
#define GPIO_C2                 18
#define GPIO_C3                 19
#define GPIO_C4                 20
#define GPIO_C5                 21
#define GPIO_C6                 22
#define GPIO_C7                 23
#define GPIO_D0                 24
#define GPIO_D1                 25
#define GPIO_D2                 26
#define GPIO_D3                 27
#define GPIO_D4                 28
#define GPIO_D5                 29
#define GPIO_D6                 30
#define GPIO_D7                 31

举个例子,假如我们要控制 gpio2_d4 引脚,则其端口号为

 *  +  = 

假如我们要控制 gpio0_a1 引脚,则其端口号为

 *  +  = 

无法映射对应 GPIO 引脚的目录出来?

一个 GPIO 引脚必须要处于一种 “完全自由” 的状态下才能够在串口中对它进行控制。

换句话说就是如果您要操作的 GPIO 引脚在 dts 或 dtsi 文件中操作过它,那么就无法通过串口来控制了。通过这种特性也可以检测我们在配置文件中对某引脚的控制是否起到效果了。

关于这种设定可以参考下 rk 官方给出的关于 gpio 的说明文档,这里贴出一部分关键说明如下

Sysfs 中的路径
--------------
在/sys/class/gpio 中有 类入口: - 用于在用户空间控制 GPIO 的控制接口; - GPIOs 本身;以及 - GPIO 控制器 ("gpio_chip" 实例)。 除了这些标准的文件,还包含“device”符号链接。 控制接口是只写的: /sys/class/gpio/ "export" ... 用户空间可以通过写其编号到这个文件,要求内核导出
一个 GPIO 的控制到用户空间。 例如: 如果内核代码没有申请 GPIO #,"echo 19 > export"
将会为 GPIO # 创建一个 "gpio19" 节点。 "unexport" ... 导出到用户空间的逆操作。 例如: "echo 19 > unexport" 将会移除使用"export"文件导出的
"gpio19" 节点。 GPIO 信号的路径类似 /sys/class/gpio/gpio42/ (对于 GPIO # 来说),
并有如下的读/写属性: /sys/class/gpio/gpioN/ "direction" ... 读取得到 "in" 或 "out"。这个值通常运行写入。
写入"out" 时,其引脚的默认输出为低电平。为了确保无故障运行,
"low" 或 "high" 的电平值应该写入 GPIO 的配置,作为初始输出值。 注意:如果内核不支持改变 GPIO 的方向,或者在导出时内核代码没有
明确允许用户空间可以重新配置 GPIO 方向,那么这个属性将不存在。 "value" ... 读取得到 (低电平) 或 (高电平)。如果 GPIO 配置为
输出,这个值允许写操作。任何非零值都以高电平看待。 如果引脚可以配置为中断信号,且如果已经配置了产生中断的模式
(见"edge"的描述),你可以对这个文件使用轮询操作(poll()),
且轮询操作会在任何中断触发时返回。如果你使用轮询操作(poll()),
请在 events 中设置 POLLPRI 和 POLLERR。如果你使用轮询操作
(select()),请在 exceptfds 设置你期望的文件描述符。在
轮询操作(poll())返回之后,既可以通过 lseek()操作读取
sysfs 文件的开始部分,也可以关闭这个文件并重新打开它来读取数据。 "edge" ... 读取得到“none”、“rising”、“falling”或者“both”。
将这些字符串写入这个文件可以选择沿触发模式,会使得轮询操作
(select())在"value"文件中返回。 这个文件仅有在这个引脚可以配置为可产生中断输入引脚时,才存在。 "active_low" ... 读取得到 (假) 或 (真)。写入任何非零值可以
翻转这个属性的(读写)值。已存在或之后通过"edge"属性设置了"rising"
和 "falling" 沿触发模式的轮询操作(poll())将会遵循这个设置。 GPIO 控制器的路径类似 /sys/class/gpio/gpiochip42/ (对于从# GPIO
开始实现控制的控制器),并有着以下只读属性: /sys/class/gpio/gpiochipN/ "base" ... 与以上的 N 相同,代表此芯片管理的第一个 GPIO 的编号 "label" ... 用于诊断 (并不总是只有唯一值) "ngpio" ... 此控制器所管理的 GPIO 数量(而 GPIO 编号从 N 到
N + ngpio - ) 大多数情况下,电路板的文档应当标明每个 GPIO 的使用目的。但是那些编号并不总是
固定的,例如在扩展卡上的 GPIO会根据所使用的主板或所在堆叠架构中其他的板子而
有所不同。在这种情况下,你可能需要使用 gpiochip 节点(尽可能地结合电路图)来
确定给定信号所用的 GPIO 编号。

rk 串口操作 gpio 官方文档部分内容

这份文档位于

./kernel/Documentation/zh_CN/gpio.txt

参考: RK3288 GPIO 输出问题

rk3128 通过串口控制 GPIO的更多相关文章

  1. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  2. 串口控制RGB灯程序

    实验目的: 通过上位机给串口发送数据(字符); STM32收到数据进入中断程序原封不动返回上位机,并且根据收到的信息产出相应的进行操作.(1- led_on  2 – ledoff...); 源码   ...

  3. Android(Java)控制GPIO的方法及耗时分析

    前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...

  4. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

  5. Android(Linux)控制GPIO的方法及实时性分析

    Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...

  6. STM32串口控制步进电机(原创)

    用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...

  7. RaspberryPi2B使用bcm2835c库控制GPIO

    RaspberryPi2B使用bcm2835c库控制GPIO 网上有很多RaspberryPi控制GPIO的方法,有Python.WiringPi.bcm2835 C library 使用bcm283 ...

  8. EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO

    0 前言     本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...

  9. openwrt 控制gpio口的方法

    利用i2c来控制gpio口 1.编译驱动或者安装驱动 # opkg update # opkg install kmod-i2c-gpio-custom kmod-i2c-core# 加载驱动 # i ...

随机推荐

  1. 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解

    一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...

  2. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  3. Android Studio 3.0+ Annotation processors must be explicitly declared now

    把Android Studio 升级到3.0+ 版本的时候出现该问题:   可以看到 给了我们两种解决办法:   1. 即 给出现问题的三方 加上 annotationProcessor配置     ...

  4. lambda 怎么传递ref参数

    lambda 传递ref参数有个语法bug,必须要显式书写参数类型. //如 delegate bool FuncType(ref int num); FuncType func1; func1 = ...

  5. Node编码规范

    编码规范 1. 缩进 采用2个空格缩进,而不是tab缩进.空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来紧凑.明快. 2. 变量声明 永远用var声明变量,不加v ...

  6. ConchAPI | 更智能的API监控,提升团队效率

    “昨天调好的API,怎么又挂了,竟然没有人发现?” “喂喂喂,你的API挂了,无法调用成功?哪里出问题了?” “这段时间的API数量越来越多了,有谁能好好理清下?” 现在服务端技术越来越讲究微服务化, ...

  7. C#-反射reflection

    目录 简介 引入 1.新建类库 2. 类库的使用 3.反射 反射实例1 反射实例2 反射实例3 C# shanzm 简介 反射(reflection)是什么? 在<精通C#>中是这么说的& ...

  8. Linux Mint chrome浏览器提示“需要安装adobe flash player”

    出现这种情况,是因为系统没有安装flash 插件造成的,用以下的命令安装: sudo apt-get install adobe-flashplugin 安装完成后,重启浏览器. 如果chrome浏览 ...

  9. Docker: Jenkins里的pipeline编写基本技巧

    Jenkins里,先新建一个pipeline项目 Pipeline Syntax 在Sample Step里选择需要的插件,如果不存在,就去系统管理,插件管理里,进行安装. 如果源码管理工具用的是gi ...

  10. WPF C# 命令的运行机制

    1.概述 1.1 WPF C# 命令的本质 命令是 WPF 中的输入机制,它提供的输入处理比设备输入具有更高的语义级别. 例如,在许多应用程序中都能找到的“复制”.“剪切”和“粘贴”操作就是命令. W ...