By Toradex秦海

1). 简介

为了提高处理器的设计灵活性和可用性,NXP的所有i.MX系列处理器都配备了基于 IOMUX Controller (IOMUXC)和IOMUX来使能Pin Mux功能,使得一个特定的IO管脚可以选择不同的可能多达8种的功能定义模块(ALT0, ALT1, ALT2, ALT3...),同时为了适配不同的功能模块,IOMUXC可以对应配置管脚的配置参数(比如上拉/下拉,驱动能力等等)。本文就基于NXP最新的i.MX8系列平台说明Pin Mux的定义和配置方式。

本文所演示的平台来自于Toradex Apalis iMX8嵌入式平台,这个平台是基于近年发布的NXP iMX8系列ARM处理器,核心为Cortex-A72/A53。

2. 准备

a). Apalis iMX8 ARM核心版配合Apalis Eva Board载板,并连接调试串口用于测试。

b). 参考这里下载Toradex Ycoto Linux BSP5 Linux Kernel (toradex_5.4-2.3.x-imx分支)用于后续Device Tree修改和编译。

3). 规划管脚功能定义

a). 参考Apalis iMX8 datasheet 文档 4.4 SoC Functions List章节来找到所需要的iMX8管脚的功能定义和默认状态,比如这里我们就用 X1 Pin 6作为示例,其基本信息如下图,有4个功能模块定义,目前在Toradex Ycoto Linux Device Tree中默认配置功能是黄色高亮显示的ALT1 PWM功能,Reset Sate参考datasheet 4.3 Pin Reset Status章节定义是Pull-Down (Input) 状态。

b). Device Tree中一个管脚的IOMUX定义由两部分组成,如下是上述管脚X1 Pin 6在Devcie tree中作为PWM功能的管脚Pin mux定义作为参考

--------------------------------

/* Apalis PWM3 */

pinctrl_pwm0: pwm0grp {

fsl,pins = <

IMX8QM_UART0_RTS_B_LSIO_PWM0_OUT 0x00000020

>;

};

--------------------------------

./ fsl,pins 里面的定义就是具体的Pin mux定义,包含两部分。第一部分是 PIN_FUNC_ID ,其由 <SoC Ball Name>_<Mux Mode>组成,示例中”IMX8QM_UART0_RTS_B”就是<SoC Ball Name>,而”LSIO_PWM0_OUT”就是<Mux Mode>,也就是具体的功能模块定义(ALT1)。PIN_FUNC_ID在Kernel Device Tree源代码中通过相应pinctrl头文件定义,下面是NXP iMX8/iMX8x/iMX8MM/iMX8MP系列处理器对应的头文件位置列表供参考

--------------------------------

Apalis iMX8 - <linux-toradex>/include/dt-bindings/pinctrl/pads-imx8qm.h

Colibri iMX8X - <linux-toradex>/include/dt-bindings/pinctrl/pads-imx8qxp.h

Verdin iMX8M Plus - <linux-toradex>/arch/arm64/boot/dts/freescale/imx8mp-pinfunc.h

Verdin iMX8M Mini - <linux-toradex>/arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h

--------------------------------

./ 第二部分是管脚的配置参数(BIT_CONFIG),详细的定义需要从对应SoC处理器的Reference Manual文档 IOMUXD章节的对应管脚Pad Control 寄存器说明找到,比如上述示例引脚的相关定义可以从NXP iMX8QM Reference Manual 9.2.5.1.26 UART0_RTS_B (UART0_RTS_B) 章节找到,如下。

需要注意的是默认情况下Pin Ctrl寄存器29-27bit mux mode的配置保持000即可,因为这部分已经在前面PIN_FUNC_ID那里定义了。另外配置参数还有下面两个软件设置状态:

--------------------------------

NO_PAD_CTL(1 << 31) - 声明当前管脚无需配置参数

SION(1 << 30) - Software Input On Field,强制当前管脚Input Path而忽略mux mode设定的状态

--------------------------------

./ Kernel Documentation 关于NXP i.MX系列处理器的Pin Mux的说明可以参考如下

--------------------------------

<linux-toradex>/Documentation/devicetree/bindings/pinctrl/fsl,*-pinctrl.txt

--------------------------------

c). 基于上述描述,这里要将上述管脚功能定义从PWM修改为标准GPIO,并将GPIO管脚的初始状态设置为下拉(pull down)和高驱动能力(high drive strength)

./ 查找 pads-imx8qm.h 文件确定所需 PIN_FUNC_ID为 “IMX8QM_UART0_RTS_B_LSIO_GPIO0_IO22”

--------------------------------

#define IMX8QM_UART0_RTS_B_DMA_UART0_RTS_B IMX8QM_UART0_RTS_B 0

#define IMX8QM_UART0_RTS_B_LSIO_PWM0_OUT IMX8QM_UART0_RTS_B 1

#define IMX8QM_UART0_RTS_B_DMA_UART2_RX IMX8QM_UART0_RTS_B 2

#define IMX8QM_UART0_RTS_B_LSIO_GPIO0_IO22 IMX8QM_UART0_RTS_B 3

--------------------------------

./ 从iMX8QM Reference Manual UART0_RTS_B Pin Ctrl寄存器确认所需的 BIT_CONFIG参数是 0x00000040

4). 修改配置Device Tree文件

a). 修改方式由两种,一种是直接在Kernel源代码中修改设备对应的Device Tree文件源码然后重新编译Device Tree binary文件(.dtb)后部署,另外一种是通过生成Device Tree Overlay文件的方式直接部署,无需编译源代码。本文就简单示例通过源代码编译方式,如果需要了解Device Tree Overlay方式可以参考如下两个文档

./ https://developer.toradex.cn/knowledge-base/pin-multiplexing-in-device-tree

./ https://www.toradex.cn/blog/device-tree-overlay-shi-yong

./ https://developer.toradex.cn/knowledge-base/device-tree-overlays-linux

b). Device Tree源代码修改Patch如下,分别关闭默认占用X1 Pin 6的PWM功能,以及重新将X1 Pin6配置为GPIO通过iomuxc输出。另外,具体的Device Tree编译和部署可以参考如下文档

./ https://developer.toradex.cn/knowledge-base/build-u-boot-and-linux-kernel-from-source-code

./ https://developer.toradex.cn/device-tree-customization

./ https://developer.toradex.cn/knowledge-base/device-tree-customization-examples

--------------------------------

diff --git a/arch/arm64/boot/dts/freescale/imx8-apalis-eval.dtsi b/arch/arm64/boot/dts/freescale/imx8-apalis-eval.dtsi

index 0a4fe3898993..b75c649e706c 100644

--- a/arch/arm64/boot/dts/freescale/imx8-apalis-eval.dtsi

+++ b/arch/arm64/boot/dts/freescale/imx8-apalis-eval.dtsi

@@ -271,7 +271,7 @@

/* Apalis PWM3, MXM3 pin 6 */

&pwm0 {

- status = "okay";

+ status = "disabled";

};

/* Apalis PWM4, MXM3 pin 8 */

diff --git a/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi b/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi

index 0ece42889af8..8dfe04714ec7 100644

--- a/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi

+++ b/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi

@@ -426,7 +426,7 @@

<&pinctrl_mipi_dsi_0_1_en>, <&pinctrl_mipi_dsi1_gpios>,

<&pinctrl_mlb_gpios>, <&pinctrl_qspi1a_gpios>,

<&pinctrl_sata1_act>, <&pinctrl_sim0_gpios>,

- <&pinctrl_usdhc1_gpios>;

+ <&pinctrl_usdhc1_gpios>, <&pinctrl_gpio9>;

apalis-imx8qm {

/* Apalis AN1_ADC */

@@ -600,6 +600,13 @@

IMX8QM_MLB_DATA_LSIO_GPIO3_IO28 0x00000021

>;

};

+

+ /* Apalis Pin Mux Demo GPIO9 */

+ pinctrl_gpio9: gpio9grp {

+ fsl,pins = <

+ IMX8QM_UART0_RTS_B_LSIO_GPIO0_IO22 0x00000040

+ >;

+ };

/* Apalis I2C1 */

pinctrl_lpi2c2: lpi2c2grp {

--------------------------------

b). 测试部署Device Tree 文件

./ 在修改部署之前X1 Pin 6管脚的状态可以参考如下文章,通过连接LED硬件配合libgpiod库进行测试,由于被PWM驱动占用因此无论通过gpioset如何设置这个管脚,外部LED始终是不亮状态没有变化

https://www.toradex.cn/blog/nxp-imx8-qian-ru-shilinux-xialibgpiod-ying-yong-shi-li

--------------------------------

### 系统启动后查看PWM驱动状态,管脚对应的PWM设备(5d000000.pwm)状态正常 ###

root@apalis-imx8-07308034:~# cat /sys/kernel/debug/pwm

platform/57244000.pwm, 1 PWM device

pwm-0 (backlight ): requested enabled period: 6666667 ns duty: 3111111 ns polaritye

platform/5d030000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

platform/5d020000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

platform/5d010000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

platform/5d000000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

### 由于管脚被PWM驱动占用,因此启动后LED为灭状态,而且无论通过gpioset 如何设置,LED始终为灭状态,无法控制 ###

root@apalis-imx8-07308034:~# gpioset 0 22=1

root@apalis-imx8-07308034:~# gpioset 0 22=0

--------------------------------

c). 修改部署新的Device Tree binary “imx8qm-apalis-v1.1-eval.dtb”后,通过LED发现可以正常控制X1 Pin 6管脚作为输出的电平状态了

--------------------------------

### 系统启动后,基于管脚初始状态为Pull Down,连接的LED灯为灭状态 ###

root@apalis-imx8-07308034:~# gpioinfo 0 |grep -e "MXM3_6"

line 22: "MXM3_6" unused input active-high

### 查看PWM驱动状态,管脚对应的PWM设备(5d000000.pwm)已经没有了 ###

root@apalis-imx8-07308034:~# cat /sys/kernel/debug/pwm

platform/57244000.pwm, 1 PWM device

pwm-0 (backlight ): requested enabled period: 6666667 ns duty: 3111111 ns polarity:

inverse

platform/5d030000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

platform/5d020000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

platform/5d010000.pwm, 1 PWM device

pwm-0 ((null) ): period: 2730667 ns duty: 0 ns polarity: normal

### 通过如下命令将管脚配置为输出高电平,连接的LED灯为亮状态 ###

root@apalis-imx8-07308034:~# gpioset 0 22=1

### 翻转输出为低电平,,连接的LED灯为灭状态 ###

root@apalis-imx8-07308034:~# gpioset 0 22=0

--------------------------------

./如果将X1 Pin 6管脚的Pin Mux配置BIT_CONFIG参数改为0x00000020,也就是由Pull Down改为Pull Up,那么实际测试上电启动系统后,连接的LED灯为亮状态。

5). 总结

本文基于NXP iMX8处理器演示了Pin Multiplexing的定义和配置方法,其他i.MX处理器也都是类似的思路。

NXP iMX8系列处理器Pin Multiplexing定义说明相关推荐

  1. linux 定时器中断 imx,NXP iMX8 存储性能测试

    1).简介 NXP iMX8系列应用处理器是NXP发布的基于Cortex-A72/A53/A35和Coretex-M4/M7等架构的ARM处理器,对于存储部分,主要支持MMC 5.1.SD Memor ...

  2. NXP iMX8 存储性能测试

    1). 简介 NXP iMX8系列应用处理器是NXP发布的基于Cortex-A72/A53/A35和Coretex-M4/M7等架构的ARM处理器,对于存储部分,主要支持MMC 5.1.SD Memo ...

  3. NXP iMX8和iMX6 ARM处理器网络性能对比

    By Toradex秦海 1). 简介 NXP iMX8已经正式发布,相较于之前NXP i.MX系列的主力产品iMX6,其性能有了大幅提升,本文就针对网络接口对NXP  iMX8和iMX6两款ARM处 ...

  4. Learning ADSP-TS201系列--Interrupt Pin

    原创作品,转载请注明原作者及地址! by 飞鸿惊雪 http://blog.csdn.net/niyufeng Learning ADSP-TS201系列--索引 1 Learning ADSP-TS ...

  5. 基于NXP iMX7 ARM处理器部署FreeRTOS实时操作系统

    1). 简介 FreeRTOS是广泛使用的开源实时操作系统, 被众多芯片厂商包括NXP所支持, 本文就展示在NXP iMX7 ARM处理器上面的M4核心上面部署FreeRTOS. NXP iMX7 A ...

  6. i.MX8芯片介绍(米尔电子iMX8系列核心板及开发板学习笔记)

    众所周知,NXP公司推出iMX8芯片已有很长一段时间.iMX8系列家族也越来越多,目前有iMX8 .iMX8M.iMX8M Mini.i.MX8M Nano4款芯片应用处理器.近期对米尔电子iMX8系 ...

  7. ARM系列处理器的分类

    1.ARM ARM即以英国ARM(Advanced RISC Machines)公司的内核芯片作为CPU,同时附加其他外围功能的嵌入式开发板,用以评估内核芯片的功能和研发各科技类企业的产品. ARM ...

  8. 嵌入式 ARM 控制器采用 NXP 的高性能处理器 I.MX6ULL

    嵌入式 ARM 控制器 BL301/BL302 系列是工业级坚固型工业控制器,采用 NXP 的 高性能处理器 I.MX6ULL,搭配先进的 ARM Cortex-A7 构架,运行速度高达 800MHz ...

  9. NXP iMX8 Ubuntu 系统移植及 ROS 应用

    By Toradex 胡珊逢 1). 简介 NXP iMX8 是NXP近期发布的基于Cortex-A72.Cortex-A53等性能非常强大的的ARM处理器, 默认 BSP 是基于 Yocto 工程编 ...

最新文章

  1. 解决redhat安装centos yum源的问题
  2. LeetCode-Partition List-分割链表-链表操作
  3. java从键盘输入数据斐波那契数_从键盘输入一个正整数n,打印出斐波那契数列的前n个元素...
  4. 几道web题简单总结
  5. 是现在的钱不值钱还是药太贵!
  6. 5G赋能中国智慧教育
  7. iOS设备控制打印机输出文本
  8. PHP23 AJAX分页
  9. P2805 [NOI2009]植物大战僵尸
  10. 用数羊的方式来解释熵
  11. matlab里的copula函数,常见copula函数简介
  12. python学习手册笔记
  13. excel教程自学网_企业Office办公软件自学视频教程word/excel/ppt 2003 2013 2016全套
  14. 金蝶EAS初始化操作手册之科目表
  15. 为IT和互联网写历史
  16. 如何创建一个虚拟机?
  17. go 切片排序以及转为带间隔符的字符串
  18. Linux·信号量全解
  19. C语言班级财务管理系统
  20. 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)

热门文章

  1. 熵,条件熵,相对熵,互信息的相关定义及公式推导
  2. SQL_TRACE的作用
  3. 使用Oracle sql_trace 工具
  4. 【区块链新手快速入门】如何构建一个区块链
  5. 电影《妖妖铃》改名为《妖铃铃》
  6. redis-port工具
  7. 英语前后缀大全 - 快速理解英语单词
  8. outlook删除服务器文件恢复,通过OutLook 2013 找回误删除的邮件
  9. quartus ii引脚分配再学习下
  10. LeetCode:387(Python)—— 字符串中的第一个唯一字符(简单)