小白也能玩转 i.MX6 平台的 GPIO 应用笔记
▋引言 :本文主要以FETMX6x-C平台,Linux3.0.35内核为基础,其他平台也可以参考,不同平台之间会存在差异,需自行修改适应自己的使用。
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.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
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文件自己看看。
■ 关注“飞凌嵌入式”公众号,不定期分享行业干货及产品一线资料。
■ 直接微信回复产品平台,如“LS1012A”,即可快速获取对应产品信息。
■ 想要了解飞凌更多信息,欢迎与我们联系:
销售工程师:400-699-6866
国际业务部:0312-3102650-854
技术服务部:0312-3119192
方案定制类:17713286015 (杜工),18633238067(王工)
■ 实时技术支持:
AM 9:00—11:30,PM 13:30—17:00(周一至周五)
相关产品 >
-
FETMX6Q-C核心板
i.MX6Q核心板板层出不穷,要如何选择?飞凌解读i.mx6Q芯片强性能为您推荐四核A9架构的i.MX6Q产品精选,包含iMX6Q 核心板、i.MX6Q 核心板、iMX6Q工业级核心板,欢迎采购。 i.MX6Q核心板基于NXP(原Freescale)Cortex-A9架构的i.MX6Q四核处理器设计,核心板小尺寸核心板搭配独特的薄款连接器,让设计随心所欲!
了解详情 -
OKMX6Q-C开发板
双千兆飞凌嵌入式iMX6Q开发板,板对板连接器,纤薄之际,次底板支持iMX6Q和iMX6DL核心板。i.MX6Q开发板与i.MX6DL开发板资源丰富,原理图、PCB、软件资源、硬件资源下载,技术支持等。欢迎选购
了解详情 -
FETMX6Q-S核心板
NXP iMX6Quad系列具有四个内核,运行频率达1.2 GHz,带有1 MB L2缓存和64位DDR3或2通道、32位LPDDR2支持。飞凌提供商业级iMX6Q核心板,工业级iMX6Q核心板,兼容一同底板。具有抗震,抗氧化,抗干扰,更快速升级产品等优势。保定飞凌嵌入式专注imx6,imx6开发板,飞思卡尔imx6等ARM嵌入式核心控制系统研发、设计和生产,是imx6,imx6开发板,飞思卡尔imx6提供者,imx6系列产品现已畅销全国,欢迎咨询!
了解详情 -
OKMX6Q-S3开发板
飞凌嵌入式提供iMX6Q开发板,iMX6解决方案,iMX6Q核心板,i.MX6Q开发板解决方案。iMX6Q稳定、快速、性价比高,欢迎选购 NXP iMX6系列芯片全支持,升级简配无忧替换。 了解详情