s3c6410的RTC在linux中的驱动(1)

发布者:PeacefulSoul最新更新时间:2022-06-14 来源: eefocus关键字:s3c6410  RTC  linux  驱动 手机看文章 扫描二维码
随时随地手机看文章

如果对RTC硬件不熟悉的话,可以看上面这篇博客,讲述了硬件有关的内容。


1、先从整体上做些分析,大致看了下linux2.6.28driversrtc文件中的kconfig和Makefile文件,在Makefile文件中有如下内容:


ifeq ($(CONFIG_RTC_DEBUG),y)

EXTRA_CFLAGS  += -DDEBUG

endif


obj-$(CONFIG_RTC_LIB) += rtc-lib.o

obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o

obj-$(CONFIG_RTC_CLASS) += rtc-core.o

rtc-core-y := class.o interface.o


rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o

rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o

rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o


下面这些是对应的具体的实现,根据自己的情况进行选择。


obj-$(CONFIG_RTC_DRV_RX8581)+= rtc-rx8581.o

obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o

obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o

obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o


应该能从中看出,rtc的驱动大致和那些文件有关,再看对应的kconfig文件,可以看出对应文件的用途,我们就不列出对应的kconfig文件了,因为内容太多了。


2、现在的RTC驱动架构,当然看一下Rtc.txt (linux2.6.28documentation)文件,对我们理解此架构是很有帮助的,列出部分:

New portable "RTC Class" drivers:  /dev/rtcN

--------------------------------------------

Because Linux supports many non-ACPI and non-PC platforms, some of which have more than one RTC style clock, it needed a more portable solution than expecting a single battery-backed MC146818 clone on every system. Accordingly, a new "RTC Class" framework has been defined.讲述了新架构建立的原因。


   It offers three different userspace interfaces:讲述了与用户空间的三种接口

    * /dev/rtcN ... much the same as the older /dev/rtc interface

    * /sys/class/rtc/rtcN ... sysfs attributes support readonly access to some RTC attributes.

    * /proc/driver/rtc ... the first RTC (rtc0) may expose itself using a procfs interface.  More information is (currently) shown here than through sysfs.



   The RTC Class framework supports a wide variety of RTCs, ranging from those integrated into embeddable system-on-chip (SOC) processors to discrete chips using I2C, SPI, or some other bus to communicate with the host CPU.  There's even support for PC-style RTCs ... including the features exposed on newer PCs through ACPI.


这种分类的架构,支持更广阔的RTC设备。

   The new framework also removes the "one RTC per system" restriction. For example, maybe the low-power battery-backed RTC is a discrete I2C chip, but a high functionality RTC is integrated into the SOC.  That system might read the system clock from the discrete RTC, but use the integrated one for all other tasks, because of its greater functionality.

   The ioctl() calls supported by /dev/rtc are also supported by the RTC class framework. However, because the chips and systems are not standardized, some PC/AT functionality might not be provided.  And in the same way, some newer features -- including those enabled by ACPI -- are exposed by the RTC class framework, but can't be supported by the older driver.


3、有关文件的作用


与RTC核心有关的文件有:

(1)、/drivers/rtc/class.c 这个文件向linux设备驱动模型核心注册了一个RTC类,然后向具体的驱动程序提供了rtc_device_register用于注册和rtc_device_unregister用于注销设备。还实现的rtc类设备的注册。


列出部分源码:


static int __init rtc_init(void)

{

rtc_class = class_create(THIS_MODULE, "rtc");

if (IS_ERR(rtc_class)) {

printk(KERN_ERR "%s: couldn't create classn", __FILE__);

return PTR_ERR(rtc_class);

}

rtc_class->suspend = rtc_suspend;

rtc_class->resume = rtc_resume;

rtc_dev_init();

rtc_sysfs_init(rtc_class);

return 0;

}

static void __exit rtc_exit(void)

{

rtc_dev_exit();

class_destroy(rtc_class);

}


subsys_initcall(rtc_init);

module_exit(rtc_exit);

   (2)、/drivers/rtc/rtc-dev.c     这个文件定义了顶层基本的字符设备文件操作函数,如:open,read等,有个结构体,如下所示:


static const struct file_operations rtc_dev_fops = {

.owner  = THIS_MODULE,

.llseek  = no_llseek,

.read = rtc_dev_read,

.poll = rtc_dev_poll,

.unlocked_ioctl= rtc_dev_ioctl,

.open = rtc_dev_open,

.release  = rtc_dev_release,

.fasync  = rtc_dev_fasync,

};此结构体用于字符设备注册是使用。

    (3)、/drivers/rtc/interface.c     这个文件主要提供了用户程序与RTC驱动的接口函数,用户程序一般通过ioctl与RTC驱动交互,这里定义了每个ioctl命令需要调用的函数。看函数名,也能猜出大概:


EXPORT_SYMBOL_GPL(rtc_set_time);


EXPORT_SYMBOL_GPL(rtc_read_alarm);



    (4)、/drivers/rtc/rtc-sysfs.c     看名字就很清楚,与sysfs有关,看注释:


/*

 * RTC subsystem, sysfs interface

 */

    (5)、/drivers/rtc/rtc-proc.c      与proc文件系统有关,同样:


/*

 * RTC subsystem, proc interface

 */


        (6)、/drivers/rtc/rtc-lib.c   主要和时间转化有关,列出一个函数,看函数名就能看出大概,


int rtc_year_days(unsigned int day, unsigned int month, unsigned int year)

{

return rtc_ydays[LEAP_YEAR(year)][month] + day-1;

}


    (7)、/drivers/rtc/hctosys.c    和系统时钟有关,就一个函数,


/*

 * RTC subsystem, initialize system time on startup

 */


static int __init rtc_hctosys(void)



    (8)、/include/linux/rtc.h         定义了与RTC有关的数据结构,如下所示:


structrtc_class_ops { 用于具体设备的驱动接口

int (*open)(struct device *);

void (*release)(struct device *);

int (*ioctl)(struct device *, unsigned int, unsigned long);

int (*read_time)(struct device *, struct rtc_time *);

int (*set_time)(struct device *, struct rtc_time *);

int (*read_alarm)(struct device *, struct rtc_wkalrm *);

int (*set_alarm)(struct device *, struct rtc_wkalrm *);

int (*proc)(struct device *, struct seq_file *);

int (*set_mmss)(struct device *, unsigned long secs);

int (*irq_set_state)(struct device *, int enabled);

int (*irq_set_freq)(struct device *, int freq);

int (*read_callback)(struct device *, int data);

};

struct rtc_device

{

struct device dev;

struct module *owner;



int id;

char name[RTC_DEVICE_NAME_SIZE];



const struct rtc_class_ops *ops;

struct mutex ops_lock;



struct cdev char_dev;

unsigned long flags;



unsigned long irq_data;

spinlock_t irq_lock;

wait_queue_head_t irq_queue;

struct fasync_struct *async_queue;



struct rtc_task *irq_task;

spinlock_t irq_task_lock;

int irq_freq;

int max_user_freq;

#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL

struct work_struct uie_task;

struct timer_list uie_timer;

/* Those fields are protected by rtc->irq_lock */

unsigned int oldsecs;

unsigned int irq_active:1;

unsigned int stop_uie_polling:1;

unsigned int uie_task_active:1;

unsigned int uie_timer_active:1;

#endif

};


  4、因为主要关心的是三星架构的s3c6410的RTC,与之有关的文件是Rtc-s3c.c (linux2.6.28driversrtc)。这个文件实现了具体rtc设备的驱动。同样rtc设备在系统中也作为平台设备存在,所以这个文件中也包含了平台设备相关的内容。如下所示:


提供给上层的驱动函数。


static const struct rtc_class_ops s3c_rtcops = {

.open = s3c_rtc_open,

.release  = s3c_rtc_release,

.ioctl  = s3c_rtc_ioctl,

.read_time  = s3c_rtc_gettime,

.set_time  = s3c_rtc_settime,

.read_alarm  = s3c_rtc_getalarm,

.set_alarm  = s3c_rtc_setalarm,

.irq_set_freq  = s3c_rtc_setfreq,

.irq_set_state= s3c_rtc_setpie,

.proc        = s3c_rtc_proc,

};


平台相关:


static struct platform_driver s3c2410_rtc_driver = {

.probe  = s3c_rtc_probe,

.remove  = s3c_rtc_remove,

.suspend  = s3c_rtc_suspend,

.resume  = s3c_rtc_resume,

.driver  = {

.name = "s3c2410-rtc",

.owner  = THIS_MODULE,

},

};

static char __initdata banner[] = "S3C24XX RTC, (c) 2004,2006 Simtec Electronicsn";

static int __init s3c_rtc_init(void)

{

printk(banner);

return platform_driver_register(&s3c2410_rtc_driver);

}

static void __exit s3c_rtc_exit(void)

{

platform_driver_unregister(&s3c2410_rtc_driver);

}

module_init(s3c_rtc_init);

module_exit(s3c_rtc_exit);

关键字:s3c6410  RTC  linux  驱动 引用地址:s3c6410的RTC在linux中的驱动(1)

上一篇:s3c6410的RTC在linux中的驱动(2)
下一篇:linux下的nandflash驱动分析(3)——基于s3c6410平台

推荐阅读最新更新时间:2024-11-08 13:23

LED驱动调试简介
1、芯片发热 这主要针对内置电源调制器的高压驱动芯片.假如芯片消耗的电流为2mA,300V的电压加在芯片上面,芯片的功耗为0.6W,当然会引起芯片的发热.驱动芯片的最大电流来自于驱动功率mos管的消耗,简单的计算公式为I=cvf(考虑充电的电阻效益,实际I=2cvf),其中c为功率MOS管的cgs电容,v为功率管导通时的gate电压,所以为了降低芯片的功耗,必须想办法降低c、v和f.如果c、v和f不能改变,那么请想办法将芯片的功耗分到芯片外的器件,注意不要引入额外的功耗.再简单一点,就是考虑更好的散热吧. 2、功率管发热 关于这个问题,也见到过有人在本区发过贴.功率管的功耗分成两部分,开关损耗和导通损耗.要注意,大多数场合特
[电源管理]
基于STM32CUBEMX驱动TMOS模块STHS34PF80(3)----修改检测阈值
概述 用于配置和设置 STHS34PF80 传感器的一些参数,以便进行存在检测和运动检测。 样品申请 https://www.wjx.top/vm/OhcKxJk.aspx# 视频教程 https://www.bilibili.com/video/BV1Qm4y1p79X/ 完整代码下载 https://download.csdn.net/download/qq_24312945/88216813 参考程序初始化 相对于驱动人体检测demo,新的案例设置了传感器的存在和运动相关的阈值、滞后和中断配置,以实现存在检测和运动检测的功能,并在相关事件发生时触发中断。 省电模式 下面文本描述了关机模式的使用和功能。关机模式是一种休眠
[单片机]
基于STM32CUBEMX<font color='red'>驱动</font>TMOS模块STHS34PF80(3)----修改检测阈值
LinkSwitch-PH系列LED驱动器IC【Power Integrations】
ower Integrations推出多款适用于通用照明的全新LinkSwitch-PH系列LED驱动器IC。其新器件的效率最高可达88%;可减少电源设计使用的元件数。 美国加利福尼亚州圣何塞,2011年1月25日讯 – Power Integrations公司今日宣布为其广受欢迎的LinkSwitch-PH产品系列再添七款全新LED驱动器IC。新器件(LNK413-LNK419)专门针对对高效率和系统使用寿命有突出要求的工业及商业应用而设计,它们适用于从3 W灯泡到55 W荧光灯替换灯的照明应用。新器件的效率最高可达88%,它采用一个PWM调光单级控制器,兼具功率因数校正(PFC)功能和精确的恒流(CC)电源转
[电源管理]
LinkSwitch-PH系列LED<font color='red'>驱动</font>器IC【Power Integrations】
大联大世平集团推出基于Toshiba产品的电机驱动解决方案
针对节能减排全球化趋势,世平集团推出NXP、Toshiba 微处理器直流无刷电机控制方案,旨在提供更加快速、简便、高精度和高灵活度的电机控制方案。 节能减排的议题在全球各国不断受到重视,对于普通消费者来说,节能减排无非就是随手关闭电源,或搭公车低碳出行,以便减少资源浪费实现资源再利用, 但还有一个重要问题就是如何提高能源使用效率。美国 EPRI 就曾指出,全球电机所耗费的金额一年高达 950 亿美金,占所有电力 51%。 无论是工业、家庭还是商业用电,电机消耗的能源都占有很高比例。如果改善电机系统的输出、输入功率比,就可以提高用电效率。而无刷直流电机 具有高效节能、控制特性好、可靠性高、寿命长、噪音低等优点,正在越来越多
[工业控制]
设计指南Q&A系列:数模转换器
  数模转换器的作用   真实世界的模拟信号,例如温度、压力、声音或者图像等,被不断转换成更容易储存、处理和发射的数字形式。但是在很多系统中,数字信息也必须重新转换成模拟信号来实现一些真实世界的功能。数模转换器(DAC)就可以做到这一点,而且它们的输出还可以用来驱动各种设备,例如扩音器、发动机、射频发射器和温度控制器等。   DAC一般被放置在数字系统中。在数字系统中,一些真实世界的信号通过模数转换器(ADC)数字化和处理过后,然后需要重新转化成模拟信号的系统中。这些系统所要求的DAC性能会受到系统其它组件的性能和要求的影响。   基本原理   DAC会产生一个量化(离散阶段)模拟输出来响应一个二进制数字输入编码。这个数字
[医疗电子]
设计指南Q&A系列:数模转换器
基于PC/104平台嵌入式Linux系统核心定制方法
本文就如何对Linux系统的核心实现定制进行论述,主要内容包括Linux内核部分和文件系统,系统定制的硬件平台是PC/104单片机。之所以将Linux内核定制、文件系统定制单独讨论,是因为在基于任何平台的Linux系统定制过程中,其内核和文件系统的定制工作都具有相似的特征和相似的过程。  在基于PC/104平台的嵌入式Linux研制过程中,进行核心定制的主要目的是从需求出发使系统最大程度地满足应用的需要、最大程度地适应系统硬件平台、最优化地支持系统外围设备和应用程序,并且尽量减少对系统资源的占用、减少系统功耗,增强系统的安全性、稳定性、可靠性,另外使系统真正地实现产权自主化。  内核定制  一般操作系统的内核从体系结构角度可以划分为
[嵌入式]
STM32 RTC日历程序
STM32的RTC只是一个32bit 计数器,没有年月日星期等信息,比起专用RTC芯片那差很远。要实现时间日期功能,要程序实现。记得linux下面的时间也是一个32bit的计数器。一查,原来网上牛人多的是,早已实现。而且用此法实现,非常简单。完全不用考虑什么闰年,大小月等。关键函数mktime,标准函数库函数。 以下程序作者为 jjldc (九九) rtc_time.h #ifndef _RTC_TIME_H_ #define _RTC_TIME_H_ #include time.h extern struct tm Time_ConvUnixToCalendar(time_t t); extern time
[单片机]
编译可加载lcd驱动linux uImage
pc:Centos5.4 内核:linux 3.0.1 开发板:ok6410 交叉编译器:arm-linux-gcc 4.4.1 LCD驱动程序 怎么写LCD驱动程序? 1. 分配一个fb_info结构体: framebuffer_alloc 2. 设置 3. 注册: register_framebuffer 4. 硬件相关的操作 测试: 1. make menuconfig去掉原来的驱动程序 - Device Drivers - Graphics support M S3C LCD framebuffer support 2. make uImage 出现错误:修改/drivers/media/video/samsung/t
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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