本文将介绍如何通过修改设备树来改变接口的功能。为了方便,我们选择CC6UL PRO SBC单板机来进行一些简单的修改和测试,以帮助用户快速掌握一些基本用法。有关NXP的IOMUX引脚复用基础知识,您可以阅读NXP i.MX系列处理器之引脚复用详解

选择方便更改和测试的接口

最简单的一种改法,是通过屏掉接口的功能块,接通信接口变为普通的GPIO。在CC6UL PRO SBC中,我们选择CAN2来进行修改和测试。 从单板机的硬件参考中查得,CAN2的数据线和UART2的流控复用,物理连线上UART2_CTS默认是CPU输出,连到XBee的RTS,测试点为TP12,所以我们要禁用CAN2和UART2的流控功能,才能把它变为GPIO。 通过模块的硬件参考手册,可以查得:

引脚 边框引脚 默认名称 CAN口名称 GPIO名称
N21 46 UART2_CTS_N CAN2_TX GPIO1_IO22
M21 47 UART2_RTS_N CAN2_RX GPIO1_IO23

我们先看看对应接口的设备树文件在哪,在单板机/开发套件的英文文档中,点开左上角(一些浏览器显示在左侧)菜单Contents>Digi Embedded Yocto>System development>Linux Kernel>Linux v4.9 Board Support Package>,相关的BSP文档中有相应的设备树和驱动文件的描述,比如uart相关的在: Devices and interfaces > Universal asynchronous receiver/transmitter (UART)章节下。

Digi的U-Boot会根据核心板上模块的board_id来加载对应的设备树文件,cc6ulsbc开发套件的board_id是135, 核心模块的board_id有OTP位留给用户设置,如果没设置,会根据模块的variant来选择设备树文件,可以参考boot.scr。 cc6ul开发套件的设备树arch/arm/boot/dts/imx6ul-ccimx6ulsbc-id135.dts,我们可以用快速调出内核虚拟机的方式来快速修改它。但注意,模块出厂的board_id是没定义的,您可以自己定义或是并利用U-Boot的脚本实现不同产品加载不同的设备树文件。如果board_id未定义,会根据模块型号或uboot中的fdt_file参数来加载设备树。

bitbake -c devshell virtual/kernel

这样会直接打开一个内核git的shell窗口,先查看当前的设备树配置的引脚功能:

  • uart2定义了四线uart,含流控。
  • can2在id135的设备树默认把它注释掉了,以便用uart四线。

综上,我们应该只需禁了uart2或只用uart2两线就可以把相关引脚变成gpio。 注意,根据uart的文件描述符在i.mx系列中是ttymxc打头的,uart2对应的是ttymxc1。在修改之前,进入文件系统后ls /dev可以看到该uart口。禁用后对应的是gpio22和gpio23。

在uart四线作用下,GPIO1_IO22作为uart2的CtS引脚,在开发板上它连着xbee的第16脚,可以在这里方便用万用表测试,可以发现默认是高电平,并且无论如何操作sys/class/gpio/gpio22/value,总是测得高电平。我们把uart2改为两线

nano arch/arm/boot/dts/imx6ul-ccimx6ulsbc-id135.dts
修改uart2的地方如下:
pinctrl-0 = <&pinctrl_uart2_2wires>;
//uart-has-rtscts;

直接在devshell出现时的目录下编译dtb文件

make dtbs

这个命令将只编译设备树,编译结果在tmp/work/ccimx6ulsbc-dey-linux-gnueabi/linux-dey/4.9-r0/build/arch/arm/boot/dts下。 我们也可以用DEY来编译,

exit 先退出devshell,回到DEY项目目录
bitbake -C compile virtual/kernel   注意这里-C是大写,以便用更改后的设备树文件生效,

这样编译出来的内核和设备树文件在tmp/deploy/<平台>/image路径下。
不论用哪种方式编译出修改好的设备树文件,我们可以用它替换原来的,以便让新的设置生效。CC6等使用eMMC平台的内核分区是FAT格式,可以在uboot里用updatefile操作单个文件的更新,CC6UL使用UBIFS文件系统,则需要进入linux,加载linux内核分区到文件系统,以便替换内核或设备树。 给CC6UL核心板上电,进入linux后:

root@ccimx6ulsbc:~# mount -t ubifs /dev/ubi0_0 /boot
root@ccimx6ulsbc:~# ls -l /boot
在主机上,进入dtb所在目录,用scp传文件
scp myfile root@192.168.42.30:/boot/zImage-imx6ul-ccimx6ulsbc-id135.dtb
root@ccimx6ulsbc:~# umount /boot

重启,用gpio命令来检查是否生效,先测一下该引脚的电平,和刚才不一样,默认是低电平。

echo 22 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio22/direction
echo 1 > /sys/class/gpio/gpio22/value
这时可以测一下电平,已经变高了
echo 0 > /sys/class/gpio/gpio22/value
再测一下电平,变低了,这证明该引脚可以正常用作GPIO了。

接口功能变更可以让处理器更灵活地适配自己的应用,比如有些应用不需要那么多I2C接口,而是需要更多的串口等,根据芯片的IOMUX的规则,结合smart IOMUX软件,我们可以快速的修改和变更接口,实现不同的接口,让更多系列的产品可以用同一个模块实现。

上面我们介绍了单独编译设备树的方法,如果您希望把新的设备树集成在内核文件系统中,可以这样操作

编辑完设备树,退出devshell后
bitbake -f -c compile linux-dey
bitbake -c deploy linux-dey
bitbake dey-image-qt