rk3128 通过串口控制 GPIO
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的更多相关文章
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- 串口控制RGB灯程序
实验目的: 通过上位机给串口发送数据(字符); STM32收到数据进入中断程序原封不动返回上位机,并且根据收到的信息产出相应的进行操作.(1- led_on 2 – ledoff...); 源码 ...
- Android(Java)控制GPIO的方法及耗时分析
前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...
- Android(Linux)控制GPIO方法二
前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...
- Android(Linux)控制GPIO的方法及实时性分析
Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...
- STM32串口控制步进电机(原创)
用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...
- RaspberryPi2B使用bcm2835c库控制GPIO
RaspberryPi2B使用bcm2835c库控制GPIO 网上有很多RaspberryPi控制GPIO的方法,有Python.WiringPi.bcm2835 C library 使用bcm283 ...
- EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO
0 前言 本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...
- openwrt 控制gpio口的方法
利用i2c来控制gpio口 1.编译驱动或者安装驱动 # opkg update # opkg install kmod-i2c-gpio-custom kmod-i2c-core# 加载驱动 # i ...
随机推荐
- Redis入门简述
Redis 是一个开源的,使用 ANSI C (C语言)编写,高性能的 Key-Value(键值对) 的 NoSQL 数据库 NoSQL = Not Only SQL,意即“不仅仅是SQL”,是一项全 ...
- 持续集成-jenkins介绍与环境搭建
什么是持续集成? 转自:https://blog.csdn.net/tanshizhen119/article/details/80328523 持续集成,俗称CI, 大师Martin Fowler对 ...
- jsp内置对象-exception对象
1.概念:当JSP页面发生错误产生异常时,使用隐含对象exception针对该异常做出相应的处理.使用exception对象时,需要在page指令中设定:<%@page isErrorPage= ...
- webpack 单独打包指定JS文件(CopyWebpackPlugin)
背景: 不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改.因此,需要用webpack单独打包指定文件.npm install --save-dev ...
- npm ERR! asyncWrite is not a function
1.背景:原先node是官网下载安装的,通过brew更新了下,然后到项目里npm i 安装包时候,报错2.解决:卸载官网下载安装的node,重装 sudo rm -rf /usr/local/{bin ...
- IM多类型holder封装
如标题,这是一个在列表多类型视图时的一个简化封装方法,减少多余代码,提高复用性,更好迭代扩展,先看视图列表效果图 GitHub:https://github.com/1024477951/Fragme ...
- DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting
上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...
- 自学MongoDB(1)
MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...
- SQL SERVER 临时数据库 tempdb 迁移或增加文件
临时数据库TempDB 虽然是临时库,但对整个数据库系统性能却起到很关键的作用:平时用到的中间数据集会暂时保存到TempDB 中,比如:临时表,排序,临时统计信息,一些中间结果数据,索引重建 等.我们 ...
- SqlServer如何给表添加新的字段以及字段注释
语法: USE 数据库名ALTER TABLE 表名 ADD 字段名 类型 默认值 是否为空;EXEC sp_addextendedproperty N'MS_Description', N'注 ...