如何释放占用的调试串口COM0?
我用的是TQ2440的板子,串口不够用,只有用调试串口COM0了,我把Src\Kernel\Oal\debug.c中的OEMWriteDebugByte() ,OEMReadDebugByte() ,OEMWriteDebugLED()内容屏蔽掉,发现没有调试信息输出了,但是应该程序无法打开,显示占用。
不服气,找到OEMInitDebugSerial() 函数,网上盛传改它了:发现它不好改,稍微动下就无法启动了,白屏。
VOID OEMInitDebugSerial()
{
//#if(BSP_UARTn == BSP_nouse_UART)
S3C2440A_IOPORT_REG *pIOPortReg;
//#ifdef DEBUG
UINT32 logMask;
// At this moment we must suppress logging.
//
logMask = dpCurSettings.ulZoneMask;
dpCurSettings.ulZoneMask = 0;
//#endif
// Configure port H for UART
//
pIOPortReg = (S3C2440A_IOPORT_REG*)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
#if(BSP_UARTn == BSP_use_UART0)
// GPH2 and GHP3 are UART0 Tx and Rx, respectively.
//
CLRREG32(&pIOPortReg->GPHCON, (3 << 4)|(3 << 6));
SETREG32(&pIOPortReg->GPHCON, (2 << 4)|(2 << 6));
// Disable Pull-up on TXD0 and RXD0.
//
SETREG32(&pIOPortReg->GPHUP, (1 << 2)|(1 << 3));
// UART1 (TXD0 & RXD0) used for debug serial.
//
g_pUARTReg = (S3C2440A_UART_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_UART0, FALSE);
// Configure the UART.
//
OUTREG32(&g_pUARTReg->UFCON, BSP_UART0_UFCON);
OUTREG32(&g_pUARTReg->UMCON, BSP_UART0_UMCON);
OUTREG32(&g_pUARTReg->ULCON, BSP_UART0_ULCON);
OUTREG32(&g_pUARTReg->UCON, BSP_UART0_UCON);
OUTREG32(&g_pUARTReg->UBRDIV, BSP_UART0_UBRDIV);
#endif
#if(BSP_UARTn == BSP_use_UART1)
// GPH2 and GHP3 are UART1 Tx and Rx, respectively.
//
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.
//
g_pUARTReg = (S3C2440A_UART_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_UART1, FALSE);
// Configure the UART.
//
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);
#endif
dpCurSettings.ulZoneMask = logMask;
}
于是乎找到:TQ2440.bat打开,并没有网上说的:set BSP_NOUART0=1,
倒是找到个:rem set BSP_KITL=SERIAL_UART0,直接改成:rem set BSP_KITL=
COM0还是被占用,无法应用程序打开。
接下来只有改传说中的注册表了,找到注册表项:找到COM0项:
; @CESYSGEN IF CE_MODULES_SERIAL
IF BSP_NOSERIAL !
;IF BSP_KITL != SERIAL_UART0
;=============== UART0 (physical COM1 connector P1) (Serial) ===============
;[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial0]
;"DeviceArrayIndex"=dword:0
;"Irq"=dword:1c
;"MemBase"=dword:50000000
;"MemLen"=dword:2C
;"InterruptBitsShift"=dword:0 ; UART 0 Interrupt Sub Register shift bit.
;"ISTTimeouts"=dword:200; every 512 ticks checking Modem status.
;"Prefix"="COM"
;"Index"=dword:1
;"Dll"="serial_smdk2440.dll"
;"Order"=dword:0
;"Priority"=dword:0
;"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
听说全屏蔽掉有用,好吧,全屏蔽掉,发现还是COM0还是占用。
还有一招,改驱动程序:找到ser_smdk2440.cpp;
virtual void SetDefaultConfiguration() {
CPdd2440Uart::SetDefaultConfiguration();
}
virtual BOOL InitModem(BOOL bInit) {
SetDTR(bInit);
return CPdd2440Uart::InitModem(bInit);
}
virtual ULONG GetModemStatus() {
return (CPdd2440Uart::GetModemStatus());//HJ_add 20100112
}
virtual void SetDTR(BOOL bSet) {
};
private:
volatile S3C2440A_IOPORT_REG * m_pIOPregs;
据说可以屏蔽SetDTR(bInit)有用,好吧,再来,结果发现COM0还是占用。
还剩最后一招:屏蔽所有进入OEMInitDebugSerial()函数的地方,我找哇找哇。把所有OEMInitDebugSerial()的调用全屏蔽了,发现COM0还是占用着;
现在COM0还是占用,,快奔溃了,请高人指点小弟一二啊。
注:底层COM0对应COM1
[解决办法]
不是冒充高人,纯路过。
BSP目录下是否有什么设置?
例如
C:\WINCE600\PLATFORM\SMDKC100\SMDKC100.bat
中有
set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART1
@REM set BSP_DEBUGPORT=SERIAL_UART2
@REM set BSP_DEBUGPORT=SERIAL_UART3
set BSP_KITL=NONE
@REM set BSP_KITL=SERIAL_UART0
@REM set BSP_KITL=SERIAL_UART1
@REM set BSP_KITL=SERIAL_UART2
@REM set BSP_KITL=SERIAL_UART3
@REM set BSP_KITL=USBSERIAL
[解决办法]