疯壳-鸿蒙OS-总线驱动开发及实现之GPIO

charlesc
发布于 2021-3-12 09:28
浏览
0收藏

一、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文件。

 

关于osal_if.h文件

 

这个文件的接口相对偏底层,他提供了GPIO功能寄存器相关操作的接口,例如从I/O地址空间读取数据或者将数据写入I/O地址空间,以及I/O地址空间映射相关操作。本次课程代码中用到其中一个接口为:OSAL_WRITEL(value, address),原文截图如下:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区该接口用于将一个整数写入I/O地址空间,其中value为要写入的数据,address为I/O地址。

 

关于gpio_if.h、gpio_if.c文件

 

这两个文件主要提供了GPIO操作——例如设置GPIO方向(输入/输出)、设置GPIO管脚电平值、GPIO中断操作相关的方法,下面我们来一一认识一下他们。

 

GPIO方向配置疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区GpioRead 用于读取gpio指定的管脚当前电平值,其中gpio为管脚号,管脚号确定方法同上,val为指向存储电平值的变量的指针。管脚电平值在h头文件中描述如下:

疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

GpioWrite 用于向gpio指定的管脚写入电平值val。

 

GPIO中断处理函数设置疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

GpioSetIrq 用于设定gpio指定的管脚的中断服务函数,其中mode为中断触发方式,func为中断服务函数指针,arg是指向中断传参的指针。中断相关的定义在源码目录:

\drivers\hdf\frameworks\include\osal\

 

 

下的osal_irq.h文件。例如上面说的mode取值如下:

以上取值分别为:不设置触发方式、上升沿触发、下降沿触发、高电平触发以及低电平触发。

func类型在gpio_if.h文件中定义如下:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

同一时刻只能为一个GPIO设置一个中断服务函数,重复调用时,新的设置将会覆盖旧设置。如果不需要为管脚设置中断服务函数则可以通过GpioSetTrq取消设置。

 

GPIO中断使能设置

疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

GpioEnableIrq 与 GpioDisableIrq分别用于使能/失能gpio指定的管脚中断功能,使能时,在对应条件下会触发中断,失能则反之,中断不起作用。

 

二、驱动代码

 

下面我们来看一下本次课程驱动代码以及app代码,主要改动在驱动文件,下述内容为主要改动。

疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

本次课程使用GPIO5_0作为测试GPIO管脚。

注:关于GPIO管脚功能定义、寄存器地址之类的信息,大家请自行找海思的SDK资料包了解。在海思的SDK资料中,Hi3518EV300_PINOUT_CN.xlsx 文档对GPIO5_0 有如下描述:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

该管脚对应芯片的 Pin28,也就是我们开发板上标有28的排针引脚,该管脚的功能寄存器地址为0x112C0040,寄存器默认初始值为0x1000,最右一栏为寄存器值具体含义。

比如说我们这次课程需要将该管脚作为普通GPIO来使用,因此需要设置bit3:0 为0x0,bit7:4 选择最高档位的驱动能力0x0,第8bit设置1,使能管脚上拉电阻,第9bit设置0,第10bit设置0,余下保留。

因此代码中做如下设置:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区在驱动初始化函数内进行GPIO的初始化:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

上图中,GPIO中断mode设置为上升沿/下降沿触发。

其中中断服务函数如下:

疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

每来10次中断我们就打印一次数据。

 

测试接口函数定义:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

测试接口函数中,我们每500ms就翻转一次GPIO的电平信号,每次翻转总会触发一次中断(因为总是会有一次上升沿或者下降沿跳变)。

Dispatch修改如下:疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区

App修改就很简单,直接下发一次iotest 命令即可。

 

接下来就是编译下载,我们来看看执行的结果:

疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区上图为逻辑分析仪抓波结果。疯壳-鸿蒙OS-总线驱动开发及实现之GPIO-鸿蒙开发者社区上图为hitool调试窗口打印的信息。

 

 

 

 

 

 

 

 

 

 

 

 


————————————————
版权声明:本文为CSDN博主「fengkesz」的原创文章 

分类
已于2021-3-12 09:28:56修改
收藏
回复
举报
回复
    相关推荐