总线驱动开发及实现之GPIO
疯壳 出品
一、GPIO管脚标准操作方法
鸿蒙OS中定义了一套GPIO的接口,其中包含不少GPIO操作相关的方法,具体请参考源码目录:
\drivers\hdf\frameworks\include\platform\
\drivers\hdf\frameworks\support\platform\src
下的gpio_if.h、gpio_if.c文件,以及源码目录:
\drivers\hdf\frameworks\include\osal
下的osal_io.h文件。
下面我给大家介绍我们本次课程中用到的GPIO相关接口函数,后续课程中涉及GPIO操作的代码将不会继续做过多讲解,请认真对待本次课程。
关于osal_if.h文件
这个文件的接口相对偏底层,他提供了GPIO功能寄存器相关操作的接口,例如从I/O地址空间读取数据或者将数据写入I/O地址空间,以及I/O地址空间映射相关操作。本次课程代码中用到其中一个接口为:OSAL_WRITEL(value, address),原文截图如下:
该接口用于将一个整数写入I/O地址空间,其中value为要写入的数据,address为I/O地址。本次课程后续会结合实际GPIO操作对该接口进行讲解。
关于gpio_if.h、gpio_if.c文件
这两个文件主要提供了GPIO操作——例如设置GPIO方向(输入/输出)、设置GPIO管脚电平值、GPIO中断操作相关的方法,下面我们来一一认识一下他们。
GPIO方向配置
GpioRead 用于读取gpio指定的管脚当前电平值,其中gpio为管脚号,管脚号确定方法同上,val为指向存储电平值的变量的指针。管脚电平值在h头文件中描述如下:
GpioWrite 用于向gpio指定的管脚写入电平值val。
GPIO中断处理函数设置
GpioSetIrq 用于设定gpio指定的管脚的中断服务函数,其中mode为中断触发方式,func为中断服务函数指针,arg是指向中断传参的指针。中断相关的定义在源码目录:
\drivers\hdf\frameworks\include\osal\
下的osal_irq.h文件。例如上面说的mode取值如下:
以上取值分别为:不设置触发方式、上升沿触发、下降沿触发、高电平触发以及低电平触发。
func类型在gpio_if.h文件中定义如下:
同一时刻只能为一个GPIO设置一个中断服务函数,重复调用时,新的设置将会覆盖旧设置。如果不需要为管脚设置中断服务函数则可以通过GpioSetTrq取消设置。
GPIO中断使能设置
GpioEnableIrq 与 GpioDisableIrq分别用于使能/失能gpio指定的管脚中断功能,使能时,在对应条件下会触发中断,失能则反之,中断不起作用。
二、驱动代码
下面我们来看一下本次课程驱动代码以及app代码,主要改动在驱动文件,下述内容为主要改动,后续会将会将文件上传,大家可直接下载替换即可。
本次课程使用GPIO5_0作为测试GPIO管脚。
注:关于GPIO管脚功能定义、寄存器地址之类的信息,大家请自行找海思的SDK资料包了解。在海思的SDK资料中,Hi3518EV300_PINOUT_CN.xlsx 文档对GPIO5_0 有如下描述:
该管脚对应芯片的 Pin28,也就是我们开发板上标有28的排针引脚,该管脚的功能寄存器地址为0x112C0040,寄存器默认初始值为0x1000,最右一栏为寄存器值具体含义。
比如说我们这次课程需要将该管脚作为普通GPIO来使用,因此需要设置bit3:0 为0x0,bit7:4 选择最高档位的驱动能力0x0,第8bit设置1,使能管脚上拉电阻,第9bit设置0,第10bit设置0,余下保留。
因此代码中做如下设置:
在驱动初始化函数内进行GPIO的初始化:
上图中,GPIO中断mode设置为上升沿/下降沿触发。
其中中断服务函数如下:
每来10次中断我们就打印一次数据。
测试接口函数定义:
测试接口函数中,我们每500ms就翻转一次GPIO的电平信号,每次翻转总会触发一次中断(因为总是会有一次上升沿或者下降沿跳变)。
Dispatch修改如下:
App修改就很简单,直接下发一次iotest 命令即可。
接下来就是编译下载,我们来看看执行的结果:
上图为逻辑分析仪抓波结果。
上图为hitool调试窗口打印的信息。