本文档主要介绍 iMX6 板子 gpio 引脚读写配置。有关平台文件的设备注册的资料可以参
考“iTOP-iMX6-平台文件注册设备”文档。注册的设备名称是“gpio_ctl”。
硬件环境:iMX6 开发板:核心板 v_1.2、底板 v_2.2(以及 v_2.1 底板)。
软件环境:Ubuntu12.04。
1.1 配置文件简述
配置 gpio 需要研究三个文件,分别为“ arch/arm/plat-mxc/include/mach/iomux-
mx6q.h”、“arch/arm/mach-mx6/board-mx6q_topeet.h”、“arch/arm/mach-
mx6/board-mx6q_topeet.c”。
其中“arch/arm/plat-mxc/include/mach/iomux-mx6q.h”文件为 IMX6 所有 IO 及其
每个 IO 所有功能的定义集合,用户可通过此文件来查询某个 IO 的功能的定义。
“arch/arm/mach-mx6/board-mx6q_topeet.h”文件用来定义初始化 IMX6 对应需要
用到的 IO 口的功能。在该文件对 gpio 进行初始化。
“arch/arm/mach-mx6/board-mx6q_topeet.c”文件为 IMX6 的板级初始化文件,在
该文件可以对 gpio 引脚进行设置。
1.2 硬件介绍
1.2.1 底板部分
查看 v_2.2 版本的 iMX6 底板原理图。我们以下面的 5 个引脚为例。进行下面的操作。
下图是 v_2.1 版本的底板原理图。
在底板原理图上搜索各个网络标号“EIM_D17”、“EIM_D18”、“EIM_D20”、
“KEY_ROW5”、“EIM_D19”。可以查看到均连接到板对板连接器。也就是全都连接到核
心板上。接下来去看核心板原理图。
1.2.2 核心板部分
搜索上述的网络标号,查看连接到核心板的什么位置。如下图。
由上图可知,五个引脚分别接到核心的“EIM_D17”、“EIM_D18”、“EIM_D20”、
“GPIO_1”、“EIM_D19”引脚。接下来在“arch/arm/plat-mxc/include/mach/iomux-
mx6q.h”查看各个 IO 口的功能定义。
1.3 软件配置
1.3.1 iomux-mx6q.h 文件
iomux-mx6q.h 文件主要功能是查询某个 IO 的功能的定义。
进入 iMX6 内核源码目录,使用“vi arch/arm/plat-mxc/include/mach/iomux-
mx6q.h”命令打开 iomux-mx6q.h 文件。如下图。
搜索上述查看到的五个引脚名称。
以引脚 1 为例。使用“/EIM_D17”搜索到如下信息。如下图。
由上图可以看见扩展总线”EIM_D17”被定义为 8 种功能。我们在使用该引脚是要注
意,无论是初始化还是定义功能,都不能冲突,避免自己使用的功能被其他功能占用。
EIM_D17 配置为 GPIO 功能时使用的是定义为:_MX6Q_PAD_EIM_D17__GPIO_3_17。
其中 _MX6Q_PAD_EIM_D17__GPIO_3_17 被定义为:
#define _MX6Q_PAD_EIM_D17__GPIO_3_17 \
IOMUX_PAD(0x03A8, 0x0094, 5, 0x0000, 0, 0)
这个宏比较关键,其原型为:
#define IOMUX_PAD(_pad_ctrl_ofs,_mux_ctrl_ofs,_mux_mode,_sel_input_ofs,_sel_input,_pad_ctrl)
IOMUX_PAD 宏有 6 个参数,每个参数的意思是:
引脚 2、3、12 和引脚 1 定义类似。不再赘述。再搜索一下引脚 10 的定义。使用
“/GPIO_1”命令,查看到如下信息。(注意 GPIO 为 MX6Q_PAD 之后的 GPIO)
由 上 图 可 知 , GPIO_1 配 置 为 GPIO 功 能 时 使 用 的 定 义 为 :
_MX6Q_PAD_GPIO_1__GPIO_1_1 。
现在可以暂时总结一下我们得到的信息。如下图。
1.3.2 board-mx6q_topeet.h 文件
board-mx6q_topeet.h 文件用来定义初始化 IMX6 对应需要用到的 IO 口的功能。
在 board-mx6q_topeet.h 文件中要搜索使用的 IO 有没有没被定义为其他功能,有的话
需要注释掉,然后添加自己的初始化定义。
在内核源码目录输入“vi arch/arm/mach-mx6/board-mx6q_topeet.h”命令,打开
board-mx6q_topeet.h 文件。如下图。
还是以 EIM_D17 的配置为例进行操作。使用”/MX6Q_PAD_EIM_D17”搜索初始化信
息,查看到该功能已经被初始化。把该初始化注释掉,如下图。
再次搜素没有发现其他相关定义。其他引脚与此类似。要保证没有被其他功能定义
(iomux-mx6q.h 文件中的定义)。还需要注释掉一个地方,如下图。
下面给上述引脚添加初始化。如下图。
注意,是添加到 mx6q_topeet_pads[]之中。
1.3.3 board-mx6q_topeet.c 文件
board-mx6q_topeet.c 文件可以对 gpio 引脚进行设置。
在 board-mx6q_topeet.c 文件中我们将要使用的 gpio 管脚有可能被其他功能占用,需
要我们把其他功能注释掉、或者设置为 NULL。
在 iMX6 的内核源码目录,使用”vi arch/arm/mach-mx6/board-mx6q_topeet.c”命
令打开 board-mx6q_topeet.c 文件,如下图。
使用命令“/IMX_GPIO_NR(3, 17)”查找 EIM_D17 对应的配置。(此处应注意 17 和前
面的逗号之间有个空格,不然搜索不到)。把搜索到配置修改为 NULL。如下图。
其它引脚与此类似。全部修改如下图。
至此。我们的配置就都做完了。注意:IMX_GPIO_NR(1, 1)一共有两处。
按照”iTOP-i.MX6 开发板之全能版使用手册”中的内核编译步骤,进行编译内核。重新
烧写到开发板。进行下一步测试