找回密码
 注册
关于网站域名变更的通知
查看: 536|回复: 1
打印 上一主题 下一主题

iTOP3399开发板GPIO子系统-应用层控制GPIO

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-5-18 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
GPIO 是比较常用的资源,比如说控制 LED 灯亮灭,控制 LCD 上电,控制模块的复位电路,做外设的中断脚等等,这些都有对 GPIO 的操作和使用,所以说,GPIO 开发是驱动开发中必不可少的操作,而且也是最基础的东西。我们在驱动开发过程中,有时候我们不能确定自己使用和申请的 gpio 是否对了,我们可以把它对应的数值给打印出来,通过对比对应的数值可以确定我们具体使用的是哪个数值,输入以下命令:& D/ j0 V9 D- b2 F3 t+ K
cat /d/pinctrl/pinctrl/pinmux-pins
6 p5 _: U9 n6 [! t* j2 R& o8 \cat /sys/kernel/debug/gpio
+ d' g7 d9 n/ ]6 @8 @# [Linux 系统中,GPIO 子系统大致分为三层,分别是 GPIO 硬件层,GPIO 硬件驱动层,抽象的驱动框架。
& |; T5 m  G3 L5 i0 a# x5 g' W  @" ~ , d0 |; O3 H1 Q
应用层控制 GPIO
) c! [* _. E7 t# B内核已经自带了通用 GPIO 驱动,可以直接在用户空间进行操作,iTOP-3399 开发板烧写 Linux 系统,启动后可以进入到/sys/class/gpio 目录下进行查看 GPIO 的相关信息,如下图所示:
; Y2 m' J5 |5 [0 R* _: p
/ e" v) D% n- |/sys/class/gpio/sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号/sys/class/gpio/unexport 用于通知系统取消导出。export 和 unexport,他们都是只写的。8 z" W9 K6 A, s9 g8 H9 e
/sys/class/gpio/gpiochipX 目录下保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数。比如我们进入到 gpiochip128,如下图所示:! z( d+ r0 F( s, K4 n
- t+ j9 V8 G' J# m2 ]$ M4 B
导出一个引脚的步骤:* g# c# P$ n3 g! d+ {
1 计算此引脚编号,引脚编号=控制寄存器的寄存器基数+控制引脚寄存器位数。在 rk3399 中,GPIO_number的计算方法为:n*32 + (K-A)*8 + x;; T) g/ P" [9 {% x) h1 l# F( [; m
比如 GPIO1_B1 = 1 * 32 + (B-A)*8 + 1 = 32 + 8 + 1 = 41;
  ]8 e* L% i3 s2 w4 \' t7 LGPIO1_B2 = 1 * 32 + (B-A)*8 + 2 = 32 + 8 + 2 = 42;" R9 ]) ?5 J' [5 j, g
GPIO0_A3= 0 * 32 + (A-A)*8 + 3 = 0 + 0 + 3 = 3, u1 Y( Y7 B2 D- t  U: q$ g" N
括号里面的 A、B、C、D 分别代表数值 0、1、2、3,在计算时候分别对应即可。
* ~0 d* d6 ^, w0 V  z2 向/sys/class/gpio/export 写入此编号,比如引脚编号是 3,在 shell 中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio3 目录,如果没有出现相应的目录,说明此引脚不可导出:% R/ M$ ?( \) h; r, V4 s
echo 3 > /sys/class/gpio/export" u2 z, n8 }6 ~- T% w+ G0 U( h
如果在执行第一步的时候即 echo 3 > /sys/class/gpio/export 时出现了以下问题:. S2 r- e/ R7 Y5 V; e
sh: write error: Device or resource busy: [! _% x" S/ U# N' B
出现这个问题的原因是你将要使用的这个 gpio 口之前已经申请过了,包括内核申请或者使用上述方法申请过。unexport:释放相应的 GPIO,相应的节点会被删掉,如下所示:- t/ h% B- H6 v9 _/ q8 g3 C
echo 3 > /sys/class/gpio/unexport
3 H- w( T4 K$ r3 direction 文件,定义输入输出方向,可以通过下面的命令定义为输出,如下图所示:
0 ~) F% f# f1 V& F: e* l+ M; s* \) z2 }: a# c" X& J* z
注意:direction 接受的参数:in(输入), out(输出), high, low。high/low 同时设置方向为输出,并将 value设置为相应的 1(高电平)或 0(低电平)。1 ~. P9 o6 L7 k  `
4 edge 文件可以监听对应引脚的事件,需要把 direction 设置为输入。参数可设置为”none”(无中断触发), “rising”(上升沿触发), “falling”(下降沿触发),“both”(上升、下降都沿触发)。
8 k: X3 o) t& w9 U6 p) {# z* Z5 active_low:此值可以反转 value 中的值。
; v; g, Q+ n& R' l  S
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-23 04:52 , Processed in 0.078125 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表