linux rtc 分析,linux rtc驱动分析1

这是我阅读的第一个linux驱动程序,断断续续看了快2个礼拜了,现在把理解的框架写下来。

首先,看了下driver/rtc目录下的Makefile,应该分为两部分吧:一是平台无关的,二是平台相关的

1. 平台无关:

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

这里涉及到这么几个源文件:

rtc-lib.c:提供一些辅助函数,闰年计算,日期有效性验证之类的

hctosys.c:只提供了一个函数,rtc_hctosys,在启动时初始化系统时间

class.c:这个文件比较重要,包括很多重要的函数

interface.c:对rtc的操作都被封装起来,包括读写时间,设置定时器,设置中断等,还包括   rtc_class_open,rtc_class_close两个函数

rtc_dev.c:完成rtc在设备文件层面的实现,rtc是以字符设备的形式实现的,这个文件主要是实现了字符设备对应的操作集:

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,

};

rtc-proc.c:实现对proc文件系统的支持,实现操作集rtc_proc_fops:

static const struct file_operations rtc_proc_fops = {

.open  = rtc_proc_open,

.read  = seq_read,

.llseek  = seq_lseek,

.release = rtc_proc_release,

};

rtc-sysfs.c:实现对sysfs的支持,实现属性集rtc_attrs:

static struct device_attribute rtc_attrs[] = {

__ATTR(name, S_IRUGO, rtc_sysfs_show_name, NULL),

__ATTR(date, S_IRUGO, rtc_sysfs_show_date, NULL),

__ATTR(time, S_IRUGO, rtc_sysfs_show_time, NULL),

__ATTR(since_epoch, S_IRUGO, rtc_sysfs_show_since_epoch, NULL),

__ATTR(max_user_freq, S_IRUGO | S_IWUSR, rtc_sysfs_show_max_user_freq,

rtc_sysfs_set_max_user_freq),

__ATTR(hctosys, S_IRUGO, rtc_sysfs_show_hctosys, NULL),

{ },

};

2. 平台相关:

出去平台无关部分之外,Makefile剩下的大部分内容都是平台相关文件的依赖关系。因为对s3c2440熟悉一些,所以对rtc-s3c.c进行分析。

这个文件比较重要,完成了以下3个任务:实现对s3c平台上rtc的操作集:

static const struct rtc_class_ops s3c_rtcops = {

.open  = s3c_rtc_open,

.release = s3c_rtc_release,

.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,

};

到这里可以发现,rtc的操作集是由3个层次来实现的:首先,rtc-s3c.c中实现了基于平台的操作集s3c_rtcops;之后,interface.c将这些函数封装成平台无关的一系列函数;最后,rtc-dev.c基于interface.c提供的平台无关函数,实现了rtc所对应的字符型设备的操作集rtc_dev_fops。

实现rtc对应的platform_driver

static struct platform_driver s3c2410_rtc_driver = {

.probe  = s3c_rtc_probe,

.remove  = __devexit_p(s3c_rtc_remove),

.suspend = s3c_rtc_suspend,

.resume  = s3c_rtc_resume,

.driver  = {

.name = "s3c2410-rtc",

.owner = THIS_MODULE,

},

};

这里边probe比较重要,是rtc驱动模块工作的实际起始地点,下一篇日志里对其流程进行分析。

实现rtc驱动模块的入口

从 module_init(s3c_rtc_init);    可以看出,rtc驱动模块的入口就在这里,s3c_rtc_init,该函数很简单:

return platform_driver_register(&s3c2410_rtc_driver);

即注册rtc对应的platform_driver。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值