【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第1章 GPIO基础知识

发布于:2025-03-01 ⋅ 阅读:(10) ⋅ 点赞:(0)

 瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【本文摘自】【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发

【相关视频】OpenHarmony学习开发系列教程(第1期 北向基础篇一)

                     OpenHarmony学习开发系列教程(第2期 南向基础篇一)


实战:第一篇OpenHarmony配置HDF驱动控制LED

第1章 GPIO基础知识

1.1 什么是GPIO

GPIO意为通用输入/输出接口,GPIO端口可以配置为输入或输出状态,用于产生或读取高低电平信号。其高低电平的数量、波形组合及变化方式没有任何协议限制,用户可以根据需求自由设定。GPIO广泛应用于驱动简单外设,如LED、按键、开关等,不需要复杂的协议支持。

与GPIO不同,专用IO端口通常是为特定通信协议设计的,具有更严格的协议要求。它们的高低电平数量、波形组合以及波形的持续时间必须严格遵循相应协议的规范。常见的专用IO协议包括I2C、SPI、UART和PWM等。这些接口通常用于数据传输或信号控制,如在传感器、显示模块、通信设备等应用中,要求精确的时序和信号格式。

芯片通常需要提供丰富的功能和外部接口,以满足各种应用需求。然而,由于芯片的管脚(pin)数量有限,为了最大化资源的利用,许多IO管脚支持多功能设计,并通过软件配置实现管脚的分时复用。也就是说,同一个管脚可以根据需求在不同的功能模式之间切换。需要注意的是,并非所有IO管脚都可以用作GPIO。某些管脚被专门设计用于支持特定的专用接口(例如用于连接外部存储芯片或通信模块),这些管脚的功能是固定的,无法配置为GPIO。而另一些管脚则可以自由配置为GPIO,供用户根据实际需求灵活使用。

1.2 GPIO引脚计算

为了更高效地管理数量众多的GPIO,通常会将GPIO管脚按照一定规则进行分组管理。每个GPIO管脚都会被分配一个组号和组内偏移(offset)值,后者表示该管脚在所在组中的位置。通过这种分组方式,可以简化GPIO的访问和配置。

不同的芯片,其GPIO的分组数量和每组内包含的管脚数量可能有所不同。这些设计差异通常取决于芯片的架构和应用需求。例如,在RK3568芯片中有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,常用以下公式计算引脚:

GPIO pin脚计算公式:pin = bank * 32 + number     //bank为组号,number为小组编号
GPIO 小组编号计算公式:number = group * 8 + X  

引脚编号=控制寄存器的寄存器基数+控制引脚寄存器位数。 在 rk3568 中, GPIO_number的计算方法为: n*32 + (K-A)*8 + x; 括号里面的 A、 B、 C、 D 分别代表数值 0、 1、 2、 3, 在计算时候分别对应即可。

下面演示LED9用户LED灯的GPIO0_PB7 pin脚计算方法: 

bank = 0;       //GPIO0_B7=> 0, bank ∈ [0,4]
group = 1;      //GPIO0_B7 => 1, group ∈ {(A=0), (B=1), (C=2), (D=3)}
X = 7;         //GPIO4_D7 => 5, X ∈ [0,7]
number = group * 8 + X = 1 * 8 + 7 =15
pin = bank*32 + number= 0 * 32 + 15 = 15;

1.3 GPIO用户态测试

sysfs控制接口为/sys/class/gpio/export和/sys/class/gpio/unexport。如下图所示:

​ 

/sys/class/gpio/export 用于将GPIO控制从内核空间导出到用户空间。/sys/class/gpio/unexport 用于取消GPIO控制从内核空间到用户空间的导出。 export 和 unexport,他们都是只写的。GpiochipX代表GPIO 控制器。

export:用于将指定编号的 GPIO 引脚导出。在使用 GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。注意 export 文件是只写文件,不能读取,将一个指定的编号写入到 export 文件中即可将对应的 GPIO 引脚导出,以GPIO0_PB7为例(pin计算值为15)使用export 文件进行导出,导出成功如下图所示:

 echo 15 > export

​ 

会发现在/sys/class/gpio 目录下生成了一个名为 gpio15 的文件夹(gpioX,X 表示对应的编 号),该文件夹就是导出来的 GPIO 引脚对应的文件夹,用于管理、控制该 GPIO 引脚。

unexport:将导出的 GPIO 引脚删除。当使用完 GPIO 引脚之后,需要将导出的引脚删除,同样该文件也是只写文件、不可读,使用unexport 文件进行删除GPIO0_PB7,删除成功如下图所示:

echo 15 > unexport

 

可以看到之前生成的 gpio15 文件夹就会消失!

需要注意的是,并不是所有 GPIO 引脚都可以成功导出,如果对应的 GPIO 已经被导出或者在内核中被使用了,那便无法成功导出,导出失败如下图所示:

 

出现上图报错的原因是该GPIO已经被其他GPIO使用,需要在内核中找到使用GPIO的驱动,并取消该驱动才可以正常使用GPIO。在使用GPIO15时,需要取消Linux内核源码中LED灯的配置,如下所示: 

再次使用以下命令导出GPIO0_PB7引脚,导出成功之后进入gpio15文件夹如下图所示:

echo 15 > export

 

可以看到gpio15文件夹下分别有active_low、device、direction、edge、power、subsystem、uevent、value八个文件,需要关心的文件是 active_low、direction、edge 以及 value 这四个属性文件,接下来分别介绍这四个属性文件的作用:

direction:配置 GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看 GPIO 当前是输入还是输出模式,写表示将 GPIO 配置为输入或输出模式;读取或写入操作可取的值为"out"(输出模式)和"in"(输入模式)。

在“/sys/class/gpio/gpio15”目录下使用cat命令查看direction输入输出模式,如下图所示:

cat direction

 

默认状态下的输入输出状态为“in”,由于direction为可读可写,可以使用以下命令将模式配置为输出,配置完成如下图所示

echo out > direction

cat direction

active_low:用于控制极性得属性文件,可读可写,默认情况下为 0,使用cat命令进行文件内容的查看,如下图所示 :

cat active_low

 

当 active_low 等于 0 时, value 值若为1则引脚输出高电平,value 值若为0则引脚输出低电平。当 active_low 等于 1 时 ,value 值若为0则引脚输出高电平,value 值若为1则引脚输出低电平。

edge:控制中断的触发模式,该文件可读可写。在配置 GPIO 引脚的中断触发模式之前,需将其设置为输入模式,四种触发模式的设置如下所示:

非中断引脚:echo "none" > edge

上升沿触发:echo "rising" > edge

下降沿触发:echo "falling" > edge

边沿触发:  echo "both" > edge

value: 设置高低电平,如果我们要把这个管脚设置成高电平,我们只需要给value设置成1即可,反之,则设置成0。使用命令

echo 1 > value

反之,把GPIO设置成低电平,使用命令

echo 0 > value