====设备树修改和编译实例==== 本文将介绍如何通过修改设备树来改变接口的功能。为了方便,我们选择CC6UL PRO SBC单板机来进行一些简单的修改和测试,以帮助用户快速掌握一些基本用法。有关NXP的IOMUX引脚复用基础知识,您可以阅读[[digi:arm-embedded:linux:dey:deykerneldevelopment: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 | 我们先看看对应接口的设备树文件在哪,在[[https://www.digi.com/resources/documentation/digidocs/90002285/|单板机/开发套件的英文文档]]中,点开左上角(一些浏览器显示在左侧)菜单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:arm-embedded:linux:dey:deykerneldevelopment:deydoc-bsp.png?600|}} 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