====CC6修改设备树以重新定义接口引脚用途的例子==== NXP系列ARM处理器的引脚可以复用作不同的接口或是作为GPIO使用,我们这里实际操作一下接口功能变更的过程,以便初学者领会i.MX系列处理器的强大能力。阅读本章节前,您可以先阅读[[digi:arm-embedded:linux:dey:deykerneldevelopment:iomux|NXP i.MX系列处理器之引脚复用详解]] ===选择一个方便测试接口=== 如果您手头没有CC6单板机对应的扩展端子,可以用单板机上的XBee插座,只需用一根线插到XBee插座对应的引脚,就可以用万用表去测量该引脚的电平变化。查看单板机的原理图,UART5_CTS_N和UART5_RTS_N分别接在XBee的16脚和9脚上,我们将以这两个信号的修改为例。 |引脚 |i.MX6引脚默认名称 |CC6引脚默认信号 |GPIO名称 | |D2 |KEY_ROW4 |UART5_CTS_N |ALT5: GPIO4_IO15 | |L2 |KEY_COL4 |UART5_RTS_N |ALT5: GPIO4_IO14 | 根据开发套件/单板机的硬件参考手册,UART5是4线的TTL电平,所以默认地,上面这两个引脚是CTS和RTS信号引脚,我们可以在设备树上将其改为两线的UART,这样UART5的CTS和RTS就可以当作普通的GPIO使用。 不同的硬件平台板子,对应加载的设备树可能不同,在U-Boot中,我们可以用ls来列出内核分区的文件。 ls mmc 0:1 在DEY 2.4以后,启动时会根据boot.scr脚本决定加载哪一个 dtb文件。我们只需对应地修改这个设备树源文件,编译出新的dtb文件来替换,就可以实现设备树的修改和变更。通过启动的log我们可以看到,uboot先加载执行boot.scr,然后加载内核和设备树文件,设备树的源码文件位于内核目录的arch/arm/boot/dts中,一般以zimage-<芯片>-<单板机>-.dts命名,在这些设备树源文件中,还会包含一些dtsi头文件,如果我们找的信号在dts里找不到,就可能需要到dtsi中查找。像这个例子中,dts文件只是启用了uart5,而对于uart5的信号定义,在imx6qdl-ccimx6sbc.dtsi中,找到uart5所在的定义项,注释掉RTS和CTS两行,保存 uart5 { pinctrl_uarts:uart5 { fsl,pins =< MX6QDL_PAD_KEY_ROW1__UART5_RX_DATA 0x1b0b1 MX6QDL_PAD_KEY_ROW1__UART5_TX_DATA 0x1b0b1 // MX6QDL_PAD_KEY_ROW1__UART5_RTS_B 0x1b0b1 // MX6QDL_PAD_KEY_ROW1__UART5_CTS_B 0x1b0b1 我们可以用 bitbake -c devshell virtual/kernel 来调出内核git终端,修改设备树,然后在终端内编译设备树或是在改好后退出用DEY编译修改后的设备树文件。 在内核终端下编译,用 make dtbs 在DEY下编译,用 bitbake -C compile virtual/kernel 我们可以在uboot中用updatefile命令来更新单个设备树文件,也可以在linux中通过装载内核启动分区,来进行内核分区的设备树文件更新。 先算出gpio号,根据cc6的[[https://www.digi.com/resources/documentation/digidocs/90002284/#reference/bsp/v4-9-cc6_cc6qp/r_general_purpose_input_output.htm|GPIO的BSP文档]],GPIO4_IO15=96+15=111 我们先测一下该脚的电平,默认是高电平。执行如下gpio操作 cd /sys/class/gpio/ echo 111 > export echo out > gpio111/direction echo 0 > gpio111/value 这里再测一下电平,发现并没有拉低,还是高电平 所以默认地,它是当CTS脚,不能当GPIO使用。我们把刚才的修改编译一下,生成新的dtb文件,然后更新到linux分区中。 updatefile linux tftp zImage-imx6q-ccimx6sbc-wb.dtb 注意,根据你的log,不同的版本有可能加载的设备树文件不一样 再测一下gpio111的电平,发现默认已经变低电平了,并且可以用sysfs API来设置它的电平,这两个引脚可以当作GPIO使用了 cd /sys/class/gpio/ echo 111 > export echo out > gpio111/direction echo 1 > gpio111/value echo 1 > gpio111/value 除了可以将接口改为标准GPIO,还可以根据ALT模式,将接口变更为另一种接口,请参考[[digi:arm-embedded:linux:dey:deykerneldevelopment:iomux|NXP i.MX系列处理器IOMUX]]的说明,自行设计产品的底板。