加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

ElfBoard技術(shù)貼|如何在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的UART功能

09/25 14:48
1460
閱讀需 18 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
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芯片。
接下來,我們將針對(duì)上述幾個(gè)UART接口逐一進(jìn)行詳細(xì)的配置說明。本次源碼適配工作是在NXP i.MX6ULL EVK評(píng)估板Linux內(nèi)核源碼(特定版本:Linux-imx_4.1.15)基礎(chǔ)上進(jìn)行的,以確保UART接口能夠正確無誤的在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。

通過查表可以得到27和28的PAD NAME分別為UART1_RX_DATA和UART1_TX_DATA。

(2)UART2

從原理圖中可以得到我們使用的UART2_RXD和UART2_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為72和73。

通過查表可以得到72和73的PAD NAME分別為UART2_RX_DATA和UART2_TX_DATA。?????

(3)UART3

從原理圖中可以得到我們使用的UART3_RXD和UART3_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為77和78。

通過查表可以得到77和78的PAD NAME分別為UART3_RX_DATA和UART3_TX_DATA。

(4)UART7

從原理圖中可以得到我們使用的UART7_RXD和UART7_TXD引腳對(duì)應(yīng)的連接器引腳編號(hào)分別為114和115。

通過查表可以得到114和115的PAD NAME分別為LCD_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,我們板子沒有引出流控引腳,所以這里注釋掉流控配置:

(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分別為LCD_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ā)互連。
可以直接使用開發(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表示通過RS485_2(UART3)發(fā)送的具體數(shù)據(jù),/dev/ttymxc1 nread表示通過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í)的指南能為正在閱讀的小伙伴帶來實(shí)質(zhì)性的助益與啟發(fā)。在開發(fā)之旅上,愿我們攜手共進(jìn),探索無限可能。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜