【迅为开发板资料】iMX6ULL开发板八路串口配置

本文转自:<北京迅为i.mx6ull终结者开发板使用手册-第九十一章>

硬件平台:迅为i.MX6ULL开发板

 

 

 

1 文档说明

本章节使用的资料已经放到了开发板网盘资料中,路径为:11_Linux系统开发进阶\86_章节使用资料。

本章节介绍如何在i.MX6ULL终结者上配置8路串口,驱动程序内核已经自带,我们只需要根据NXP官方提供的手册来修改设备树。设备树文件在Linux内核的arch/arm/boot/dts/目录下(使用迅为提供的的Linux内核,在终结者ULL光盘资料\i.MX6ULL终结者光盘资料\05_uboot linux源码\目录下),本例程中主要用到测试程序uart_write_read.c,设备树文件imx6ull-14x14-evk.dts,imx6ull.dtsi,还有imx6ul-pinfunc.h。

配置UART用到的引脚在芯片手册(终结者ULL光盘资料\i.MX6ULL终结者光盘资料\03_开发板硬件资料\02_芯片资料\2、I.MX6ULL芯片资料\IMX6ULL参考手册)中已经找到,如下图:\

 

 

 

 

下面就开始把这些引脚复用为串口,逐一配置到设备树。

 

因为 UART1是调试串口,我们最后再设置它。在imx6ull.dtsi文件中,可以看出串口结点0~7对应uart1~8。可根据/dev/下的设备结点ttymxc*来调试。

 

 

2 UART2配置

以配置串口2为例,逐步配置设备树,本文档其余的7路串口都用相同的方法配置。

首先通过查NXP的芯片手册(终结者ULL光盘资料\i.MX6ULL终结者光盘资料\03_开发板硬件资料\02_芯片资料\2、I.MX6ULL芯片资料\IMX6ULL参考手册),搜索“UART2”找到 UART2的引脚,

 

 

用同样的方法在芯片手册搜索接收引脚, 搜索到UART2两个引脚:

发送引脚IOMUXC_SW_MUX_CTL_PAD_UART2_TX_DATA,

接收引脚IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA,

然后我们在imx6ul-pinfunc.h中搜索发送引脚“PAD_UART2_TX_DATA”,找到了“MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX”,即MX6UL_引脚名_复用功能。

 

 

 

用相同的方法搜索“PAD_UART2_RX_DATA”,找到后在设备树文件arch/arm/boot/dts/imx6ull-14x14-evk.dts中添加pinctrl信息(自带的已经添加好),电气属性值为”0x1b0b1”,修改成如下所示:

pinctrl_uart2: uart2grp {

fsl,pins = <

MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1

MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1

>;

};

本实验中没有用到流控,注释掉668和669行,然后查找其他pinctrl有没有使用这两个引脚,如果有,注释掉其他pinctrl。搜索“PAD_UART2_TX_DATA”,查找到pinctrl_uart2dte使用了这两个引脚,我们直接把pinctrl_uart2dte注释掉或删掉。

如下图:

 

再查找引用此pinctrl_uart2dte的节点,注释掉然后查找使用此pinctrl的节点标签,有的话注释掉。

查找“PAD_UART2_RX_DATA”,发现有pinctrl_remote_control使用了这个,引脚,注释掉

 

 

然后添加节点标签&uart2(源码已经),只使用pinctrl_uart2,satus改为“okay”,注释掉“fsl,uart-has-rtscts”。

 

打开imx6ull.dtsi,更改标签uart2设备属性status为”okay”,

 

 

编译make  dtbs,在开发板上运行起来后,串口2的设备结点就是/dev/目录下的ttymxc1,查找原理图中两个引脚的位置(终结者ULL光盘资料\i.MX6ULL终结者光盘资料\03_开发板硬件资料\01_开发板原理图\核心板原理图),将两个引脚短接,接收引脚得到数据后测试程序会打印接收到的字节个数,执行测试程序,引脚位置:

 

 

运行测试程序:

 

出现此结果说明引脚配置成功。

3 UART3配置

通过 imx6ull的芯片手册(终结者ULL光盘资料\i.MX6ULL终结者光盘资料\03_开发板硬件资料\02_芯片资料\2、I.MX6ULL芯片资料\IMX6ULL参考手册)查找到UART3的引脚为:

发送引脚IOMUXC_SW_MUX_CTL_PAD_UART3_TX_DATA,

接收引脚IOMUXC_SW_MUX_CTL_PAD_UART3_RX_DATA,

和UART2的步骤基本一样,在arch/arm/boot/dts/imx6ull-14x14-evk.dts配置pinctrl:

pinctrl_uart3: uart3grp {

fsl,pins = <

MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX   0x1b0b1

MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX   0x1b0b1

>;

};

 

然后查找使用这两个引脚的其他pinctrl,直接注释掉。

添加uart3节点标签:

&uart3 {

        pinctrl-names = "default";

        pinctrl-0 = <&pinctrl_uart3>;

        status = "okay";

};

 

 

 

 

在imx6ull.dtsi中更改uart3的status属性:

 

这两个引脚对应的原理图为:

  

短接后测试/dev/ttymxc2节点:

 

4 UART4配置

查找到 UART5对应的引脚为:

发送引脚IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA,

接收引脚IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA,

在arch/arm/boot/dts/imx6ull-14x14-evk.dts中配置pinctrl:

pinctrl_uart4: uart4grp {

fsl,pins = <

MX6UL_PAD_UART4_RX_DATA__UART4_DCE_RX 0x1b0b1

MX6UL_PAD_UART4_TX_DATA__UART4_DCE_TX   0x1b0b1

>;

};

 

去掉复用的pinctrl:

 

然后添加uart4节点标签:

&uart4 {

pinctrl-names = "default";

pinctrl-0 = <&pinctrl_uart4>;

status = "okay";

};

 

在imx6ull.dtsi中改uart4的status属性为“okay”:

 

引脚位置:

 

测试/dev/ttymxc3,短接两个引脚,出现以下结果正确:

 

5 UART5配置

在imx6ull芯片手册查找到UART5对应的引脚为

发送引脚IOMUXC_SW_MUX_CTL_PAD_UART5_TX_DATA0,

接收引脚IOMUXC_SW_MUX_CTL_PAD_UART5_RX_DATA ,经过反复调试和翻手册,需要更改imx6ul-pinfunc.h文件中的一个宏定义:

查找“ MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX”,因为用的是i.MX6ULL,imx6ull芯片手册中说明要复用为串口5要选择ALT0模式,即在指定寄存器写”111”,转化为16进制为0x7,所以在imx6ul-pinfunc.h中将“MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX”后面的0x5修改为0x7,如果用的是i.MX6UL则保持0x5不动,如下图:

 

在设备树文件添加pinctrl:

pinctrl_uart5: uart5grp {

fsl,pins = <

MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX    0x1b0b1

MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX 0x1b0b1

>;

};

 

去掉引用这两个引脚的pinctrl:

 

添加节点标签:

 

在imx6ull.dtsi更改status属性为 ”okay”:

 

两个引脚位置:

 

 

执行 ./uart /dev/ttymxc4

 

打印出接收到的字符个数即成功。

6 UART6配置

在imx6ull芯片手册中查找到UART6的引脚

IOMUXC_SW_MUX_CTL_PAD_CSI_MCLK和IOMUXC_SW_MUX_CTL_PAD_CSI_PIXCLK,

然后在imx6ull-14x14-evk.dts配置pinctrl:

pinctrl_uart6: uart6grp {

fsl,pins = <

MX6UL_PAD_CSI_MCLK__UART6_DCE_TX 0x1b0b1

MX6UL_PAD_CSI_PIXCLK__UART6_DCE_RX  0x1b0b1

>;

};

去掉占用这两个引脚的其他pinctrl,找到”pinctrl_csi1”,修改成如下图:

 

添加节点:

 

在imx6ull.dtsi文件中修改uart6的status属性:

 

两个引脚对应的原理图:

 

短接后测试: ./uart /dev/ttymxc5出现如下结果说明配置成功。

 

7 UART7配置

UART7和UART8的引脚与网络接口复用,在目标板上调试时不能再用NFS挂载根文件系统。

UART7引脚为:

IOMUXC_SW_MUX_CTL_PAD_ENET2_RX_EN,IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_DATA0,

然后根据imx6ul-pinfun.h添加pinctrl:

pinctrl_uart7: uart7grp {

fsl,pins = <

MX6UL_PAD_ENET2_RX_EN__UART7_DCE_TX     0x1b0b0

MX6UL_PAD_ENET2_TX_DATA0__UART7_DCE_RX 0x1b0b0

>;

    };

 

然后查找使用这两个引脚的pinctrl,注释掉:

 

 

 

添加标签:

 

在imx6ull.dtsi中更改status属性为“okay”。

 

对应的原理图位置:

 

 

测试./uart /dev/ttymxc6

 

8 UART8配置

UART8使用的引脚为:

IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_DATA1,IOMUXC_SW_MUX_CTL_PAD_ENET2_TX_EN,

配置 pinctrl:

pinctrl_uart8: uart8grp {

fsl,pins = <

MX6UL_PAD_ENET2_TX_DATA1__UART8_DCE_TX 0x1b0b0

MX6UL_PAD_ENET2_TX_EN__UART8_DCE_RX    0x1b0b0

>;

     };

 

注释掉占用这两个引脚的pinctrl:

 

添加&uart8:

 

在imx6ull.dtsi更改status属性为“okay”:

 

原理图位置:

 

 

测试节点为/dev/ttymxc7测试方法和效果与uart2一样。

 

9 UART1使用方法

在uboot阶段把串口1设置成了调试串口,即uboot参数”console=ttymxc0”,为了测试,我们将console参数设置为null,这样串口一不再打印 Linux终端信息。

首先修改脚本将测试程序设置成开机自启动:

 

setenv console null

saveenv

 

更新设备树,然后输入boot启动,内核启动后会有如下显示:

 

测试程序中发送串口每隔1s发送一次,PC终端软件会将接收到的信息“hello world !”显示出来,也可以使用串口调试软件测试收发功能:

 

到此八路串口配置完成。