6410 wince debug.c 调试串口的疑问
+++++++++现象:SMDK6410.bat(57):里如果把全部debug串口都屏蔽掉
@REM set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART1
@REM set BSP_DEBUGPORT=SERIAL_UART2
@REM set BSP_DEBUGPORT=SERIAL_UART3
wince可以正常使用,4个串口可以当做普通串口正常使用。
++++++++++不明白为何是这样:
1、oalib\source里有如下定义,看起来是BSP_DEBUGPORT如果为定义,相应的DEBUG_PORT也就为定义,所有文件里搜索也未发现对该宏的其他定义。
!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART0"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=0
!ENDIF
!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART1"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=1
!ENDIF
!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART2"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=2
!ENDIF
!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART3"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=3
!ENDIF
2、debug.c里,如果DEBUG_PORT未定义,应该是编译时出现INVALID_DEBUG_PORT未定义的错误,但是编译通过,且可以正常运行。
++++++++++疑问1:为何编译时不出现INVALID_DEBUG_PORT未定义的错误
++++++++++疑问2:即使不出现1的错误,那么由于DEBUG_PORT未定义,那么g_pUARTReg的值未修改,仍旧是NULL,为何g_pUARTReg->ULCON等访问不挂掉?
static volatile S3C6410_UART_REG *g_pUARTReg = NULL;
VOID OEMInitDebugSerial()
{
UINT32 logMask;
UINT32 DivSlot;
float Div;
//OALMSG(TRUE, (TEXT("[OAL] ++OEMInitDebugSerial()\n\r")));
// At this moment we must suppress logging.
//
logMask = dpCurSettings.ulZoneMask;
dpCurSettings.ulZoneMask = 0;
// Map SFR Address
//
if (g_pUARTReg == NULL)
{
#if (DEBUG_PORT == DEBUG_UART0)
// UART0
g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART0, FALSE);
#elif (DEBUG_PORT == DEBUG_UART1)
// UART1
g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART1, FALSE);
#elif (DEBUG_PORT == DEBUG_UART2)
// UART2
g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART2, FALSE);
#elif (DEBUG_PORT == DEBUG_UART3)
// UART3
g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART3, FALSE);
#else
INVALID_DEBUG_PORT // Error
#endif
}
if (g_pGPIOReg == NULL)
{
g_pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
}
if (g_pSysConReg == NULL)
{
g_pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
}
//省略一部分代码
// Initialize UART
//
g_pUARTReg->ULCON = (0<<6)|(0<<3)|(0<<2)|(3<<0); // Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data
g_pUARTReg->UCON = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0); // PCLK divide, Polling Mode
}
3、下面两个函数使用g_pUARTReg前有没有必要进行空指针保护,比如是空指针返回?
++++++++++疑问3:是否需要空指针保护
VOID OEMWriteDebugByte(UINT8 ch)
{
// Wait for TX Buffer Empty
//
while (!(g_pUARTReg->UTRSTAT & 0x2));
// TX Character
//
g_pUARTReg->UTXH = ch;
}
int OEMReadDebugByte()
{
int ch;
if (g_pUARTReg->UTRSTAT & 0x1) // There is received data
{
ch = (int)(g_pUARTReg->URXH);
}
else // There no data in RX Buffer;
{
ch = OEM_DEBUG_READ_NODATA;
}
return ch;
}
4、一旦set BSP_DEBUGPORT=SERIAL_UART0,且注册表里强制开放关于uart0的注册表,则wince在创建串口0时就挂掉了(显示DEBUG: CreateSerialObject 0后就无输出了),冲突在什么地方?
++++++++++疑问4:串口冲突在什么地方。
大致看了下代码,好像和PCLK_GATE以及SCLK_GATE有关,但不确定,请问各位大侠是怎么回事。
;IF BSP_KITL != SERIAL_UART0
;IF BSP_DEBUGPORT != SERIAL_UART0
;--------------- UART0 (Physical COM1 Port) ----------------------------------
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial0]
"DeviceArrayIndex"=dword:0
"Irq"=dword:3D; UART0 Virtual IRQ = 61 (0x3D), Physical IRQ = 37
"MemBase"=dword:7F005000
"MemLen"=dword:40
;"ISTTimeouts"=dword:200; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:1
"Dll"="smdk6410_serial.dll"
"Order"=dword:30
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"=LOC_DISPLAYNAME_COM1
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;--------------------------------------
;ENDIF
;ENDIF
ENDIF
[解决办法]
看样子应该是你的串口驱动有点问题。先检查你串口硬件问题。
[解决办法]
顶一下,同样的配置,第四个问题,串口冲突,在bat文件关掉debug口,开普通串口,系统起不来,推测是串口冲突,不理解哪里冲突了。
[解决办法]
6410的串口0做为普通串口需要修改一点代码,不然有的问题。你可以百度一下,网上有讲。
[解决办法]
DDEBUG_PORT=0
就是DEBUG_PORT=0 的意思啊。