S3C2440 Windows CE的RTC模块驱动设计与实现
3 驱动程序实现
本RTC功能的实现在基于S3C2440嵌入式开发平台上,通过WinCE下的RTC模块的驱动程序完成,而WinCE下RTC的驱动是在底层实现的,具体要在OAL(OEM Adaption Layer)实现。下面对于OAL代码层进行简要介绍,然后分析RTC驱动代码,在此基础上给出部分源程序。
3.1 OAL概述
OAL的全称是OEM Adaption Layer,即原始设备制造商适配层。从逻辑结构上看,它位于操作系统的内核与硬件之间,是连接系统与硬件的枢纽;从功能上看,OAL是被链接到内核的库,它可以用来创建内核的可执行文件。OAL在系统内核与目标设备之间进行通信,隶属于操作系统.是操作系统的一部分。从存在方式上讲OAL是一组函数的集合体,这些函数体现出OAL的功能,如图2所示。
图2 OAL功能结构关系框图
OAL层包含Startup()、OEMInit()、实时时钟函数、串口调试函数、底层中断处理函数、以太网口调试函数、KITL(Kernel Independent Transport Layer)内核独立传输层,此外,它还实现了包括电源管理、模块认证等高级功能。
WinCE的启动过程为:CPU执行引导向量,跳转到硬件初始化代码,即Startup函数。
在Startup函数完成最小硬件环境初始化后跳转到KernelStart函数来对内核进行初始化;KernelStart函数调用OEMInitDebugSerial完成对调试串口的初始化,调用OEMInit函数来完成硬件初始化工作以及设置时钟、中断,调用OEMGetExtensionDRAM函数来判断是否还有另一块DRAM。
因此,实时时钟驱动实现代码是在OAL层实现的,当Windows CE启动时,会调用实时时钟函数来初始化系统时间,下面介绍这些函数的具体实现。
3.2 时钟函数
实现RTC功能需要编写3个函数,分别是OEMGetRealTime()、OEMSetRealTime()与OEMSetAlarmTime()。下面对于这三个函数分别介绍。
OEMGetRealTime()得到当前时间。此函数名不可更改,是WinCE内核规定好了的,也就是当内核需要知道当前时间的时候直接调用此函数。图3为函数OEMGetRealTime()执行流程。
由于RTC不能任意地修改,不然会造成时间的混乱,所以每次获取时间或者设置时间完毕以后必须禁止RTC,具体是通过设置RTC使能/禁止寄存器实现的。而在每次读取时间或者设置时间的时候必须先使用它。在读取时间的时候 若读取的“秒”为0必须重新读取时间,因此时的“分”已经被进位了。
OEMSetRealTime()设置时间。与OEMGetRealTime()一样,它也不可改名,通过此函数核心可以直接修改时间。也就是说,如果用户点击WinCE任务栏中的时间以后,修改时间最终都是调用此函数。
OEMSetAlarmTime()设置系统报警时间,其参数为指向含有SYSTEMTIME结构体缓冲区的长指针。如果此函数执行成功则返回TRUE,执行失败则返回FALSE。此函数必须是可重人的以防止对硬件的多次操作。对于一般用户的操作,用户可以不用编写此函数。如果需要系统在特定的时间完成特定的功能就需要完成此函数的编写。
评论