​​基于IMX515 EVK+WINCE6.0---debug串口由UART1改为UART2 ​​


基于IMX515 EVK+WINCE6.0---debug串口由UART1改为UART2

 

1.      硬件变更

EVK评估板采用UART1作为调试口,而我们的平台用UART2作为调试口,先来看下图:

基于IMX    更改串口UART1为UART2_寄存器

图1

由此可见,IMX515一般情况下都有多个PAD可以由软件配置为同样的功能,比如EIM_D17 PAD可以配置为UART2_RXD功能,UART2_RXD PAD也可以配置为UART2_RXD功能,这就是IMX515的灵活的地方,同时也增加了复杂性。

 

我们的平台是分别选择UART2_RXD和UART2_TXD这两个PAD分别作为UART2_RXD和UART2_TXD功能的。

 

2.      软件上的修改

2.1  debug 串口的初始化流程

 

基于IMX    更改串口UART1为UART2_#define_02

图2

 

2.2  debug串口流程中需要修改和或是比较重要的函数介绍

⑴OEMInitDebugSerial函数

基于IMX    更改串口UART1为UART2_WINCE_03

图3

BSP_BASE_REG_PA_DEBUG_SERIAL在src\inc\bsp_base_reg_cfg.h中定义如下:

#define BSP_BASE_REG_PA_DEBUG_SERIAL        CSP_BASE_REG_PA_UART1

这里定义了串口debug起始物理地址,采用这样的方式比较便于根据项目需要修改debug的串口,因为我们的debug改为UART2,所以要改为:

#define BSP_BASE_REG_PA_DEBUG_SERIAL        CSP_BASE_REG_PA_UART2

相应的serInfo.uartBaseAddr = CSP_BASE_REG_PA_UART1;也改为serInfo.uartBaseAddr= BSP_BASE_REG_PA_DEBUG_SERIAL

 

⑵OALConfigSerialUART

基于IMX    更改串口UART1为UART2_寄存器_04

图4

接下来的代码是,在软件复位完成后,配置UCR1~4寄存器、UFCR、UTS、UBIR和UBMR寄存器:

基于IMX    更改串口UART1为UART2_串口_05

图5

 

这里的pBspArgs->clockFreq[DDK_CLOCK_SIGNAL_UART]在OALBspArgsInit函数中赋值的,而且要注意的是在向UBMR写入数据之前必须先写入UBIR,否则写的动作被忽略。

 

⑶OALConfigSerialIOMUX

基于IMX    更改串口UART1为UART2_#define_06

图6

详细信息见IOMUXC_SW_MUX_CTL_PAD_UART1_RXD寄存器,为了更好去理解,我们先来看EVK板debug串口原理图部分:

基于IMX    更改串口UART1为UART2_WINCE_07

图7

由图7可知分别采用UART1_RXD和UART1_TXD这两个PAD座位UART1_RX和UART1_TX,对于IMX515,有几个功能模块的port可以连接到UART1_RXD和UART1_TXD,如下图:

基于IMX    更改串口UART1为UART2_串口_08

图8

 

对于UART1_RXD来说,由图8可知,RXD_MUX、GPIO[28]、READY_ESC_OUT、EMI_DEBUG[12]和DATAOUT[10]这些Port在IOMUXC的控制下,可选择其中一个Port连接到UART1_RXD这个PAD上,具体选择哪个Port,可根据项目的实际需要由软件来选择,Port和PAD的关系如下:

基于IMX    更改串口UART1为UART2_#define_09

图9

对于硬件设计人员来说,需要知道IMX515对外连接的有哪些PAD,每个PAD可以作为哪些功能,比如对于UART2_RXD这PAD来说,可以选择作为下面的功能:

基于IMX    更改串口UART1为UART2_#define_10

图10

因为我们采用UART2_RXD和UART2_TXD这两个PAD分别作为UART2_RXD和UART2_TXD功能的,所以需要把OALConfigSerialIOMUX函数修改为下面的代码:

case CSP_BASE_REG_PA_UART2:  // kandi add at 2013.09.07

OAL_IOMUX_SET_MUX(pIOMUX,DDK_IOMUX_PIN_UART2_RXD,

                            DDK_IOMUX_PIN_MUXMODE_ALT0,DDK_IOMUX_PIN_SION_REGULAR);

OAL_IOMUX_SET_MUX(pIOMUX,DDK_IOMUX_PIN_UART2_TXD,

                            DDK_IOMUX_PIN_MUXMODE_ALT0,DDK_IOMUX_PIN_SION_REGULAR);

OAL_IOMUX_SEL_IN(pIOMUX,DDK_IOMUX_SELECT_INPUT_UART2_IPP_UART_RXD_MUX,0x2);

最后一行OAL_IOMUX_SEL_IN是选择UART2_RXD这个PAD为ALT0模式,为什么还要做这个设置呢?先来看IOMUXC_SW_MUX_CTL_PAD_UART2_RXD寄存器相关位的描述,如下:

基于IMX    更改串口UART1为UART2_WINCE_11


图11

因为UART2_RXD PAD在daisy chain结构中,我们需要先通过IOMUXC_SW_MUX_CTL_PAD_UART2_RXD寄存器选为UART2_RXDPAD为ALT0模式,然后再配置IOMUXC_UART2_IPP_UART_RXD_MUX_SELECT_INPUT寄存器,如下图:

基于IMX    更改串口UART1为UART2_#define_12

图12