网站大量收购独家精品文档,联系QQ:2885784924

RTC 实时时钟驱动.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RTC 实时时钟驱动 -------I2C软件模拟通信 内核版本: linux-2.4.21 文档设计: 侯辉华 版 本: 1.01 时 间: 2007/06/10 内容简介: 介绍接在I2C总线上RTC实时时钟设备的驱动, 使用软件模拟的方法完成I2C的通信; 介绍了Linux下的时钟系统, 以及I2C的层次结构. 目录索引: Linux下的时钟系统简介. Linux对时间的表示. Linux时钟中断的初始化及处理. RTC设备驱动程序. I2C总线读写. 六. Linux下的I2C驱动层次结构.. 一. Linux下的时钟系统简介 实际上,linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间来进行时间同步. linux的内核时间实际上是记录从1970年1月1日距离现在的秒数,并且以GMT(格林尼治时间)(或者叫UTC- Coordinated Universal Time)为标准, UTC是不随着DST(夏令时)变换,需要有变化的是由应用程序自身来完成时间的转换。 二. Linux对时间的表示 通常,操作系统可以使用三种方法来表示系统的当前时间与日期:①最简单的一种方法就是直接用一个64位的计数器来对时钟滴答进行计数。②第二种方法就是用一个32位计数器来对秒进行计数,同时还用一个32位的辅助计数器对时钟滴答计数,之子累积到一秒为止。因为2的32次方超过136年,因此这种方法直至22世纪都可以让系统工作得很好。③第三种方法也是按时钟滴答进行计数,但是是相对于系统启动以来的滴答次数,而不是相对于相对于某个确定的外部时刻;当读外部后备时钟(如RTC)或用户输入实际时间时,根据当前的滴答次数计算系统当前时间。 Linux通常都采用第三种方法来维护系统的时间与日期, 通过时钟点滴进行计时的基础原理, 可以参看下面介绍的参考文档, 主要原理是通过硬件的中断累积来计时, 但必要要设置硬件中断一次所须的时间, 一般具体的不同的芯片都不同, EP9302系统具体设置如下: EP93xx系列芯片有四个Timer计时器, 使用的是Timer1, 与具体芯片相关的内容在如下两个文件: linux-2.4.21\arch\arm\mach-ep93xx\time.c, linux-2.4.21\arch\arm\mach-ep93xx\time.h 针对整个Arm体系的时钟相关文件为: linux-2.4.21\arch\arm\kernel\time.c 时钟中断计时的主要相关函数为如下两个: ep93xx_gettimeoffset()的作用就是返回距最近一次时钟中断发生后, Timer已经累积的时间(但还未满足引发一次时钟中断), 这个时间值单位为微秒, 获取当前时间时, 就是累计已经发生的Timer中断次数所经历的时间, 然后加上这个即将要发生中断所过去的时间, 这样取得当前时间的精度是相当高的. LATCH的含义是指一次时钟中断要经过多少个Timer时钟周期, TIMER1LOAD寄存器设置的就是这个值, ep93xx的计时器Timer1会将这个值一直递减直至0, 如此就引发一次时钟中断, 然后又重LATCH重头开始递减. xtime记载的即为系统自开机以来的当前时间, 单位为秒, 精确度为微秒. 因此在开机时必须从RTC当中取得真实的时间来赋此初值, EP93xx系列直接初始此值为其自身所带RTC模块的时间值, RTCDR寄存器是EP93xx所自带的RTC模块的寄存器, 其值单位为秒,基准为相对1970年, 此处即为我们要改动的地方.将其值从i2c的RTC实时芯片中取回赋给它. static unsigned long ep93xx_gettimeoffset(void) { unsigned long hwticks; hwticks = LATCH - (inl(TIMER1VALUE) 0xffff); return ((hwticks * tick) / LATCH); } void __init ep93xx_setup_timer(void) //初始化Timer,设定时钟中断周期… { gettimeoffset = ep93xx_gettimeoffset; outl(0, TIMER1CONTROL); outl(LATCH - 1, TIME

文档评论(0)

559997799 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档