网站建设属于什么会计科目,做网站公司怎么找客户,受欢迎的郑州网站建设,wordpress问答插件By Toradex秦海1). 简介为了提高处理器的设计灵活性和可用性#xff0c;NXP的所有i.MX系列处理器都配备了基于 IOMUX Controller (IOMUXC)和IOMUX来使能Pin Mux功能#xff0c;使得一个特定的IO管脚可以选择不同的可能多达8种的功能定义模块(ALT0, ALT1, ALT2, ALT3...)…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.hColibri iMX8X - linux-toradex/include/dt-bindings/pinctrl/pads-imx8qxp.hVerdin iMX8M Plus - linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-pinfunc.hVerdin 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.dtsiindex 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.dtsiindex 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)状态正常 ###rootapalis-imx8-07308034:~# cat /sys/kernel/debug/pwmplatform/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始终为灭状态无法控制 ###rootapalis-imx8-07308034:~# gpioset 0 221rootapalis-imx8-07308034:~# gpioset 0 220-------------------------------- c). 修改部署新的Device Tree binary “imx8qm-apalis-v1.1-eval.dtb”后通过LED发现可以正常控制X1 Pin 6管脚作为输出的电平状态了--------------------------------### 系统启动后基于管脚初始状态为Pull Down连接的LED灯为灭状态 ###rootapalis-imx8-07308034:~# gpioinfo 0 |grep -e MXM3_6 line 22: MXM3_6 unused input active-high### 查看PWM驱动状态管脚对应的PWM设备(5d000000.pwm)已经没有了 ###rootapalis-imx8-07308034:~# cat /sys/kernel/debug/pwmplatform/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灯为亮状态 ###rootapalis-imx8-07308034:~# gpioset 0 221### 翻转输出为低电平连接的LED灯为灭状态 ###rootapalis-imx8-07308034:~# gpioset 0 220-------------------------------- ./如果将X1 Pin 6管脚的Pin Mux配置BIT_CONFIG参数改为0x00000020也就是由Pull Down改为Pull Up那么实际测试上电启动系统后连接的LED灯为亮状态。 5). 总结本文基于NXP iMX8处理器演示了Pin Multiplexing的定义和配置方法其他i.MX处理器也都是类似的思路。