歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> WinCE下調試串口的動態復用

WinCE下調試串口的動態復用

日期:2017/3/1 9:15:12   编辑:Linux編程

車機項目中用到了很多串口外設,如DVD機芯、GPS、藍牙、雷達和胎壓監測等,而主CPU(TCC89XX)與小MCU(STM32)之間也是通過串口通訊的。一時之間,串口使用有點捉襟見肘的感覺,只能把調試串口拿出來用做普通串口。

調試串口用作普通串口本身沒什麼問題,之前在S3C2410上也做過。當時是把2410的調試串口強制改為普通串口,系統啟動後調試串口就無法正常使用了。但目前的項目仍在進一步完善之中,調試串口還是相當重要的,經常需要通過它,抓一些TRACE來分析和定位問題。所以,希望UART0能在調試串口和普通串口之間方便切換。

同一時刻,UART0既用作調試串口,又用作普通串口似乎不可能,並且意義也不大。考慮了一個簡單的方法,系統默認將UART0用作普通串口,需要抓取TRACE時,在應用程序中配置UART0的工作模式為調試串口,然後重啟系統。

熟悉WinCE6.0啟動過程的都知道,調試串口的初始化是在WinCE內核啟動的最初階段,《S3C2410下WinCE6.0的啟動過程詳解》曾有介紹http://www.linuxidc.com/Linux/2016-06/132033.htm,感興趣的話可以看一看。調試串口的初始化代碼一般在BSP目錄下的Src\OAL\OALLIB\debug.c文件中。在該文件中主要做了兩處修改,如下。

1 void OEMInitDebugSerial()
2 {
3 pVirtualBOOTARGS = (tSYSTEM_PARAM *)OALPAtoVA(SYSTEM_PARAM_BASEADDRESS,FALSE);
4 } 此處增加了獲取系統配置參數的虛擬地址。 1 //------------------------------------------------------------------------------
2 //
3 // Function: OEMWriteDebugString
4 //
5 // Output unicode string to debug serial port
6 //
7 VOID OEMWriteDebugString(UINT16 *string)
8 {
9 if (!pVirtualBOOTARGS->SysConfig.fDisableDebugSerial)
10 {
11 while (*string != L'\0') OEMWriteDebugByte((UINT8)*string++);
12 }
13 }

其中,pVirtualBOOTARGS->SysConfig.fDisableDebugSerial為控制調試串口是否正常輸出字符的變量。SysConfig是保存在NAND Flash中特定區域的一個結構體,BOOT啟動時可以讀取到,並且放在內存的指定位置。應用程序中可以修改該結構,相關代碼如下。

1 void SysDisableDebugSerial(int nDisable)
2 {
3 GetSysConfig(&gSYSCONFIG);
4 gSYSCONFIG.fDisableDebugSerial = nDisable;
5 SetSysConfig(&gSYSCONFIG);
6 }
7
8
9
10 void CSysAppDlg::OnBnClickedCheckDebugserial()
11 {
12 // TODO: 在此添加控件通知處理程序代碼
13 CReg Reg;
14
15 UpdateData(TRUE);
16 SysDisableDebugSerial(m_bDisableDebugSerial);
17
18 Reg.Open(HKEY_LOCAL_MACHINE, _T("Drivers\\BuiltIn\\Serial3"), KEY_ALL_ACCESS);
19 Reg.SetSZ(_T("Dll"), m_bDisableDebugSerial ? _T("tcc_serial.dll") : _T("-tcc_serial.dll"));
20 Reg.Flush();
21 }

可以看到,在修改變量fDisableDebugSerial的同時,還需要修改UART0對應的注冊表。在禁用調試串口時,DLL鍵值設置為正確的,在啟用調試串口時,DLL鍵值前加一個中橫槓。確保UART0要麼用作調試串口,要麼用作普通串口,二者必居其一。應用程序設置界面如下圖所示。

經測試,以上修改基本達到了預計的效果,實現了WinCE下調試串口的動態復用。

Copyright © Linux教程網 All Rights Reserved