▲点击上方“广州天嵌”关注公众号后回复TQIMX8MM获取板卡wiki资料
例程开发板:TQIMX8MM
开发板系统:Ubuntu 20.04
内核版本:5.4.24
前言
随着嵌入式系统的不断发展,设备树作为一种重要的硬件描述语言,已经成为了嵌入式系统开发中不可或缺的一部分。
在设备树中,配置IO引脚和复用功能是非常常见的需求。
这时候,pinctrl就会发挥重要的作用。
它可以帮助开发者在不同的设备上配置GPIO引脚和复用功能,从而方便地实现硬件资源的管理和控制。
在本文中,我们将详细介绍如何在设备树中借助pinctrl来配置GPIO引脚和复用功能,以及如何在Linux内核中使用这些配置来控制硬件资源。
由于篇幅有限,本文只涉及IO引脚复用配置,如需完全掌握IO引脚配置并使用,还需进一步了解IO引脚电气特性配置方法以及GPIO子系统相关知识。
pinctrl子系统简介
大多数芯片的引脚都是支持复用的,如某些引脚既可以设置为GPIO,也可设置为I2C,此外,与单片机一样,引脚还需要设置各种电气特性,如上拉下拉、速度、驱动能力等。
在如今芯片上百个引脚的情况下,传统寄存器配置引脚的方法显得非常吃力,其中容易造成引脚功能冲突等问题显得尤为突出,pinctrl就是为解决此类问题而诞生的。
pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
对于我们使用者,一般只需在设备树中修改引脚相关属性既可,引脚初始化等工作均由pinctrl完成。以下将介绍基于pinctrl的引脚复用配置思路方法。
引脚复用基本思路
1.根据需要复用的功能,查找空闲可用引脚
2.如无空闲引脚,可先关掉原先占用这些引脚的设备
3.在对应的外设的设备树修改或添加复用功能引脚
1、确认功能引脚
比如,需要使用PWM1,在《IMX8MMRM.pdf》芯片参考手册(以下简称芯片手册)第八章,IO复用表,找到PWM1:
可以看到此功能可以在这三个引脚中选择一个作为复用。
若选择“I2C4_SDA”引脚作为PWM1,需要在设备树中关闭引脚原来的功能,再进行修改复用。
2、查找并关闭引脚占用
①在“imx8mm-tqv1.dts”设备树中搜索“I2C4_SDA”,可以发现引脚有两处引用:
此处作为I2C4输出:
②此处作为GPIO:
③搜索这两个节点的名称,查看是否被调用:
在“imx8mm-tqv1-lvds.dts”文件中,找到“pinctrl_i2c4”节点的引用,但并未在此设备树文件或其他设备树文件中找到“pinctrl_gpio_wlf”的引用,说明只有“pinctrl_i2c4”配置生效,现在引脚被复用为I2C4的SDA功能:
④将此节点注释:
vscode中选中代码块,键盘Ctrl+/进行注释
3、重新配置设备引脚
①搜索找到pwm1的pinctrl节点:
在“imx8mm-tqv1.dts”找到:
②找到相关复用宏定义:
在“imx8mm-pinfunc.h”中可以找到“PWM1_OUT”的相关的宏定义,可以搜索到三条,找到“I2C4_SDA”引脚的此条定义:
③替换复用宏定义:
将“pinctrl_pwm1”节点下的宏定义替换为刚刚找到的宏定义:
修改完成:
至此,“I2C4_SDA”引脚被复用成“PWM1_OUT”功能。
下面列举I2C的引脚配置。
I2C引脚复用配置
由于不同外设的复用方式各有不同,需要具体情况具体分析。
本例以I2C4引脚复用配置举例,在IMX8MM上,通过查看芯片手册得知,每一路硬件I2C只能用唯一的特定的引脚,无法复用成其他引脚,但当其引脚被其他功能占用时,就需要先关闭占用引脚的功能。
1.在芯片手册中查找功能对应的引脚
可以看到,要使用“I2C4_SCL”和“I2C4_SDA”:
2.在设备树中查找引脚是否被占用,有占用就关闭:
“I2C4_SDA”被PWM1占用,注释此节点,或将此节点功能引脚改复用成其他引脚:
这个节点也用到了此引脚,但节点未被调用,可以不用管:
这个同上,未被调用,不用管:
3.将“pinctrl_i2c4”节点的引脚设置为“I2C4_SCL”和“I2C4_SDA”:
至此,在设备树中I2C4引脚复用配置完成。