您的位置:首页 > 其它

UART之三:PXA平台WIN MOBILE的UART底层

2011-11-03 19:04 141 查看
(1)铺垫

PXA270中有三个UART接口,分别叫FFUART、BTUART和STUART。FFUART(FullFunction)拥有8根符合16550A标准的信号线(地线除外)。FFUART可以用来处理任何和UART兼容的通信;接下来是BTUART(BlueTooth),从它的名字可以知道它是推荐给BT(蓝牙)使用的接口,它拥有常用的四根信号线RXD/TXD/CTS/DTR,这四根线分别负责接受发送功能和流控制功能;接下来的STUART(Standard)最简单,仅仅拥有RXD/TXD也就是收发信号线。

(2)驱动分析

串口因为太常用了所以微软早就已经把这些代码实现得很成熟了,不管是做Windows Mobile还是做WinCE哪个版本在%OSROOT%/PUBLIC/COMMON/OAK/DRIVERS/SERIAL路径下面都能找到微软提供的UART驱动源代码。但是微软的代码仅仅是从框架上的实现,BSP中还是要有最底层的代码等待你去补充,比如如何设置每一个UART的参数,波特率是多少等等情况。微软要做的是把UART通用的特性整合起来,这样以不变应万变,达到代码和数据复用的目的。

根据分析,PXA27X的三个UART的寄存器等于三份拷贝,区别仅仅在于它们存放在三个不同的物理地址罢了,这首先就给代码重用提供了机会,可以想到用类的方式来描述标准UART的特性,然后每个UART作为这个类的子类去实现自己和标准不符的部分或是参数的调整。




描述UART的根类是CSerialpdd,它从CRegistryEdit类派生出来是为了方便对注册表进行读写,因为配置UART驱动的信息往往是保存在注册表中的。CPdd16550是一个最重要的类,这个类实现了16550标准的UART接口。它从CSerialpdd和CMiniThread派生,从CMiniThread派生的原因是在这个类中要实现对中断的捕获,所以要有监视线程。还有一个重要之处,为了方便操作UART接口中的寄存器,其拥有一个CBulReg16550类型的成员变量,该类封装了对PXA27x中UART寄存器的操作,其派生于CReg16550。接下来是CBulpdd16550,这个类是16550接口在PXA27x中的具体实现,派生于CPdd16550。

接下去是我们OEM要写的代码了。图上最右下脚的三个类就是需要我们在BSP的drivers中去实现的,微软的MDD层代码会在init的时候去做和我们这部分代码的连接,方法就是从注册表中读该UART是FF/BT/ST,比如是FFUART的话它会用new CBulpdd16550FUART()的方式得到一个CSerialpdd *的指针,然后用这个指针可以协调所有的UART的操作,我们OEM可以很方便的控制UART参数和传输中的数据处理,因为我们仅仅需要去重新实现(修改)父类中的一些虚函数就行了。

(3)MDD和PDD的关系

UART驱动是标准的流驱动,所以其对外的接口肯定是类似COM_Init ,COM_Open这种的。这个接口属于MDD层的最上端,它们的实现在com_mdd2.lib中,通过并入pxa27x_uart.lib来包含在Ms2_serial.dll中,在Ms2_serial.dll的def文件中,必须指明对这些接口的输出。到这里也许你还不是很清楚整个UART驱动的架构,好再来一张连贯点的:




具体一点,OEMInit会调用GetSerialObject(DeviceArrayIndex)得到最终干活的那个类的实例的指针,这样MDD和PDD就连接起来了。

(4)具体到我的调试SE955扫描头的工作中,就是如果在注册表中没有查到对应所需UART口的DLL信息,那么就要怀疑BSP编译时有没有打开该串口选项。排除这个问题后,根据注册表中的名字和Index获取正确的COM口名,然后就可以通过串口调试助手来进行实验了。波特率设置9600,以十六进制发送命令串“04 C8 04 00 FF 30”,如果以十六进制接收到应答,即说明通讯是好的。



参考原文:http://blog.csdn.net/fredzeng/archive/2006/09/27/1296195.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: