WinCE Bootloader学习笔记
之OEMDebugInit()
该函数主要是初始化串口,在该函数完成之后我们才可以调用OEMWriteDebugString()函数,输出调试消息。直接上代码:
BOOL OEMDebugInit(void)
{
// Set up function callbacks used by blcommon.
// g_pOEMVerifyMemory, g_pOEMMultiBINNotify两个变量是全局的函数指针,
//作为回调函数,具体有什么用途,还不太明确。
g_pOEMVerifyMemory = OEMVerifyMemory; // Verify RAM.
g_pOEMMultiBINNotify = OEMMultiBINNotify;
// Call serial initialization routine (shared with the OAL).
//该函数初始化串口
OEMInitDebugSerial();
return(TRUE);
}
VOID OEMInitDebugSerial()
{
#if FEILING_DEBUG
S3C2440A_IOPORT_REG *pIOPortReg;
UINT32 logMask;
UINT32 count;
// At this moment we must suppress logging.
//全局变量,具体定义在那个函数中还需查询。
logMask = g_oalLogMask;
g_oalLogMask = 0;
#ifdef DEBUG_SERIAL_UART0
// OALPAtoVA()函数:物理地址转换为虚拟地址。
pIOPortReg = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
// GPH2 and GHP3 are UART0 Tx and Rx, respectively.
//配置UART0 Tx和Rx
CLRREG32(&pIOPortReg->GPHCON, (3 << 0)|(3 << 2));
CLRREG32(&pIOPortReg->GPHCON, (3 << 4)|(3 << 6));
SETREG32(&pIOPortReg->GPHCON, (2 << 4)|(2 << 6));
SETREG32(&pIOPortReg->GPHCON, (2 << 0)|(2 << 2));
// Disable pull-up on TXD0 and RXD0.
//关闭上拉
SETREG32(&pIOPortReg->GPHUP, (1 << 0)|(1 << 1));
g_pUARTReg = (S3C2440A_UART_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_UART0, FALSE);
#else
// GPH4 and GHP5 are UART1 Tx and Rx, respectively.
//配置UART0 Tx和Rx
CLRREG32(&pIOPortReg->GPHCON, (3 << 8)|(3 << 10));
SETREG32(&pIOPortReg->GPHCON, (2 << 8)|(2 << 10));
// Disable pull-up on TXD1 and RXD1.
//关闭上拉
SETREG32(&pIOPortReg->GPHUP, (1 << 4)|(1 << 5));
// UART1 (TXD1 & RXD1) used for debug serial.
//配置UART1 作为调试串口
g_pUARTReg = (S3C2440A_UART_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_UART1, FALSE);
#endif
// Configure the UART.
//配置寄存器,关FIFO,inactive nRTS等等,波特率设定,详细查看寄存器
OUTREG32(&g_pUARTReg->UFCON, BSP_UART1_UFCON);
OUTREG32(&g_pUARTReg->UMCON, BSP_UART1_UMCON);
OUTREG32(&g_pUARTReg->ULCON, BSP_UART1_ULCON);
OUTREG32(&g_pUARTReg->UCON, BSP_UART1_UCON);
OUTREG32(&g_pUARTReg->UBRDIV, BSP_UART1_UBRDIV);
//这句话有什么用?
for (count=0;count<0xffff;count++);
// Restore the logging mask.
//恢复g_oalLogMask
g_oalLogMask = logMask;
#endif
}
总而言之,该函数就是初始化UART1为调试端口。