UART即通用異步收發(fā)器,是一種支持全雙工串行通信協(xié)議的接口浓若。在i.MX6ULL處理器平臺(tái)上行嗤,該處理器原生支持多達(dá)8路的UART接口悼泌,提供了豐富的串行通信能力。
針對(duì)ELF 1開(kāi)發(fā)板涩赢,實(shí)際引出了4路UART接口供開(kāi)發(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開(kāi)發(fā)板上工作懂缕。
一允跑、 準(zhǔn)備工作
NXP源碼路徑:ELF1開(kāi)發(fā)板資料包\07-NXP 原廠資料\07-1 NXP官方源碼\linux-imx-imx_4.1.15_2.0.0_ga.tar.bz2
1、將NXP源碼拷貝到開(kāi)發(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è)備樹(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
打開(kāi)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è)備樹(shù)中添加相關(guān)引腳的IOMUX配置兆衅。
(1)UART1地沮、UART2打開(kāi)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開(kāi)發(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è)備樹(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è)備樹(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è)備樹(shù)拷貝到開(kāi)發(fā)板:
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/
進(jìn)行sync操作后重啟開(kāi)發(fā)板:
啟動(dòng)之后翅敌,可以看到在/dev目錄下生成節(jié)點(diǎn)ttymxc0、ttymxc1惕蹄、ttymxc2蚯涮、ttymxc6,分別對(duì)應(yīng)我們添加的UART1卖陵,UART2遭顶,UART3,UART7泪蔫。
三棒旗、測(cè)試
我們對(duì)UART2\UART3\UART7進(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 字(可選)
可以直接使用開(kāi)發(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開(kāi)發(fā)板的UART功能箭窜,期望這份詳實(shí)的指南能為正在閱讀的小伙伴帶來(lái)實(shí)質(zhì)性的助益與啟發(fā)。在開(kāi)發(fā)之旅上衍腥,愿我們攜手共進(jìn)磺樱,探索無(wú)限可能纳猫。