一、GPIO介绍
GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
本文以 GPIO0_B4 和 GPIO4_D5 这两个 GPIO 口为例写了一份简单操作 GPIO 口的驱动,在 SDK 的路径为:kernel/drivers/gpio/gpio-firefly.c,以下就以该驱动为例介绍 GPIO 的操作。
二、GPIO引脚计算
ROC-RK3568-PC 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0-A7、B0-B7、 C0-C7、 D0-D7 作为编号区分,常用以下公式计算引脚:
GPIO 引脚计算公式:pin = bank * 32 + number GPIO 小组编号计算公式:number = group * 8 + X
下面演示GPIO4_D5 引脚计算方法:
GPIO4_D5 对应的设备树属性描述为:<&gpio4 29 IRQ_TYPE_EDGE_RISING>,由kernel/include/dt-bindings/pinctrl/rockchip.h的宏定义可知,也可以将GPIO4_D5描述为<&gpio4 RK_PD5 IRQ_TYPE_EDGE_RISING>。
kernel/include/dt-bindings/pinctrl/rockchip.h内容如下:
当GPIO4_D5引脚没有被其它外设复用时, 我们可以通过export导出该引脚去使用:
导出后可看到gpio157:
三、普通GPIO配置
首先在kernel/arch/arm64/boot/dts/rockchip/rk356x-firefly-demo.dtsi中增加驱动的资源描述:
配置含义如下:
把firefly-gpio配置为GPIO0_B4,GPIO_ACtiVE_HIGH表示高电平有效 如果配置为低电平有效则为GPIO_ACTIVE_LOW。 然后在 probe 函数中对 DTS 所添加的资源进行解析,代码如下:
在驱动中调用 gpio_direction_output 就可以设置输出高还是低电平,这里默认输出从 DTS 获取得到的有效电平 GPIO_ACTIVE_HIGH,如果驱动正常工作,可以用万用表测得对应的引脚应该为高电平。如果要读出 GPIO,需要先设置成输入模式,然后再读取值:
以下是常用的 GPIO API 定义:
|