基于飞凌 NXP IMX6X平台细说GPIO复用-

本文简单介绍一下GPIO的复用,配置GPIO的方式多种多样,本文只介绍经过IOMUX的方式配置GPIO,主要适用于飞凌 OKMX6Q-CV1.3 平台Linux4.1.15操做系统,其余平台也能够参考,可是不一样平台之间会存在差别,需客户自行修改以适应本身的使用。html

1、使用IOMUX方式配置GPIO

1. 以底板上UART2_TX引脚为例,能够看到该引脚目前的功能是串口功能,将该引脚复用为GPIO使用,在飞凌提供的硬件手册中能够查看到该引脚对应的padname为EIM_D26。linux


f_bc6019a398efc583e247428f3d0d3cc7&t=jpg&o=&s=&v=1583564599

 

2.在内核源码linux4.1.15/arch/arm/boot/dts/imx6q-pinfunc.h中搜索EIM_D26能够看到以下宏定义:ide


f_3b698584a12e04e0c3ba7ef09a6117eb&t=png&o=&s=&v=1583564588


其中spa

#define  操作系统

0x0bc 0x3d0 0x0003d

MX6QDL_PAD_EIM_D26__GPIO3_IO26orm

0x5 0x0htm

为该引脚做为GPIO的定义开发

 

3. 在linux4.1.15/arch/arm/boot/dts/imx6qdl-sabresd.dtsi设备树中从新配置该引脚,首先搜EIM_D26找到相关的引脚配置,能够看到原有功能是被配置成为串口功能:get

 

pinctrl_uart2:uart2grp {

fsl,pins= <

MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1

MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1

>;

};

&uart2{

pinctrl-names= "default";

pinctrl-0= <&pinctrl_uart2>;

status= "okay";

};

将status= "okay"修改成:status= "disabled"

&uart2{

pinctrl-names= "default";

pinctrl-0= <&pinctrl_uart2>;

status= "disabled";

};

 

以上修改是关闭串口功能的调用,而后接着添加该引脚GPIO功能的配置:

 

f_f066bc38faa9b162be3606f0aa9d3403&t=png&o=&s=&v=1583564577  

以上修改完成后,从新编译,并将新生成的镜像烧写到开发板上便可。

引脚复用的原则是:在设备树中添加想要实现的该引脚的功能,并把之前的复用功能去掉,无复用功能直接添加便可。

 2、文件系统的操做

以上操做完成了内核中的引脚复用的配置,下面咱们看一下应用中怎么操做;开发板启动后能够在文件系统中执行如下操做。

 

❶ 计算对应 sys/class/gpio 的值 GPIOn_IOx = (n-1)*32 + x  

那么GPIO3_IO26=(3-1)*32+26=90

 

❷  将 GPIO3_IO26 设置为输出。

echo 90 > /sys/class/gpio/export 用于通知系统须要导出控制的GPIO 引脚编号

 

❸ 将该引脚设置为输出

echo out > /sys/class/gpio/gpio90/direction 将GPIO设置为输出

 

❹ 设置输出引脚的电平

echo 1 >/sys/class/gpio/gpio90/value 输出为高电平

echo 0> /sys/class/gpio/gpio90/value 输出为低电平

设置高电平或者是低电平后,可以使用万用表测量一下该引脚的具体电平值。

 

❺ 取消该引脚的导出

echo 90 > /sys/class/gpio/unexport 通知系统取消导出

 

❻ 将 该引脚设置为输入

echo 90 > /sys/class/gpio/export 用于通知系统须要导出控制的GPIO 引脚编号

echo in> /sys/class/gpio/gpio90/direction 将GPIO设置为输入这时给该引脚接高电平,输入即为高电平,反之为低电平

设置为输入模式能够经过cat /sys/class/gpio/gpio90/value 命令查看当前值

 

以上是一个引脚功能复用的整个过程,下面简单介绍一下一些参数的配置。  

3、对一些参数的解读

在imx6q-pinfunc.h中


#define 

0x0bc0x3d0 0x000 0x5 0x0

MX6QDL_PAD_EIM_D26__GPIO3_IO26



这5个值得含义,已经作了解释

/* The pin function ID is a tuple of

 * <mux_reg conf_reg input_reg mux_mode input_val>*/

在imx6qdl-sabresd.dtsi中也有一个值得设置:

MX6QDL_PAD_EIM_D26__GPIO3_IO26  0x30b0

以上这6个参数有如下对应关系:


0x0bc

0x3d0

0x000

0x5

0x0

0x30b0

mux_reg_ofs

conf_reg_ofs

input_reg_ofs

mux_mode

input_val

pad_ctrl


这些参数的具体值是根据CPU手册的IOMUX章节查找配置的。


1. 肯定mux_reg_ofs的值

在CPU手册中搜索padname, EIM_D26引脚在CPU手册中是EIM_DATA26,以下图红色方框圈出的偏移地址就是mux_reg_ofs的值。

 

f_a1e5a47d867fa8a0d0f5c09dc50affe5&t=png&o=&s=&v=1583564566

 

2. 肯定conf_reg_ofs的值

搜索EIM_DATA26,下图红色方框圈出的偏移地址即为该值。

 

f_5bf0bc67ed582c0db5064b5a6e2d55a4&t=png&o=&s=&v=1583564542

 

3. 肯定input_reg_ofs的值

iMX6Q  CPU手册中没有该引脚做为gpio时对应的input配置,因此是0x000,那么对应的input_val,该值也为0x0。

 

4.肯定mux_mode的值

搜索IOMUXC_SW_MUX_CTL_PAD_EIM_DATA26,能够看到该值是0x5。

 

f_380186f09f73f2b14d42c6e05bed0832&t=png&o=&s=&v=1583564534

  

5. 肯定pad_ctrl的值

搜索IOMUXC_SW_PAD_CTL_PAD_EIM_DATA26,能够看到该寄存器的各个位的含义,根据本身的实际状况来肯定该值,该寄存器位数较多没有截全,请自行查看CPU手册。


f_3090279e846b55175cfe3b62516491ed&t=png&o=&s=&v=1583564521

 

以上是小编对 GPIO复用 的一些浅显的理解,但愿对您有所帮助。小编水平有限可能会存在一些纰漏,敬请谅解。对于更深刻的知识,若是您想了解能够结合CPU手册以及源代码自行研究,有什么好的看法也能够给咱们一块分享,很是感谢您的阅读。


原文连接:https://www.forlinx.com/article_view_291.html

相关文章
相关标签/搜索