Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

用文件IO的方式操作GPIO来控制屏幕开关 #81

Open
soapgu opened this issue Oct 12, 2021 · 0 comments
Open

用文件IO的方式操作GPIO来控制屏幕开关 #81

soapgu opened this issue Oct 12, 2021 · 0 comments
Labels
安卓 安卓

Comments

@soapgu
Copy link
Owner

soapgu commented Oct 12, 2021

  • 前言

我前面讲的和Android SDK无关,有一种方式可以直接控制GPIO的方式来操作屏幕的开关。

  • 什么是GPIO

GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中经常有数量众多。可是结构却比較简单的外部设备/电路。对这些设备/电路有的须要CPU为之提供控制手段,有的则须要被CPU用作输入信号。

并且,很多这种设备/电路仅仅要求一位。即仅仅要有开/关两种状态就够了。比方灯亮与灭。

对这些设备/电路的控制。使用传统的串行口或并行口都不合适。

所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。

接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。

数据寄存器的各位都直接引到芯片外部,而对这样的寄存器中每一位的作用,即每一位的信号流通方向,则能够通过控制寄存器中相应位独立的加以设置。这样。有无GPIO接口也就成为微控制器差别于微处理器的一个特征。

  • 操作GPIO用户接口sysf

其实Linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。
Android和Linux出自”同门“,也有这个功能

C:\Users\xxxx>adb shell
shell@pegasus:/ $ cd /sy
sys/     system/
shell@pegasus:/ $ cd /sys/class/gpio
shell@pegasus:/sys/class/gpio $ ls
export   gpio1049 gpio1189 gpio1237     gpiochip1024 gpiochip1088 gpiochip1152 gpiochip1216 unexport
gpio1048 gpio1051 gpio1218 gpiochip1000 gpiochip1056 gpiochip1120 gpiochip1184 gpiochip1248

首先浏览下 /sys/class/gpio目录下有哪些内容?

  • /sys/class/gpio/export

文件用于通知系统需要导出控制的GPIO引脚编号

  • /sys/class/gpio/unexport

用于通知系统取消导出

  • /sys/class/gpio/gpiochipX

目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数 导出一个引脚的操作步骤

  • /sys/class/gpio/gpio{编号}

已经导出的引脚,名字直接和编号一一对应

root@pegasus:/sys/class/gpio # for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done
gpio0: 1000
gpio1: 1024
gpio2: 1056
gpio3: 1088
gpio4: 1120
gpio5: 1152
gpio6: 1184
gpio7: 1216
gpio8: 1248

运行下脚本,可以看到本机有9个寄存器,以及他们的初始引脚编号

定位到已经导出的1189引脚

root@pegasus:/sys/class/gpio # cat /sys/class/gpio/gpio1189/value
1
root@pegasus:/sys/class/gpio # cat /sys/class/gpio/gpio1189/direction
out

可以了解到这是一个输出引脚,并且当前是高电平。

尝试去修改value

root@pegasus:/sys/class/gpio # echo 0 > /sys/class/gpio/gpio1189/value
root@pegasus:/sys/class/gpio # echo 1 > /sys/class/gpio/gpio1189/value
root@pegasus:/sys/class/gpio # echo 0 > /sys/class/gpio/gpio1189/value
root@pegasus:/sys/class/gpio # echo 1 > /sys/class/gpio/gpio1189/value

操作后,果然屏幕受到控制

  • GPIO控制实现原理

图文并茂一下,只是原理上解释下,真实接线可能还有差异

图片
如图为实物寄存器
图片
具体硬件引脚的说明

实体接线图
图片
电路示意图
图片

图的例子是接了一个led灯,具体例子可以换成其他东西包括屏幕,大家可以尽情脑补

@soapgu soapgu changed the title Quick Start for NDI——NDI SDK(二) 用文件IO的方式操作GPIO来控制屏幕开关 Oct 14, 2021
@soapgu soapgu added the 安卓 安卓 label Oct 14, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
安卓 安卓
Projects
None yet
Development

No branches or pull requests

1 participant