====NXP i.MX系列处理器之引脚复用详解==== i.MX系列处理器虽然引脚众多,但相比其片上系统诸多强大的功能,并不能靠这些引脚全部同时实现。因此许多处理器的引脚是可以通过内部配置为不同的接口功能来匹配应用,从而利用处理器搭建更强大更灵活的硬件平台。通过改变引脚配置实现不同的接口功能,称为引脚复用(IOMUX)。虽然处理器的引脚通常都有一个默认的信号名称,但实际上它并不仅仅只能用作该信号功能,在NXP处理器中,引脚最多可以有8个复用选项(ALT模式),在Digi核心板的硬件参考手册中给出了Pin脚默认定义和它的复用选项,您也可以通过IOMUX表来查不同引脚所可配置的复用功能。 * [[#cc6ul-iomux|ConnectCore 6UL]] * [[#cc6-iomux|ConnectCore 6]] * [[#cc8x-iomux|ConnectCore 8X]] {{ digi:arm-embedded:linux:dey:deykerneldevelopment:connectcore_for_i.mx6ul_pinout_reve.xlsx |CC6UL引脚复用表}} \\ \\ 在[[https://www.digi.com/resources/documentation/digidocs/90001523/default.htm|CC6UL硬件参考手册]]中,除了可以看到引脚可复用的功能,也标出了在单板机和处理器所对应的信号名称。在NXP官方的Reference Manual中,处理器的引脚名称通常对就的是首个信号名称,引脚的功能由IOMUX配置寄存器定义。每个引脚还有一个PAD配置控制寄存器,用来设置引脚的电气参数。如有必要,您可以阅读官方的Reference Manual来获取更详细信息。在DEY中,使用内核设备树来为不同的底板配置处理器的引脚复用和电气特性。 https://www.digi.com/resources/documentation/digidocs/90002285/reference/bsp/r_device_tree_files.htm \\ \\ 引脚功能的重新分配或定义,需要通过修改设备树来实现,此外我们其实可以通过原理图或开发套件/单板机对应的设备树查到在开发套件上默认的信号名称。有关设备树修改和重新编译并应用,在本文后面会附上一个小小的例子。\\ 以CC6UL的uart3为例,在设备树 arch/arm/boot/dts/imx6ul-ccimx6ulsbc.dtsi中: /* UART3 */ &uart3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart3_2wires>; status = "disabled"; }; 上面引脚定义分配了"default"默认名称,定义pinctrl-0属性为pinctrl_uart3_2wires,我们可以在设备树文件中查得 pinctrl_uart3_2wires: uart3grp_2wires { fsl,pins = < MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x1b0b1 MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1 >; }; [[https://github.com/digi-embedded/linux/blob/v4.9/dey-2.4/maint/Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt|i.mx6ul引脚设备树定义文档]]中有对fsl,pins条目作出详细说明,它包含六个整数值代表引脚的IOMUX选择和电气特性,我们这里看到的是一个由尖扣号围起来的由宏定义的5个整数和第6个整数值。宏定义在i.mx6ul引脚功能头文件arch/arm/boot/dts/imx6ul-pinfunc.h里可以找到。 宏名称总是由“前缀_IC引脚名__复用功能名”组成,这里复用功能名也就是单板机上的接口用法,如 #define MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x00A4 0x0330 0x0000 0x0 0x0 这5个整数是: * IOMUX register offset (0x00A4) * Pad configuration register offset (0x0330) * Select input daisy chain register offset (0x0000) * IOMUX configuration setting (0x0) * Select input daisy chain setting (0x0) 第六个整型值0x1b0b1,对应的是引脚控制寄存器的配置。该数值定义了引脚的底层物理设置,我们可以参考[[https://github.com/digi-embedded/linux/blob/v4.9/dey-2.4/maint/Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt|i.mx6ul引脚设备树定义文档]]来换算出它所代表的意义,这里的CONFIG位有17位,在文档中是0~16表示,比如0x1b0b1,二进制是11011000010110001,它的最小位是1,也就是指 PAD_CTL_SRE_FAST (1 << 0) 而偏移量为3处,也就是bit3~bit1是 PAD_CTL_DSE_DISABLE (0 << 3) 以此类推,就可以得到该引脚的在文档中所定义的配置。您可以据此修改引脚或复制该功能到其它引脚,但注意不要配置同一个引脚两次,IOMUX配置由内核检测到到的设备的驱动设置,如果重复定义,将由后一个检测加载的驱动决定。 值得注意的是,上面的这些设备树中,status都是"disabled"状态,也就是默认是不开启的,因为这只是个头文件,在正式的板级dts文件中,重新将相应的引脚status定义为OK,这样编译出来的设备树就开启了相关的功能。内核分区中有个boot.scr脚本,它会读取板子的board_id,来决定加载哪个设备树文件,比如cc6ulsbc的开发套件board_id是135,因此加载的是imx6ul-ccimx6ulsbc-id135.dtb这个设备树文件。通常对IOMUX的修改,只需在体现硬件平台板子的设备树文件上进行,而不要去改动芯片级或模块级的dtsi文件。 Digi提供一个Smart IOMUX工具,让您更方便地进行IOMUX设备树引脚接口功能重分配时板级修改的相关操作。\\ 对cc6ul的引脚的接口功能变更或重新定义,需要修改设备树并编译应用它,您可以参考一个最简单的例子[[digi:arm-embedded:linux:dey:deykerneldevelopment:dt-modification-example|设备树修改和编译实例]] {{ digi:arm-embedded:linux:dey:deykerneldevelopment:connectcore_for_i.mx6x_lga_pinout_revh.xlsx |CC6/6+引脚复用表}} \\ \\ 在[[http://www.digi.com/resources/documentation/digidocs/pdfs/90001394.pdf|CC6硬件参考手册]]中,标出了NXP默认的信号名和引脚可复用的功能,但没有标出在单板机上默认的信号名称。在NXP官方的Reference Manual中,处引脚的功能由IOMUX配置寄存器定义。每个引脚还有一个PAD配置控制寄存器,用来设置引脚的电气参数。如有必要,您可以阅读官方的Reference Manual来获取更详细信息。在DEY中,使用内核设备树来为不同的底板配置处理器的引脚复用和电气特性。 https://www.digi.com/resources/documentation/digidocs/90002284/reference/bsp/r_device_tree_files.htm \\ \\ 引脚功能的重新分配或定义,需要通过修改设备树来实现,此外我们其实可以通过原理图或开发套件/单板机对应的设备树查到在开发套件上默认的信号名称。有关设备树修改和重新编译并应用,在本文后面会附上一个小小的例子。 以CC6的CAN2为例,设备树文件arch/arm/boot/dts/imx6qdl-ccimx6sbc.dtsi中定义了 &can2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_flexcan2>; stby-gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>; }; 引脚的性质和电气属性实际上引用pinctrl_flexcan2定义,如下: pinctrl_flexcan2: can2 { fsl,pins = < MX6QDL_PAD_SD3_DAT0__FLEXCAN2_TX 0x1b0b0 MX6QDL_PAD_SD3_DAT1__FLEXCAN2_RX 0x1b0b0 MX6QDL_PAD_GPIO_5__GPIO1_IO05 0x1b0b0 >; }; 在[[https://github.com/digi-embedded/linux/blob/v4.9/dey-2.4/maint/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt|i.mx6的引脚定义文档]]中有明确说明上述定义,fsl,pins是由六个整型值组成,代表着引脚的电气特性和IOMUX接口选择。我们这里看到的是一个由尖扣号围起来的由宏定义的5个整数和第6个整数值。宏定义在[[https://github.com/digi-embedded/linux/blob/v4.9/dey-2.4/maint/arch/arm/boot/dts/imx6q-pinfunc.h|i.mx6引脚功能头文件]]里可以找到。比如: 宏名称总是由“前缀_IC引脚名__复用功能名”组成,这里复用功能名也就是单板机上的接口信号定义,如 #define MX6QDL_PAD_SD3_DAT0__FLEXCAN2_TX 0x2c0 0x6a8 0x000 0x2 0x0 这里就可以看出单板机上CAN2引脚实际上是i.mx6片子上SD3对应的引脚。 五个整型值分别代表: * IOMUX register offset (0x02C0) * Pad configuration register offset (0x06A8) * Select input daisy chain register offset (0x0000) * IOMUX configuration setting (0x2) * Select input daisy chain setting (0x0) 第六个整型值0x1b0b1,对应的是引脚控制寄存器的配置。该数值定义了引脚的底层物理设置,我们可以参考[[https://github.com/digi-embedded/linux/blob/v4.9/dey-2.4/maint/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt|i.mx6的引脚定义文档]]来换算出它所代表的意义,这里的CONFIG位有17位,在文档中是0~16表示,比如0x1b0b1,二进制是11011000010110001,它的最小位是1,也就是指 PAD_CTL_SRE_FAST (1 << 0) 而偏移量为3处,也就是bit3~bit1是 PAD_CTL_DSE_DISABLE (0 << 3) 以此类推,就可以得到该引脚的在文档中所定义的配置。您可以据此修改引脚或复制该功能到其它引脚,但注意不要配置同一个引脚两次,IOMUX配置由内核检测到到的设备的驱动设置,如果重复定义,将由后一个检测加载的驱动决定。 值得注意的是,上面的这些设备树中,status都是"disabled"状态,也就是默认是不开启的,因为这只是个头文件,在正式的板级dts文件中,重新将相应的引脚status定义为OK,这样编译出来的设备树就开启了相关的功能。内核分区中有个boot.scr脚本,它会读取板子的board_id,来决定加载哪个设备树文件,通常对IOMUX的修改,只需在体现硬件平台板子的设备树文件上进行,而不要去改动芯片级或模块级的dtsi文件。 Digi提供一个Smart IOMUX工具,让您更方便地进行IOMUX引脚接口重定义时设备树的板级修改相关操作。\\ 对cc6的引脚的接口功能变更或重新定义,需要修改设备树并编译应用它,您可以参考一个最简单的例子[[digi:arm-embedded:cc6:cc6-dt-example|CC6修改设备树以重新定义接口引脚用途]] [[https://#|CC8X引脚复用表]]\\ \\ 该产品尚未发布,请稍后再查询... \\