嵌入式系统已经渗入到国民经济的各个领域,而嵌入式操作系统是嵌入式系统的灵魂。目前国际上常用的操作系统有 VxWorks、Windows CE、Linux等。其中,微软公司开发的 Windows CE 以其快速的开发流程、灵活的软硬件选择和健壮的最终产品已成为越来越多嵌入式产品开发的首选。
由于嵌入式系统的硬件平台种类繁多,WindowsCE.net支持的处理器种类就有ARM,POWER PC, MPS、X86等几大类,各个大类之内又包含多种CPU。各硬件厂商提供的 WindowsCE.net 的硬件驱动并不全,因此开发人员经常需要根据自己特定的硬件平台进行驱动开发。WindowsCE.net的标准BSP一般只为我们开通了一个串口,很难满足使用要求。本文就是在这样的背景下介绍在WindowsCE.net下是如何开发S3C2410的另外两个串口驱动的。
一、S3C2410及其串口简介
该芯片是三星公司生产的32位RISC嵌入式处理器。它专为手持设备和一般应用而设计,能满足嵌入式系统对低成本、低功耗、高性能、小体积的要求。为了尽可能减少系统的整体成本,S3C2410包括了以下组件:16KB的指令和数据CACHE,处理虚拟存储器管理的MMU,支持STN和TFT的 LCD控制器,NAND FLASH的系统引导器,SDRAM控制器,触摸屏接口,USB接口,PLL时钟产生器,一个通道的USB从接口,4通道的PWM定时器和一个通道的内部定时器,带有看门狗定时器,117个通用IO口,包括24个外部中断源,内部集成8通道ADC。该芯片提供4种电源模式:一般模式、低速模式、休眠模式和掉电模式;支持WINCE、LINUX等嵌入式操作系统。S3C2410是利用ARM的ARM920T内核,采用0.18 微米的标准CMOS技术制造的。它的小巧低功耗全静态设计,特别适合于对功耗敏感的系统设计。
S3C2410的串口提供了3组独立的异步串行I/O,每个UART通道都包含了16字节的FIFO,用于数据发送和接收,并且都可以在中断方式和 DMA方式下进行操作。用来控制串口1、2的寄存器如下:列控寄存器(ULCON)、控制寄存器(UCON)、FIFO控制寄存器(UFCON)、 MODEM控制寄存器(UMCON)、TX/RX状态寄存器(UTRSTA)、错误状态寄存器(UERSTA)、FIFO状态寄存器(UFSTAT)、 MODEM状态寄存器(UMSTAT)、传输缓冲区寄存器(UTXH)、发送缓冲区寄存器(URXH)、波特率寄存器(UBRDIV)。串口3与串口1、 2相比缺少MODEM控制寄存[1]器和状态寄存器。
二、Windows CE系统设备驱动程序特点
设备驱动程序是将操作系统和设备连接起来,使得操作系统能够识别设备并为应用程序提供应用服务的程序。
在Windows CE下的驱动程序有两种模型:内建驱动程序(Built in Driver)和可安装驱动程序(Installable Driver)。内建驱动程序适用于集成到基于Windows CE的设备,这些设备驱动程序是系统所必须的,如键盘驱动和显示驱动等。当系统加载时,它们被静态联结到图形窗口事件子系统(GWES)。可安装驱动程序由设备管理器(device.exe)动态加载到用户模式的动态连接库,它使用流接口驱动架构并借助于文件系统调用从设备管理器应用程序获得的指令。串口驱动即为可安装驱动。
Windows CE下驱动程序结构如图1 所示。在Windows CE下的驱动程序按其结构的不同可分为分层驱动程序和不分层驱动程序两类。在分层驱动程序中,程序代码被分为两层,模型驱动层(MDD)和平台相关驱动层(PDD)。MDD层由顶层所有驱动程序都使用的公用代码组成,而PDD层由与特定硬件设备相关的代码组成。MDD层通过调用PDD层函数来访问硬件。通常,MDD层由微软提供,不用改动,驱动开发人员只须改动针对特定硬件平台的PDD层即可。系统通过设备驱动程序接口(DDI,是由MDD层或不分层驱动程序导出的一组函数)调用MDD层的功能,而MDD层通过设备驱动程序服务提供者接口(DDSI,是由PDD层导出的接口函数)调用PDD层的功能。分层和不分层并不是绝对的,任何分层的驱动程序都可以用不分层的驱动程序来代替。如果时间和效能是最关键的要素时,最好选择不分层驱动程序。
图1 Windows CE下驱动程序的结构 三、S3C2410串口驱动移植
在WINCE中,串口驱动模型遵循ISO/OSI网络通讯模型,就是说串口属于WINCE网络模块的一部分,其中硬件实现网络的物理层,驱动和 serialAPI共同组成数据的链路层。WINCE提供的串口驱动是采用分层结构设计的,MDD提供框架性的实现,负责提供OS所需的基本实现,并使代码设计与具体的硬件设计无关,而PDD提供了对硬件操作的相应代码,而这些代码则通过结构体PHWOBJ相互联系起来。PHWOBJ结构体包含该驱动对应的中断识别号以及该驱动在PDD层所使用的所有其它接口函数的接口。从整体来看,串口驱动属于可安装驱动。在针对一种特定硬件实现串口驱动的时候,首先,我们需要了解硬件的物理特性和控制逻辑,然后,根据DDSI的约束来进行实现,即实现与结构体PHWOBJ相关的一系列函数即可。串口驱动模型定义了串口的全部功能。也就是说,在这种模型中,除定义了常用的TX和RX外,还对DTR、RTS等引脚进行了定义,使得该串口模型具有支持流控制和Modem驱动的能力。
为添加串口2和串口3的驱动,首先在Oalintr.h中添加串口中断的宏定义:
#define SYSINTR_SERIAL3 (SYSINTR_FIRMWARE+9)
#define SYSINTR_SERIAL2 (SYSINTR_FIRMWARE+19)
然后在注册表中添加中串口2、3的注册项:
[HKEY_LOCAL_MACHINEDriversBuiltInUART1]
"DeviceArrayIndex"=dword:1
"Irq"=dword:13 //中断号
"IoBase"=dword:50004000 //串口2地址
"IoLen"=dword:2C
"Prefix"="COM" //设备文件前缀
"Dll"="SER2410.Dll" //串口驱动动态连接库
"Index"=dword:2
[HKEY_LOCAL_MACHINEDriversBuiltInUART2]
"DeviceArrayIndex"=dword:2
"Irq"=dword:09 //中断号
"IoBase"=dword:50008000 //串口3地址
"IoLen"=dword:2C
"Prefix"="COM" //设备文件名前缀
"Dll"="SER2410.Dll" //串口驱动动态连接库
"Order"=dword:0
"Index"=dword:3
其次,修改文件 ser2410_ser.c。
在此文件中增加串口2、3的初始化函数,并添加两个函数表:
SerInitSerial2( ULONG Identifier,PVOID pMddHead,PHWOBJ pHWObj);
SerInitSerial3( ULONG Identifier,PVOID pMddHead,PHWOBJ pHWObj);
const HW_VTBL IoVTbl2{ };
const HW_VTBL IoVTbl3{ };
在函数GetSerialObject(DWORD DeviceArrayIndex)中添加对串口2、3的处理程序。GetSerialObject函数是PDD层唯一不能改变函数名的函数,它最先被 MDD层的COM-Init函数调用,通过搜索注册表中DeviceArrayIndex项的值,返回给MDD层一个PHWOBJ结构体。相关代码如下:
if ( DeviceArrayIndex == 0 )
pSerObj = (PHWOBJ)(&IoObj);
else if (DeviceArrayIndex == 1)
pSerObj = (PHWOBJ)(&IoObj2);
else if(DeviceArrayIndex == 2)
pSerObj = (PHWOBJ)(&IoObj3);
else
pSerObj = (PHWOBJ)(&IoObj);
最后,修改文件 ser2410_hw.c 中的函数 SL_Init( PVOID pHead, PUCHAR pRegBase, UINT8 RegStride, EVENT_FUNC EventCallback, PVOID pMddHead, PLOOKUP_TBL ),根据不同的pHead -〉dwIOBase处理不同的端口内容,串口1的dwIOBase为0X50000000,串口2的dwIOBase为0X50004000,串口3的 dwIOBase为0X50008000。
至此,驱动更改完毕。重新编译,生成新的SDK,安装后即可在新平台下使用串口2和串口3。
在EVC中通过函数CreateFile(szPort,GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING,0,NULL)即可打开所需的串口,然后通过COMMTIMEOUTS结构设置通讯超时设置,通过DCB结构设置奇偶校验、波特率、停止位个数等。成功打开端口后,就可以通过WriteFile发送数据,通过ReadFile接收数据。
四、结束语
本文作者的创新点在于充分利用S3C2410硬件资源,开发OEM层串口驱动程序,由于可以同时使用三个串口,提高了稳定性,精简硬件设计,具有较好的推广价值。
参考文献:
[1]江俊辉,基于ARM的嵌入式系统硬件设计,微计算机信息,2005年,7-2
[2]田东风,Windows CE应用程序设计,机械工业出版社,2005年
[3]陈向群等,Windows CE.NET系统分析及试验教程,机械工业出版社,2003年
[4]于明等,ARM9嵌入式系统设计与开发教程,电子工业出版社,2006年