菜鸟一枚,刚刚开始学wince。最近将串口打印与串口驱动(uart 驱动)给弄混了。现在才弄明白串口打印功能和串口驱动虽然都用了arm芯片上的uart 控制器,但是它们是各自独立的,在不同的地方实现对寄存器的操作。
串口打印功能:串口信息打印一般使用DEBUGMSG、RETAILMSG、NKDbgPrintfW这三个函数,DEBUGMSG和RETAILMSG是通过调用NKDbgPrintfW来实现的。DEBUGMSG只在DEBUG版本中有效,RELEASE版本中它不起作用。RETAILMSG和NKDbgPrintfW在DEBUG和RELEASE中都有效,但前提是在VS2008的Build Options中关闭ship build,原因将在下面给出。
platform\common\src\common\boot\blcommon\blcommon.c文件中的BootloaderMain()函数调用OEMDebugInit()实现串口的初始化。
NKDbgPrintfW调用NKvDbgPrintfW函数,而NKvDbgPrintW函数调用里面调用了OutputNumHex等几个函数,但这些函数最终都是调用了Debugserial.c(不同BSP,文件名可能也不一样)文件中的OEMWriteDebugByte函数,该文件的内容如下所示:
这个文件中的函数都是直接对uart寄存器进行操作的,如在OEMInitDebugSerial函数中就通过寄存器操作实现了对uart的初始化,如下所示:
在第一幅图片中可看到#ifndef SHIP_BUILD这一条代码,而在#else分支下的那几个函数都是一些没有实现具体功能的空函数。这就是为什么如果使能了ship build,则不能使用RETAILMSG和NKDbgPrintfW打印信息的原因。
不同的BSP可能代码位置会有一些差别,但是大体的实现结构应该是差不多的。