UART即通用異步收發器,是一種支持全雙工串行通信協議的接口。在i.MX6ULL處理器平臺上,該處理器原生支持多達8路的UART接口,提供了豐富的串行通信能力。
針對ELF 1開發板,實際引出了4路UART接口供開發者使用,具體包括UART1、UART2、UART3以及UART7。其中UART1用于調試,UART2、UART3用于連接RS485收發芯片,UART7連接TTL轉RS232芯片。
接下來,我們將針對上述幾個UART接口逐一進行詳細的配置說明。本次源碼適配工作是在NXP i.MX6ULL EVK評估板的Linux內核源碼(特定版本:Linux-imx_4.1.15)基礎上進行的,以確保UART接口能夠正確無誤的在ELF 1開發板上工作。
一、 準備工作
NXP源碼路徑:ELF1開發板資料包\07-NXP 原廠資料\07-1 NXP官方源碼\linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2
1、將NXP源碼拷貝到開發環境home/root/work目錄下解壓
elf@ubuntu:~/work$ tar jvxf linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2 elf@ubuntu:~/work$ cd linux-imx-imx_4.1.15_2.0.0_ga/ elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ls
2、添加默認配置文件
將arch/arm/configs路徑下的imx_v7_mfg_defconfig復制一份,命名為imx6ull_elf1_defconfig
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp arch/arm/configs/imx_v7_mfg_defconfig arch/arm/configs/imx6ull_elf1_defconfig
3、添加ELF 1設備樹
將arch/arm/boot/dts路徑下的imx6ull-14x14-evk.dts復制一份,命名為imx6ull-elf1-emmc.dts
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-elf1-emmc.dts
打開arch/arm/boot/dts/Makefile,找到CONFIG_SOC_IMX6ULL,將imx6ull-elf1-emmc.dts添加到Makefile中
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi arch/arm/boot/dts/Makefile
4、建立交叉編譯腳本
建立一個編譯腳本build.sh
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vim build.sh
添加以下內容,保存退出
#!/bin/bash export CPUS=`grep -c processor /proc/cpuinfo` source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi make distclean make imx6ull_elf1_defconfig make -j${CPUS} rm -rf ./.tmp make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/ cd .tmp/rootfs/ tar -jcvf modules.tar.bz2 *
給予腳本權限
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ chmod 777 build.sh
二、適配UART
1、硬件原理
(1)UART1
從原理圖中可以得到我們使用的UART1_RXD和UART1_TXD引腳對應的連接器引腳編號分別為27和28。
通過查表可以得到27和28的PAD NAME分別為UART1_RX_DATA和UART1_TX_DATA。
(2)UART2
從原理圖中可以得到我們使用的UART2_RXD和UART2_TXD引腳對應的連接器引腳編號分別為72和73。
通過查表可以得到72和73的PAD NAME分別為UART2_RX_DATA和UART2_TX_DATA。
(3)UART3
從原理圖中可以得到我們使用的UART3_RXD和UART3_TXD引腳對應的連接器引腳編號分別為77和78。
通過查表可以得到77和78的PAD NAME分別為UART3_RX_DATA和UART3_TX_DATA。
(4)UART7
從原理圖中可以得到我們使用的UART7_RXD和UART7_TXD引腳對應的連接器引腳編號分別為114和115。
通過查表可以得到114和115的PAD NAME分別為LCD_DATA17和LCD_DATA16。
2、IOMUX配置
確定好引腳之后,我們就可以在設備樹中添加相關引腳的IOMUX配置。
(1)UART1、UART2打開NXP BSP的arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件,可以看到關于UART1和UART2的IOMUX配置信息,這是因為,i.MX6ULL EVK板也引出了UART1(UART1一般都是作為調試串口使用)和UART2。
既然已經有了UART1和UART2的IOMUX配置,那我們就只需對比一下其配置的相應引腳跟ELF1開發板使用的引腳是否一致即可。上一節中已經確定了我們使用的UART1和UART2對應的引腳PAD NAME,UART1:UART1_RX_DATA和UART1_TX_DATA,UART2:UART2_RX_DATA和UART2_TX_DATA,對比arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中已配置好的IOMUX信息,可以看到是一致的:
由上圖可知,UART2的IOMUX節點uart2grp下配置了流控引腳RTS和CTS,我們板子沒有引出流控引腳,所以這里注釋掉流控配置:
(2)UART3
由上一節確定了我們使用的UART3收發引腳PAD NAME分別為UART3_RX_DATA和UART3_TX_DATA。
在arch/arm/boot/dts/imx6ul-pinfunc.h文件中分別搜索UART3_RX_DATA和UART3_TX_DATA,找到其復用成UART功能的宏:
MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX
然后在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件建立UART3的IOMUX配置節點,并添加上這兩條宏配置,其PAD寄存器的值參考了UART1和UART2:
pinctrl_uart3: uart3grp { fsl,pins = < MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0x1b0b1 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0x1b0b1 >; };
添加后效果如下:
(3)UART7
同理,UART7的PAD NAME分別為LCD_DATA17和LCD_DATA16,在arch/arm/boot/dts/imx6ul-pinfunc.h文件中分別搜索LCD_DATA17和LCD_DATA16,找到其復用成UART功能的宏:
MX6UL_PAD_LCD_DATA17__UART7_DCE_RX MX6UL_PAD_LCD_DATA16__UART7_DCE_TX
在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件建立UART7的IOMUX配置節點,并添加上這兩條宏配置:
pinctrl_uart7: uart7grp { fsl,pins = < MX6UL_PAD_LCD_DATA17__UART7_DCE_RX 0x1b0b1 MX6UL_PAD_LCD_DATA16__UART7_DCE_TX 0x1b0b1 >; };
添加后效果如下:
注意:LCD_DATA17和LCD_DATA16這兩個引腳默認復用為了LCD的data17和data16功能,所以,需要注釋掉這兩個引腳的LCD復用,在pincrtl_lcdif_dat節點中:
3、添加設備節點
UART1-UART8的設備節點在arch/arm/boot/dts/imx6ull.dtsi設備樹文件中已經存在,我們只需在arch/arm/boot/dts/imx6ull-elf1-emmc.dts將需要的UART使能即可,如已經使能的UART1:
&uart1 { pinctrl-names = “default”; pinctrl-0 = <&pinctrl_uart1>; status = “okay”; }
使能UART功能主要是設置pinctrl-0屬性和status屬性,pinctrl-names屬性設置pingctrl的name,不是必需的,pinctrl-0屬性主要用于配置UART接口相關引腳的IOMUX,status屬性主要是使能該串口功能。UART2也已經配置好,我們只需將其中的流控功能去掉就可以了:
&uart2 { pinctrl-names = “default”; pinctrl-0 = <&pinctrl_uart2>; /* fsl,uart-has-rtscts; */ /* for DTE mode,add below change */ /* fsl,dte-mode; */ /* pinctrl-0 = <&pinctrl_uart2dte>; */ status = “okay”; }
依照上述方法,依次添加UART3和UART7節點相關屬性:
&uart3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart3>; status = "okay"; }; &uart7 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart7>; status = "okay"; };
添加后效果如下:
4、編譯
單獨編譯設備樹:
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make dtbs
使用scp將設備樹拷貝到開發板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/
進行sync操作后重啟開發板:
啟動之后,可以看到在/dev目錄下生成節點ttymxc0、ttymxc1、ttymxc2、ttymxc6,分別對應我們添加的UART1,UART2,UART3,UART7。
三、測試
我們對UART2\UART3\UART7進行測試(UART1是調試串口,這里不測試),UART2和UART3分別對應板子上的RS485_1和RS485_2,我們將RS485_1和RS485_2進行收發互測,將兩路RS485的A1-A2和B1-B2進行相連。UART7對應RS232,我們收發短接測試,將TX-RX收發互連。
可以直接使用開發板文件系統/usr/bin/下的elf1_cmd_serialport進行測試。測試RS485_1(UART2)和RS485_2(UART3)輸入以下命令,注意空格:
root@ELF1:~# elf1_cmd_serialport ttymxc1 & root@ELF1:~# elf1_cmd_serialport ttymxc2 -o -b 9600 -t aabbccddeeff 1
上圖顯示信息中/dev/ttymxc2 nwrite表示通過RS485_2(UART3)發送的具體數據,/dev/ttymxc1 nread表示通過RS485_1(UART2)接收到的數據。測試RS232(UART7)使用命令:
root@ELF1:~# elf1_cmd_serialport ttymxc6 -o -b 9600 -t aabbccddeeff 1
至此,就完成了在NXP源碼基礎上適配ELF 1開發板的UART功能,期望這份詳實的指南能為正在閱讀的小伙伴帶來實質性的助益與啟發。在開發之旅上,愿我們攜手共進,探索無限可能。
-
嵌入式
+關注
關注
5083文章
19131瀏覽量
305456 -
恩智浦
+關注
關注
14文章
5861瀏覽量
107507 -
Linux
+關注
關注
87文章
11310瀏覽量
209594 -
開發板
+關注
關注
25文章
5059瀏覽量
97535
發布評論請先 登錄
相關推薦
評論