S3C2440驱动篇—RTC驱动分析

发布者:MagicalSerenade最新更新时间:2024-06-14 来源: elecfans关键字:S3C2440  RTC驱动 手机看文章 扫描二维码
随时随地手机看文章

Linux-2.6.32.2内核自带RTC驱动,但mach_smdk2440.c中没有添加该设备集,因此没有被激活,加入该平台设备,RTC平台设备定义在arch/arm/plat-s3c24xx/devs.c。

static struct platform_device *smdk2440_devices[] __initdata = {

       &s3c_device_usb,          /* arch/arm/mach-s3c2440/mach-smdk2440.c */

       &s3c_device_lcd,

       &s3c_device_wdt,

       &s3c_device_i2c0,

       &s3c_device_iis,

       &s3c_device_rtc,

};

驱动实现:

  1. #include <linux/module.h>   

  2. #include    

  3. #include    

  4. #include    

  5. #include    

  6. #include    

  7. #include    

  8. #include    

  9. #include    

  10. #include    

  11.   

  12. #include    

  13. #include    

  14. #include    

  15. #include    

  16. #include    

  17.   

  18. /* I have yet to find an S3C implementation with more than one 

  19.  * of these rtc blocks in */  

  20.   

  21. static struct resource *s3c_rtc_mem;  

  22.   

  23. static void __iomem *s3c_rtc_base;  

  24. static int s3c_rtc_alarmno = NO_IRQ;  

  25. static int s3c_rtc_tickno  = NO_IRQ;  

  26.   

  27. static DEFINE_SPINLOCK(s3c_rtc_pie_lock);  

  28.   

  29. /* IRQ Handlers */  

  30.   

  31. static irqreturn_t s3c_rtc_alarmirq(int irq, void *id)  

  32. {  

  33.     struct rtc_device *rdev = id;  

  34.   

  35.     /* 报警中断到来时,设定报警相关信息,函数实现位于drivers/rtc/interface.c */  

  36.     rtc_update_irq(rdev, 1, RTC_AF | RTC_IRQF);  

  37.     return IRQ_HANDLED;  

  38. }  

  39.   

  40. static irqreturn_t s3c_rtc_tickirq(int irq, void *id)  

  41. {  

  42.     struct rtc_device *rdev = id;  

  43.   

  44.     rtc_update_irq(rdev, 1, RTC_PF | RTC_IRQF);  

  45.     return IRQ_HANDLED;  

  46. }  

  47.   

  48. /* Update control registers 设置RTCALM全局报警使能位*/  

  49. static void s3c_rtc_setaie(int to)  

  50. {  

  51.     unsigned int tmp;  

  52.   

  53.     pr_debug('%s: aie=%dn', __func__, to);  

  54.   

  55.     tmp = readb(s3c_rtc_base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN;  

  56.   

  57.     if (to)  

  58.         tmp |= S3C2410_RTCALM_ALMEN;  

  59.   

  60.     writeb(tmp, s3c_rtc_base + S3C2410_RTCALM);  

  61. }  

  62.   

  63. /* 节拍时间计数器使能 */  

  64. static int s3c_rtc_setpie(struct device *dev, int enabled)  

  65. {  

  66.     unsigned int tmp;  

  67.   

  68.     pr_debug('%s: pie=%dn', __func__, enabled);  

  69.   

  70.     spin_lock_irq(&s3c_rtc_pie_lock);  

  71.     tmp = readb(s3c_rtc_base + S3C2410_TICNT) & ~S3C2410_TICNT_ENABLE;  

  72.   

  73.     if (enabled)  

  74.         tmp |= S3C2410_TICNT_ENABLE;  

  75.   

  76.     writeb(tmp, s3c_rtc_base + S3C2410_TICNT);  

  77.     spin_unlock_irq(&s3c_rtc_pie_lock);  

  78.   

  79.     return 0;  

  80. }  

  81.   

  82. /* 节拍时间计数值设置*/  

  83. static int s3c_rtc_setfreq(struct device *dev, int freq)  

  84. {  

  85.     unsigned int tmp;  

  86.   

  87.     if (!is_power_of_2(freq))  

  88.         return -EINVAL;  

  89.   

  90.     spin_lock_irq(&s3c_rtc_pie_lock);  

  91.   

  92.     tmp = readb(s3c_rtc_base + S3C2410_TICNT) & S3C2410_TICNT_ENABLE;  

  93.     tmp |= (128 / freq)-1;  

  94.   

  95.     writeb(tmp, s3c_rtc_base + S3C2410_TICNT);  

  96.     spin_unlock_irq(&s3c_rtc_pie_lock);  

  97.   

  98.     return 0;  

  99. }  

  100.   

  101. /* Time read/write */  

  102. /* 读取RTC中时间:分、时、日期、月、年、秒 */  

  103. static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)  

  104. {  

  105.     unsigned int have_retried = 0;  

  106.     void __iomem *base = s3c_rtc_base;  

  107.   

  108.  retry_get_time:  

  109.     rtc_tm->tm_min  = readb(base + S3C2410_RTCMIN);  

  110.     rtc_tm->tm_hour = readb(base + S3C2410_RTCHOUR);  

  111.     rtc_tm->tm_mday = readb(base + S3C2410_RTCDATE);  

  112.     rtc_tm->tm_mon  = readb(base + S3C2410_RTCMON);  

  113.     rtc_tm->tm_year = readb(base + S3C2410_RTCYEAR);  

  114.     rtc_tm->tm_sec  = readb(base + S3C2410_RTCSEC);  

  115.   

  116.     /* the only way to work out wether the system was mid-update 

  117.      * when we read it is to check the second counter, and if it 

  118.      * is zero, then we re-try the entire read 

  119.      */  

  120.     /* 如果读到秒为0,可能有进位,根据2440手册知道,要重新读一次 */  

  121.     if (rtc_tm->tm_sec == 0 && !have_retried) {  

  122.         have_retried = 1;  

  123.         goto retry_get_time;  

  124.     }  

  125.   

  126.     pr_debug('read time %02x.%02x.%02x %02x/%02x/%02xn',  

  127.          rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday,  

  128.          rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);  

  129.   

  130.     /* 将BCD码转换为二进制数 */  

  131.     rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec);  

  132.     rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min);  

  133.     rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour);  

  134.     rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday);  

  135.     rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon);  

  136.     rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year);  

  137.   

  138.     /*这里为什么要加100年和减1月,查看数据手册得知区别1900年和2000年闰年的因素,1900年不是闰年而2000年是闰年*/  

  139.     rtc_tm->tm_year += 100;  

  140.     rtc_tm->tm_mon -= 1;  

  141.   

  142.     return 0;  

  143. }  

  144.   

  145. /* 与s3c_rtc_gettime功能相反 */  

  146. static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)  

  147. {  

  148.     void __iomem *base = s3c_rtc_base;  

  149.     int year = tm->tm_year - 100;  

  150.   

  151.     pr_debug('set time %02d.%02d.%02d %02d/%02d/%02dn',  

  152.          tm->tm_year, tm->tm_mon, tm->tm_mday,  

  153.          tm->tm_hour, tm->tm_min, tm->tm_sec);  

  154.   

  155.     /* we get around y2k by simply not supporting it */  

  156.   

  157.     if (year < 0 || year >= 100) {  

  158.         dev_err(dev, 'rtc only supports 100 yearsn');  

[1] [2] [3] [4]
关键字:S3C2440  RTC驱动 引用地址:S3C2440驱动篇—RTC驱动分析

上一篇:S3C2440驱动篇—Linux平台设备驱动
下一篇:S3C2440-SDRAM连线分析

推荐阅读最新更新时间:2026-03-06 04:42

Linux下S3C2440 RTC实时时钟驱动配置与修改
Linux下对S3C2440 RTC的支持非常完善,我们只需要做简单的修改,即可使用RTC 1、vi arch/arm/mach-s3c2440/mach-smdk2440.c static struct platform_device *smdk2440_devices __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, &s3c_device_rtc, //这里我们添加上RTC平台设备,默认是没添加的 }; 2、make zImage 3、使用与测试 L
[单片机]
stm32f103的RTC驱动程序
具体问题 这段时间在弄自己的一个《宝宝的气象站》的项目,使用了ESP8266的WiFi模块,使其能够将数据传输到OneNET后台并显示。网络通信使用的是OneNET提供的EDP通信组件,但是RTC遇到了问题。从NTP服务器获取的时间与本地RTC获取的时间有差异。NTP使用的是1970年1月1日作为起始时间点。本地RTC的起始点是2000年1月1日。这样就需要将NTP获取的秒减去两个时间的间隔。 代码 mip_rtc.h /** ***************************************************************************** * @文 件: mip_rtc.h *
[单片机]
微指数下跌0.97% 北方华创半导体设备均为100%自主研发
A股三大指数今日持续震荡,最终收盘涨跌不一,其中沪指下跌0.04%,收报3501.99点;深证成指下跌0.03%,收报14412.31点;创业板指上涨0.70%,收报2871.97点。两市合计成交8764亿元,行业板块涨多跌少,酿酒与券商板块强势领涨。北向资金今日净买入5.27亿元。 半导体板块表现较好。集微网从电子元件、材料、设备、设计、制造、IDM、封测、分销等领域选取了118家半导体公司作了统计。在118家半导体公司中,76家公司市值上涨,其中,旋极信息、环旭电子、英唐智控等涨幅居前;42家公司市值下跌,其中华峰测控、卓胜微、斯达半导等跌幅居前。 对于后市大盘走向,中原证券认为,节后受到多方因素的影响,A股市场持续下挫,本
[手机便携]
<font color='red'>集</font>微指数下跌0.97% 北方华创半导体<font color='red'>设备</font>均为100%自主研发
微指数下跌0.92% 中微公司入股半导体设备商理想万里晖
A股三大指数今日全天维持震荡整理态势,最终集体红盘报收。两市合计成交8811亿元,行业板块涨少跌多,酿酒板块大涨。北向资金今日小幅净卖出4.08亿元。具体来看,沪指收盘上涨0.02%,收报3397.29点;深成指上涨0.19%,收报14044.10点;创业板指上涨0.07%,收报2842.81点。 半导体板块表现较差。集微网从电子元件、材料、设备、设计、制造、IDM、封测、分销等领域选取了118家半导体公司作了统计。在118家半导体公司中,20家公司市值上涨,其中睿创微纳、芯源微、纳思达等涨幅居前;98家公司市值下跌,其中全志科技、富满电子、寒武纪等跌幅居前。 中信建投证券认为,2021年伴随着经济复苏和利率上行,股票市场整体没有
[手机便携]
<font color='red'>集</font>微指数下跌0.92% 中微公司入股半导体<font color='red'>设备</font>商理想万里晖
ARM-Linux驱动移植--RTC(实时时钟)移植
硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内核版本:2.6.39 首先修改内核源码/arch/arm/mach-s3c2410/mach-smdk2410.c 添加红色字体部分 static struct platform_device *smdk2410_devices __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, &s3c_device_sdi, &s3c_dev
[单片机]
ARM-Linux<font color='red'>驱动</font>移植--<font color='red'>RTC</font>(实时时钟)移植
中移动2013年100G OTN设备采结果出炉 中兴和烽火中标
    10月9日消息, 中国移动 通信有限公司(以下简称"中国移动")今日在中国移动采购与招标网贴出《中国移动2013年100G OTN设备集中采购的中标公示》。公示称,中国移动2013年100G OTN设备集中采购评标工作已按招标文件规定的评标方法和相关规定的要求完成评标工作。中兴通讯股份有限公司、 烽火通信 科技股份有限公司成为中标候选人。另计大智慧阿思达克通讯社报道,此次集采规模为100G OTN设备各类端口约1338个。   据了解,此次的100G OTN设备集采是中国移动的第二期100G OTN集采。而今年6月份,中国移动才刚刚完成第一期100G OTN现网部署。分析指出100G市场格局已定,中兴华为烽火将是最大
[手机便携]
s3c2440rtc操作
实时时钟(RTC)其主要功能是电源故障的制度下,使用后备电源,时钟继续。为了不浪费时间信息。 s3c2440内部集成了RTC模块,并且用起来也十分简单。 其内部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY。BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时。星期,日,月和年,表示时间的数值都是BCD码。 这些寄存器的内容可读可写。而且仅仅有在寄存器RTCCON的第0位为1时才干进行读写操作。为了防止误操作。当不进行读写时。要把该位清零。当读取这些寄存器时。可以获知当前的时间;当写入这些寄存器时,可以改变当前的时间。 另外须要注意的是。由于有所谓的“一秒 误差”,因此当读
[单片机]
<font color='red'>s3c2440</font>的<font color='red'>rtc</font>操作
s3c2440的IIC控制
在tq2440和mini2440上都连接着EEPROM 它们作用也不过測试I2C总线能否用。 当中在mini2440上EEPROM型号是 AT24C08,在tq2440上这个型号是 AT24C02A。 它们之间容量不同。地址线也不一样。 S3C2440A RISC 微处理器能够支持一个多主控 IIC 总线串行接口。一条串行数据线(SDA)和一条专用时钟线(SCL) 连接到 IIC 总线的总线主控和外设之间。SDA 和 SCL 线都为双向的。都连接到GPE14(SCL) GPE15(SDA)。 为了控制多主控 IIC 总线操作,必须写入值到下面寄存器中: – 多主控 IIC 总线控制寄存器,IICCON – 多主控
[单片机]
<font color='red'>s3c2440</font>的IIC控制
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved