嵌入式爱好者

GPIO复用-linux4.1.15-IMX6X系列

2019-7-31 16:26| 发布者: 飞凌-unix| 查看: 2310| 评论: 2

类目: I.MX6系列产品  >  Linux     文档编号: 301


本文简单介绍一下GPIO的复用,配置GPIO的方式多种多样,本文只介绍通过IOMUX的方式配置GPIO,主要适用于飞凌OKMX6Q-C V1.3平台Linux4.1.15操作系统,其他平台也可以参考,但是不同平台之间会存在差异,需客户自行修改以适应自己的使用。    
一 使用 IOMUX方式配置GPIO 
1. 以底板上UART2_TX引脚为例,可以看到该引脚目前的功能是串口功能,将该引脚复用为GPIO使用,在飞凌提供的硬件手册中可以查看到该引脚对应的pad name为EIM_D26;

    
2. 在内核源码linux4.1.15/arch/arm/boot/dts/imx6q-pinfunc.h中搜索EIM_D26可以看到如下宏定义:
  
其中
#define MX6QDL_PAD_EIM_D26__GPIO3_IO26              0x0bc 0x3d0 0x000 0x5 0x0
为该引脚作为GPIO的定义

3.在 linux4.1.15/arch/arm/boot/dts/imx6qdl-sabresd.dtsi设备树中重新配置该引脚,首先搜EIM_D26找到相关的引脚配置,可以看到原有功能是被配置成为串口功能:
 
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功能的配置:

 

以上修改完成后,重新编译,并将新生成的镜像烧写到开发板上即可。
引脚复用的原则是:在设备树中添加想要实现的该引脚的功能,并把以前的复用功能去掉,无复用功能直接添加即可。
二 文件系统的操作
以上操作完成了内核中的引脚复用的配置,下面我们看一下应用中怎么操作;开发板启动后可以在文件系统中执行以下操作。
1. 计算对应 sys/class/gpio 的值 GPIOn_IOx = (n-1)*32 + x  
那么GPIO3_IO26=(3-1)*32+26=90 
2. 将 GPIO3_IO26 设置为输出。 
echo 90 > /sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号 
3. 将该引脚设置为输出
echo out > /sys/class/gpio/gpio90/direction 将GPIO设置为输出  
4. 设置输出引脚的电平
echo 1 > /sys/class/gpio/gpio90/value 输出为高电平
      echo 0 > /sys/class/gpio/gpio90/value 输出为低电平
   设置高电平或者是低电平后,可使用万用表测量一下该引脚的具体电平值。
5. 取消该引脚的导出
echo 90 > /sys/class/gpio/unexport 通知系统取消导出 
6. 将 该引脚设置为输入。
 echo 90 > /sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号
     echo in > /sys/class/gpio/gpio90/direction 将GPIO设置为输入 这时给该引脚接高电平,输入即为高电平,反之为低电平
     设置为输入模式可以通过 cat  /sys/class/gpio/gpio90/value 命令查看当前值
以上是一个引脚功能复用的整个过程,下面简单介绍一下一些参数的配置
三 对一些参数的解读
在imx6q-pinfunc.h中
#define MX6QDL_PAD_EIM_D26__GPIO3_IO26              0x0bc 0x3d0 0x000 0x5 0x0
这5个值得含义,已经做了解释
/* The pin function ID is a tuple of
 * */
在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手册中搜索pad name, EIM_D26引脚在CPU手册中是EIM_DATA26,如下图
红色方框圈出的偏移地址就是mux_reg_ofs的值

 

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

 
3.确定input_reg_ofs的值,CPU手册中没有该引脚作为gpio时对应的input配置,所以是0x000,那么对应的input_val,该值也为0x0.

4. 确定mux_mode的值,搜索IOMUXC_SW_MUX_CTL_PAD_EIM_DATA26,可以看到该值是0x5
 

5.确定pad_ctrl的值,搜索IOMUXC_SW_PAD_CTL_PAD_EIM_DATA26,可以看到该寄存器的各个位的含义,根据自己的实际情况来确定该值,该寄存器位数较多没有截全,请自行查看CPU手册
 

以上是小编对GPIO复用的一些浅显的理解,希望对您有所帮助;小编水平有限可能会存在一些纰漏,敬请谅解;对于更深入的知识,如果您想了解可以结合CPU手册以及源代码自行研究,有什么好的见解也可以给我们一块分享。非常感谢您的阅读。

1

已解决

未解决

只是看看

刚表态过的朋友 (1 人)

发表评论

最新评论

引用 千山雪 2020-11-23 12:51
这个是非常常用的,mark
引用 liuhuilfh 2020-1-2 17:25
建议把SION的功能加进去。

查看全部评论(2)

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-22 04:28

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部