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
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
相关文章推荐
- Intel PXA27x平台中的UART接口驱动
- Intel PXA27x平台中的UART接口驱动
- Intel PXA27x平台中的UART接口驱动 (摘录曾慧鹏)
- 基于win平台的高性能服务器底层通信模型设计(1)
- Linux TTY驱动--Uart_driver底层
- WIFI之三:WIN MOBILE平台上的88W8688驱动
- 基于win平台的高性能服务器底层通信模型设计(1)
- MTK平台打开uart默认输出log
- 基于Intel PXA255平台的网络摄像机设计
- Intel PXA27x平台中的UART接口驱动
- 应用场景应该如何选择适合的区块链底层技术平台?
- linux uart m200平台波特率500kbps乱码问题和输入不响应问题
- 大型动态应用系统平台的底层系统框…
- 揭秘FaceBook Puma演变及发展——FaceBook公司的实时数据分析平台是建立在Hadoop 和Hive的基础之上,这个根能立稳吗?hive又是sql的Map reduce任务拆分,底层还是依赖hbase和hdfs存储
- android底层开发进阶(2)--makefile笔记与android的平台编译
- Python量化交易平台开发教程系列5-底层接口对接
- UART IP和UVM的验证平台
- UART UVM验证平台平台搭建总结
- uart_pxa_dma_init
- 如何在区块链底层平台和应用场景中搭一个“桥梁”,他们推出了“中间件”