新闻  |   论坛  |   博客  |   在线研讨会
i.MX6 平台的 GPIO 应用笔记
电子禅石 | 2019-11-21 10:19:30    阅读:8496   发布文章

▋引言本文主要以FETMX6x-C平台,Linux3.0.35内核为基础,其他平台也可以参考,不同平台之间会存在差异,需自行修改适应自己的使用。

1

GPIO的通用操作



1.1 普通GPIO的使用    

在嵌入式系统中对GPIO的操作是最基本的操作。在Linux中有一个通用的GPIO操作接口。在开发板文件系统中会有一个控制GPIO的目录:/sys/class/gpio;linux-3.0.35内核中Documention文件夹下边有gpio.txt文档可以参考。

root@freescale/sys/class/gpio$ ls

export      gpiochip0    gpiochip160  gpiochip32   gpiochip96 gpiochip128  gpiochip192   gpiochip64    unexport

名称

描述

export

导出GPIO操作接口

unexport

撤销GPIO操作接口的导出

gpiochip0

GPIO1组

gpiochip32

GPIO2组

gpiochip64

GPIO3组

gpiochip96

GPIO4组

gpiochip128

GPIO5组

gpiochip160

GPIO6组

gpiochip192

GPIO7组

其中,export和unexport为GPIO子系统的属性文件,其余七个文件则为符号链接(gpiochip0,gpiochip32,gpiochip64,gpiochip96,gpiochip128,gpiochip160,gpiochip192),分别指向各自对应的GPIO组。

以gpiochip0为例,此目录下的文件有:

root@freescale/sys/class/gpio/gpiochip0$ ls

base      label      ngpio      power      subsystem  uevent

名称

描述

base

GPIO组的初始编号

label

GPIO组标签

ngpio

该组的GPIO总数

power

设备供电方面的相关信息

subsystem

符号链接,指向父目录

uevent

内核与udev(自动设备发现程序)之间的通信接口

当我们操作某个GPIO之前,需要先向export文件写入该GPIO编号以导出它的设备目录。GPIO编号的计算公式如下所示:

GPIO编号=(BANK-1)*32+N

在公式中BANK为GPIO引脚所在的GPIO组编号,N则为引脚在该个BANK中的序号。以GPIO7-IO03为例,其BANK值为7,N值为3,因此排列序号为(7-1)*32+3=195。

下面介绍该目录下的一些操作的用法。

1.1.1 GPIO编号导出

文件系统中/sys/class/gpio/export文件用于通知系统需要导出要控制的GPIO的编号:

echo195 >/sys/class/gpio/export

命令成功后生成/sys/class/gpio/gpio195目录。如果没有出现相应的目录,说明此引脚不可导出,一般这种情况是驱动中pinmux功能配置不正确,或者配置了多种pinmux功能引起冲突导致。

1.1.2 取消GPIO编号导出

文件系统中/sys/class/gpio/unexport文件用于通知系统取消GPIO编号导出

echo195  > /sys/class/gpio/unexport

1.1.3 配置GPIO的输入输出方向

echoout >/sys/class/gpio/gpio195/direction

direction可接收的参数:in,out,high,low;其中high,low设置方向为输出并将value值设置为相应的1/0。

1.1.4 查看GPIO的输入输出方向

cat/sys/class/gpio/gpio195/ direction

1.1.5 配置GPIO的高低电平(值为1/0)

当GPIO配置为输出模式时,可以通过设置value值设置GPIO的高低电平。

echo1 >/sys/class/gpio/value

1.1.6 查看GPIO的输出值

cat/sys/class/gpio/gpio195/value

2

驱动配置


2.1 修改pinmux配置  

驱动中的主要位置:linux3.0.35/drivers/gpio/gpiolib.c

修改文件arch/arm/mach-mx6/board-mx6q_c_sabresd.h,在其中增加该引脚对应的GPIO配置,该引脚如果有其他复用配置,需要将其他复用配置去掉,只保留一种pinmux配置。内核中引脚功能定义在arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中,该文件对每个引脚的复用功能进行了定义,有兴趣的可以自己看一下。

以释放原SD卡功能占用的部分引脚为例

修改文件arch/arm/mach-mx6/board-mx6q_c_sabresd.h,在其中增加如下定义:

/*GPIO*/

MX6Q_PAD_SD3_CLK__GPIO_7_3,

MX6Q_PAD_SD3_CMD__GPIO_7_2,

MX6Q_PAD_SD3_DAT2__GPIO_7_6,

MX6Q_PAD_SD3_DAT3__GPIO_7_7,

MX6Q_PAD_SD3_DAT4__GPIO_7_1,

MX6Q_PAD_SD3_DAT5__GPIO_7_0,

将原来的SD卡的功能注释掉

/*USDHC3 */

/*     MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,

MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ,

MX6Q_PAD_SD3_DAT0__USDHC3_DAT0_50MHZ,

MX6Q_PAD_SD3_DAT1__USDHC3_DAT1_50MHZ,

MX6Q_PAD_SD3_DAT2__USDHC3_DAT2_50MHZ,

MX6Q_PAD_SD3_DAT3__USDHC3_DAT3_50MHZ,

MX6Q_PAD_SD3_DAT4__USDHC3_DAT4_50MHZ,

MX6Q_PAD_SD3_DAT5__USDHC3_DAT5_50MHZ,

*/

 修改前 



 修改后 



修改完成后重新编译内核,并将镜像烧写到开发板上进行测试。

测试

echo195 > /sys/class/gpio/export

echoout > /sys/class/gpio/gpio195/direction

echo1 > /sys/class/gpio/gpio195/value

cat/sys/class/gpio/gpio195/value

3

Datasheet查看GPIO


3.1GPIO地址  IMX6DQRM.pdf手册中的第28章描述的是GPIO相关的内容,手册第二章MemoryMaps内存映射大概在215页,有关于GPIO组的映射地址:


3.2 GPIO寄存器  

数据手册第28章中第1429页描述的是GPIO控制的8个32位寄存器

寄存器

描述

GPIOx_DR

数据寄存器,当GPIO为输出时,可以通过写DR寄存器来驱动GPIO引脚

GPIOx_GDIR

控制GPIO引脚方向

GPIOx_PSR

GPIO为输入时,从PSR寄存器读取数据

GPIOx_ICR1

配置GPIO中断的触发方式,高低电平出发还是沿触发

GPIOx_ICR2

配置GPIO中断的触发方式,高低电平出发还是沿触发

GPIOx_IMR

中断屏蔽寄存器

GPIOx_ISR

中断状态寄存器

GPIOx_EDGR_SEL

设置边沿触发方式


3.3 引脚复用  数据手册36章IOMUXController这一章节有兴趣的也可以详细看一下或者从网络上找一些相关资料了解,此处不做详述。该章节主要描述引脚的复用配置以及一些功能的配置等,内核代码中关于这一块的配置在linux-3.0.35/arch/arm/plat-mxc/include/mach/iomux-mx6q.h文件中。该文件中的具体配置有兴趣的可以自己看一下,一般这块恩智浦(NXP)官方是默认配置好的,配置项的具体含义也可以从网上搜搜,并结合iomux-mx6q.h文件自己看看。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客