当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于WindowsCE下S3C2410的多串口移植技术

嵌入式系统已经渗入到国民经济的各个领域,而嵌入式操作系统是嵌入式系统的灵魂。目前国际上常用的操作系统有 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)

[!--empirenews.page--]

然后在注册表中添加中串口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年
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭