TQIMX8MM設(shè)備樹IO引腳復(fù)用配置方法
▲點擊上方“廣州天嵌”關(guān)注公眾號后回復(fù)TQIMX8MM獲取板卡wiki資料

例程開發(fā)板:TQIMX8MM
開發(fā)板系統(tǒng):Ubuntu 20.04
內(nèi)核版本:5.4.24
前言??
隨著嵌入式系統(tǒng)的不斷發(fā)展,設(shè)備樹作為一種重要的硬件描述語言,已經(jīng)成為了嵌入式系統(tǒng)開發(fā)中不可或缺的一部分。
在設(shè)備樹中,配置IO引腳和復(fù)用功能是非常常見的需求。
這時候,pinctrl就會發(fā)揮重要的作用。
它可以幫助開發(fā)者在不同的設(shè)備上配置GPIO引腳和復(fù)用功能,從而方便地實現(xiàn)硬件資源的管理和控制。
在本文中,我們將詳細介紹如何在設(shè)備樹中借助pinctrl來配置GPIO引腳和復(fù)用功能,以及如何在Linux內(nèi)核中使用這些配置來控制硬件資源。
由于篇幅有限,本文只涉及IO引腳復(fù)用配置,如需完全掌握IO引腳配置并使用,還需進一步了解IO引腳電氣特性配置方法以及GPIO子系統(tǒng)相關(guān)知識。
pinctrl子系統(tǒng)簡介??
大多數(shù)芯片的引腳都是支持復(fù)用的,如某些引腳既可以設(shè)置為GPIO,也可設(shè)置為I2C,此外,與單片機一樣,引腳還需要設(shè)置各種電氣特性,如上拉下拉、速度、驅(qū)動能力等。
在如今芯片上百個引腳的情況下,傳統(tǒng)寄存器配置引腳的方法顯得非常吃力,其中容易造成引腳功能沖突等問題顯得尤為突出,pinctrl就是為解決此類問題而誕生的。
pinctrl 子系統(tǒng)主要工作內(nèi)容如下:
①、獲取設(shè)備樹中 pin 信息。
②、根據(jù)獲取到的 pin 信息來設(shè)置 pin 的復(fù)用功能
③、根據(jù)獲取到的 pin 信息來設(shè)置 pin 的電氣特性,比如上/下拉、速度、驅(qū)動能力等。
對于我們使用者,一般只需在設(shè)備樹中修改引腳相關(guān)屬性既可,引腳初始化等工作均由pinctrl完成。以下將介紹基于pinctrl的引腳復(fù)用配置思路方法。
引腳復(fù)用基本思路
1.根據(jù)需要復(fù)用的功能,查找空閑可用引腳
2.如無空閑引腳,可先關(guān)掉原先占用這些引腳的設(shè)備
3.在對應(yīng)的外設(shè)的設(shè)備樹修改或添加復(fù)用功能引腳
1、確認功能引腳??
比如,需要使用PWM1,在《IMX8MMRM.pdf》芯片參考手冊(以下簡稱芯片手冊)第八章,IO復(fù)用表,找到PWM1:

可以看到此功能可以在這三個引腳中選擇一個作為復(fù)用。
若選擇“I2C4_SDA”引腳作為PWM1,需要在設(shè)備樹中關(guān)閉引腳原來的功能,再進行修改復(fù)用。
2、查找并關(guān)閉引腳占用??
①在“imx8mm-tqv1.dts”設(shè)備樹中搜索“I2C4_SDA”,可以發(fā)現(xiàn)引腳有兩處引用:
此處作為I2C4輸出:

②此處作為GPIO:

③搜索這兩個節(jié)點的名稱,查看是否被調(diào)用:
在“imx8mm-tqv1-lvds.dts”文件中,找到“pinctrl_i2c4”節(jié)點的引用,但并未在此設(shè)備樹文件或其他設(shè)備樹文件中找到“pinctrl_gpio_wlf”的引用,說明只有“pinctrl_i2c4”配置生效,現(xiàn)在引腳被復(fù)用為I2C4的SDA功能:

④將此節(jié)點注釋:
vscode中選中代碼塊,鍵盤Ctrl+/進行注釋

3、重新配置設(shè)備引腳??
①搜索找到pwm1的pinctrl節(jié)點:
在“imx8mm-tqv1.dts”找到:

②找到相關(guān)復(fù)用宏定義:
在“imx8mm-pinfunc.h”中可以找到“PWM1_OUT”的相關(guān)的宏定義,可以搜索到三條,找到“I2C4_SDA”引腳的此條定義:

③替換復(fù)用宏定義:
將“pinctrl_pwm1”節(jié)點下的宏定義替換為剛剛找到的宏定義:

修改完成:

至此,“I2C4_SDA”引腳被復(fù)用成“PWM1_OUT”功能。
下面列舉I2C的引腳配置。
I2C引腳復(fù)用配置 ?
由于不同外設(shè)的復(fù)用方式各有不同,需要具體情況具體分析。
本例以I2C4引腳復(fù)用配置舉例,在IMX8MM上,通過查看芯片手冊得知,每一路硬件I2C只能用唯一的特定的引腳,無法復(fù)用成其他引腳,但當(dāng)其引腳被其他功能占用時,就需要先關(guān)閉占用引腳的功能。
1.在芯片手冊中查找功能對應(yīng)的引腳
可以看到,要使用“I2C4_SCL”和“I2C4_SDA”:

2.在設(shè)備樹中查找引腳是否被占用,有占用就關(guān)閉:
“I2C4_SDA”被PWM1占用,注釋此節(jié)點,或?qū)⒋斯?jié)點功能引腳改復(fù)用成其他引腳:

這個節(jié)點也用到了此引腳,但節(jié)點未被調(diào)用,可以不用管:

這個同上,未被調(diào)用,不用管:

3.將“pinctrl_i2c4”節(jié)點的引腳設(shè)置為“I2C4_SCL”和“I2C4_SDA”:
至此,在設(shè)備樹中I2C4引腳復(fù)用配置完成。