- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- RNAi在癌症治疗中的应用_图文.doc
- RS、RAS 摩托车发动机专用板式无声齿型链条.doc
- RNA转染(Entranster)与成骨细胞增殖和分化研究_图文.doc
- RTP_RTCP流量控制算法.doc
- RTKPPP定位算法流程 - 图文-.doc
- SAT阅读解题的基本原则-智课教育出国考试.doc
- SAS驱动器连接(上).docx
- SAS驱动器连接(下).docx
- Scopus 数据库检索方法和综合利用_图文.doc
- SD Card linux 驱动 流程图(整理pdf).doc
- 2025年黑龙江旅游职业技术学院单招职业技能考试题库含答案.docx
- 发泡剂项目详细风险分析及评估报告.docx
- 2025年部编版三年级上册语文第3课《不懂就要问》教案(真题8篇) .pdf
- 2025年部编版三年级上册语文《古诗三首》教学设计 .pdf
- 2025年部编版三年级上册语文《铺满金色巴掌的水泥道 》教案 .pdf
- 2025年福建省三明市单招职业适应性测试题库一套.docx
- 《养老服务质量评价指标体系构建与老年人需求匹配研究》教学研究课题报告.docx
- 非智力因素对初中生语文学习兴趣及效果影响研究教学研究课题报告.docx
- 初中地理课堂中地球科学素养培养策略的实践与反思教学研究课题报告.docx
- 高中生物教学中艺术教育融入的实践与效果分析教学研究课题报告.docx
文档评论(0)