D-Chip i.mx6增加UART串口的步骤

时间:2021-05-13 09:26:24

              初次使用i.MX6进行项目开发的时候,对于很多人来说就是找不到BSP对应源码文件的位置,下面使用怎么添加UART串口的步骤,对这些比较重要的BSP文件进行讲解,如果需要添加其他设备或者接口,一下方法也可以作为参考。(测试的项目板子为珠海鼎芯的i.MX6开发板)

 IMX6一共支持5个UART,下面对如何在软件上初始化这5个UART的方法进行举例说明:

1.     初始化UART口涉及到3个文件:

(1)  arch/arm/mach-mx6/board-mx6q_sabresd.h此文件用来定义初始化IMX6对应需要用到的IO口的功能。

(2)  arch/arm/mach-mx6/board-mx6q_sabresd.c此文件为IMX6的板级初始化文化,UART也在此文件进行初始化,默认已经初始化了UART1和UART3.

(3)  arch/arm/plat-mxc/include/mach/iomux-mx6q.h此文件为IMX6所有IO及其每个IO所有功能的定义集合,用户可通过此文件来查询某个IO的功能定义。

2.     对board-mx6q_sabresd.h文件的修改

在iomux_v3_cfg_t mx6q_sabresd_pads中已经对UART1和UART3进行了定义:

MX6Q_PAD_CSI0_DAT10__UART1_TXD,

MX6Q_PAD_CSI0_DAT11__UART1_RXD,

MX6Q_PAD_EIM_D24__UART3_TXD,

MX6Q_PAD_EIM_D25__UART3_RXD,

 

下面举例说明增加UART2的定义,以接受脚RXD为例:

(1)  在iomux-mx6q.h中搜索uart2(使用sourceinsight搜索源码):

此为部分搜索的结果。

(2)  对照核心板原理图UART2的接收脚为管脚EIM_D27,对照搜索结果可得到UART2的接收脚为MX6Q_PAD_EIM_D27__UART2_RXD,对应此管脚功能有如下:

可以看到uart功能只是EIM_D27此管脚的其中一种功能。

 

(3)  把MX6Q_PAD_EIM_D27__UART2_RXD此定义添加到

iomux_v3_cfg_t mx6q_sabresd_pads中,如下:

static iomux_v3_cfg_t mx6q_sabresd_pads[] ={

  /*AUDMUX */

············

············

MX6Q_PAD_CSI0_DAT10__UART1_TXD,

MX6Q_PAD_CSI0_DAT11__UART1_RXD,

 

MX6Q_PAD_EIM_D27__UART2_RXD,

 

MX6Q_PAD_EIM_D24__UART3_TXD,

MX6Q_PAD_EIM_D25__UART3_RXD,

   `·················

   };

  

(4)  同理可以得到UART2的其他管脚对应定义,下面为UART2对应所有管脚定义:

MX6Q_PAD_EIM_D26__UART2_TXD,

MX6Q_PAD_EIM_D27__UART2_RXD,

MX6Q_PAD_EIM_D28__UART2_CTS,

MX6Q_PAD_EIM_D29__UART2_RTS,

   都增加到iomux_v3_cfg_t mx6q_sabresd_pads中。

 

(5)  确保在board-mx6q_sabresd.h中没有把EIM_D27定义成其他功能,比如

MX6Q_PAD_EIM_D27__GPIO_3_27,如果有请注释掉。UART2的其他3种功能引脚也是一样,确保对应IMX6的管脚只进行了一种功能定义。

 

 

3.     对board-mx6q_sabresd.c文件的修改

(1)  在此文件开始,会对IMX6定义成普通IO,也就是GPIO的引脚进行再定义,如下图:

 

IMX_GPIO_NR(,)这个用来定义IMX6管脚为GPIO,

如果把UART2的RXD脚,也就是EIM_D27管脚定义为GPIO,对应iomux-mx6q.h中的定义为MX6Q_PAD_EIM_D27__GPIO_3_27则在这个文件中定义为IMX_GPIO_NR(327).

所以在board-mx6q_sabresd.c文件开头部分,要确保没有出现IMX_GPIO_NR(327),如果有,请注释掉。

EIM_D27已经定义为UART接收功能,不能再次同时定义为GPIO的功能。

 

对应UART2的其他引脚也是一样,确保在这里没有给定义为GPIO

 

(2)  增加对uart2的初始化。

Board-mx6q_sabresd.c中初始化uart函数为:

如图,此函数已经对UART1和UART2进行了初始化,

imx6q_add_imx_uart(0, NULL);对应UART1

imx6q_add_imx_uart(2, NULL);对应UART3

 

在这个函数增加对UART2的初始化,为:

static inline voidmx6q_sabresd_init_uart(void)

{

imx6q_add_imx_uart(2,NULL);

imx6q_add_imx_uart(1, NULL);

imx6q_add_imx_uart(0,NULL);

}

    

(3)  确保在此文件中没有其他地方对uart的初始化

 

 

做完以上步骤,软件中对UART2的初始化就完成了。

如想添加对其他UART的支持,可按照以上方法来进行。

 

 

 

注:1.一定要确保IO口功能定义的唯一性,就是一次只能定义一种功能

    2.确保初始化的唯一性,不要对同一个功能(如UART2)在同一个文件里面进行重复的初始化。