車機項目中用到了很多串口外設,如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()其中,pVirtualBOOTARGS->SysConfig.fDisableDebugSerial為控制調試串口是否正常輸出字符的變量。SysConfig是保存在NAND Flash中特定區域的一個結構體,BOOT啟動時可以讀取到,並且放在內存的指定位置。應用程序中可以修改該結構,相關代碼如下。
1 void SysDisableDebugSerial(int nDisable)可以看到,在修改變量fDisableDebugSerial的同時,還需要修改UART0對應的注冊表。在禁用調試串口時,DLL鍵值設置為正確的,在啟用調試串口時,DLL鍵值前加一個中橫槓。確保UART0要麼用作調試串口,要麼用作普通串口,二者必居其一。應用程序設置界面如下圖所示。
經測試,以上修改基本達到了預計的效果,實現了WinCE下調試串口的動態復用。