UART即通用異步收發(fā)器,是一種支持全雙工串行通信協(xié)議的接口。在i.MX6ULL處理器平臺(tái)上,該處理器原生支持多達(dá)8路的UART接口,提供了豐富的串行通信能力。
針對(duì)ELF 1開發(fā)板,實(shí)際引出了4路UART接口供開發(fā)者使用,具體包括UART1、UART2、UART3以及UART7。其中UART1用于調(diào)試,UART2、UART3用于連接RS485收發(fā)芯片,UART7連接TTL轉(zhuǎn)RS232芯片。
接下來(lái),我們將針對(duì)上述幾個(gè)UART接口逐一進(jìn)行詳細(xì)的配置說(shuō)明。本次源碼適配工作是在NXP i.MX6ULL EVK評(píng)估板的Linux內(nèi)核源碼(特定版本:Linux-imx_4.1.15)基礎(chǔ)上進(jìn)行的,以確保UART接口能夠正確無(wú)誤的在ELF 1開發(fā)板上工作。
一、 準(zhǔn)備工作
NXP源碼路徑:ELF1開發(fā)板資料包7-NXP 原廠資料7-1 NXP官方源碼linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2
1、將NXP源碼拷貝到開發(fā)環(huán)境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、添加默認(rèn)配置文件
將arch/arm/configs路徑下的imx_v7_mfg_defconfig復(fù)制一份,命名為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設(shè)備樹
將arch/arm/boot/dts路徑下的imx6ull-14x14-evk.dts復(fù)制一份,命名為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、建立交叉編譯腳本
建立一個(gè)編譯腳本build.sh
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vim build.sh
添加以下內(nèi)容,保存退出
#!/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 *
給予腳本權(quán)限
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引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為27和28。
通過(guò)查表可以得到27和28的PAD NAME分別為UART1_RX_DATA和UART1_TX_DATA。
添加圖片注釋,不超過(guò) 140 字(可選)
(2)UART2
從原理圖中可以得到我們使用的UART2_RXD和UART2_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為72和73。
通過(guò)查表可以得到72和73的PAD NAME分別為UART2_RX_DATA和UART2_TX_DATA。
(3)UART3
添加圖片注釋,不超過(guò) 140 字(可選)
從原理圖中可以得到我們使用的UART3_RXD和UART3_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為77和78。
通過(guò)查表可以得到77和78的PAD NAME分別為UART3_RX_DATA和UART3_TX_DATA。
(4)UART7
從原理圖中可以得到我們使用的UART7_RXD和UART7_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為114和115。
通過(guò)查表可以得到114和115的PAD NAME分別為L(zhǎng)CD_DATA17和LCD_DATA16。
2、IOMUX配置
確定好引腳之后,我們就可以在設(shè)備樹中添加相關(guān)引腳的IOMUX配置。
(1)UART1、UART2打開NXP BSP的arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件,可以看到關(guān)于UART1和UART2的IOMUX配置信息,這是因?yàn)椋琲.MX6ULL EVK板也引出了UART1(UART1一般都是作為調(diào)試串口使用)和UART2。
既然已經(jīng)有了UART1和UART2的IOMUX配置,那我們就只需對(duì)比一下其配置的相應(yīng)引腳跟ELF1開發(fā)板使用的引腳是否一致即可。上一節(jié)中已經(jīng)確定了我們使用的UART1和UART2對(duì)應(yīng)的引腳PAD NAME,UART1:UART1_RX_DATA和UART1_TX_DATA,UART2:UART2_RX_DATA和UART2_TX_DATA,對(duì)比arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中已配置好的IOMUX信息,可以看到是一致的:
由上圖可知,UART2的IOMUX節(jié)點(diǎn)uart2grp下配置了流控引腳RTS和CTS,我們板子沒(méi)有引出流控引腳,所以這里注釋掉流控配置:
)
(2)UART3由上一節(jié)確定了我們使用的UART3收發(fā)引腳PAD NAME分別為UART3_RX_DATA和UART3_TX_DATA。
在arch/arm/boot/dts/imx6ul-pinfunc.h文件中分別搜索UART3_RX_DATA和UART3_TX_DATA,找到其復(fù)用成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配置節(jié)點(diǎn),并添加上這兩條宏配置,其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分別為L(zhǎng)CD_DATA17和LCD_DATA16,在arch/arm/boot/dts/imx6ul-pinfunc.h文件中分別搜索LCD_DATA17和LCD_DATA16,找到其復(fù)用成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配置節(jié)點(diǎn),并添加上這兩條宏配置:
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這兩個(gè)引腳默認(rèn)復(fù)用為了LCD的data17和data16功能,所以,需要注釋掉這兩個(gè)引腳的LCD復(fù)用,在pincrtl_lcdif_dat節(jié)點(diǎn)中:
3、添加設(shè)備節(jié)點(diǎn)
UART1-UART8的設(shè)備節(jié)點(diǎn)在arch/arm/boot/dts/imx6ull.dtsi設(shè)備樹文件中已經(jīng)存在,我們只需在arch/arm/boot/dts/imx6ull-elf1-emmc.dts將需要的UART使能即可,如已經(jīng)使能的UART1:
&uart1 {
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_uart1>;
status = “okay”;
}
使能UART功能主要是設(shè)置pinctrl-0屬性和status屬性,pinctrl-names屬性設(shè)置pingctrl的name,不是必需的,pinctrl-0屬性主要用于配置UART接口相關(guān)引腳的IOMUX,status屬性主要是使能該串口功能。UART2也已經(jīng)配置好,我們只需將其中的流控功能去掉就可以了:
&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節(jié)點(diǎn)相關(guān)屬性:
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
status = "okay";
};
&uart7 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart7>;
status = "okay";
};
添加后效果如下:
4、編譯
單獨(dú)編譯設(shè)備樹:
. /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將設(shè)備樹拷貝到開發(fā)板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/
進(jìn)行sync操作后重啟開發(fā)板:
啟動(dòng)之后,可以看到在/dev目錄下生成節(jié)點(diǎn)ttymxc0、ttymxc1、ttymxc2、ttymxc6,分別對(duì)應(yīng)我們添加的UART1,UART2,UART3,UART7。
三、測(cè)試
我們對(duì)UART2UART3UART7進(jìn)行測(cè)試(UART1是調(diào)試串口,這里不測(cè)試),UART2和UART3分別對(duì)應(yīng)板子上的RS485_1和RS485_2,我們將RS485_1和RS485_2進(jìn)行收發(fā)互測(cè),將兩路RS485的A1-A2和B1-B2進(jìn)行相連。UART7對(duì)應(yīng)RS232,我們收發(fā)短接測(cè)試,將TX-RX收發(fā)互連。
添加圖片注釋,不超過(guò) 140 字(可選)
可以直接使用開發(fā)板文件系統(tǒng)/usr/bin/下的elf1_cmd_serialport進(jìn)行測(cè)試。測(cè)試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表示通過(guò)RS485_2(UART3)發(fā)送的具體數(shù)據(jù),/dev/ttymxc1 nread表示通過(guò)RS485_1(UART2)接收到的數(shù)據(jù)。測(cè)試RS232(UART7)使用命令:
root@ELF1:~# elf1_cmd_serialport ttymxc6 -o -b 9600 -t aabbccddeeff 1
至此,就完成了在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的UART功能,期望這份詳實(shí)的指南能為正在閱讀的小伙伴帶來(lái)實(shí)質(zhì)性的助益與啟發(fā)。在開發(fā)之旅上,愿我們攜手共進(jìn),探索無(wú)限可能。
審核編輯 黃宇
-
NXP
+關(guān)注
關(guān)注
60文章
1278瀏覽量
184224 -
uart
+關(guān)注
關(guān)注
22文章
1235瀏覽量
101387 -
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29208 -
elf
+關(guān)注
關(guān)注
0文章
12瀏覽量
2185
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論