歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

WinCE下調試串口的動態復用

      車機項目中用到了很多串口外設,如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