分类:
2011-03-22 11:34:33
1. 平台无关:
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,
};
static const struct file_operations rtc_proc_fops = {
.open = rtc_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = rtc_proc_release,
};
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),
{ },
};
出去平台无关部分之外,Makefile剩下的大部分内容都是平台相关文件的依赖关系。因为对s3c2440熟悉一些,所以对rtc-s3c.c进行分析。
这个文件比较重要,完成了以下3个任务:
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。
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驱动模块工作的实际起始地点,下一篇日志里对其流程进行分析。
从 module_init(s3c_rtc_init); 可以看出,rtc驱动模块的入口就在这里,s3c_rtc_init,该函数很简单:
return platform_driver_register(&s3c2410_rtc_driver);
即注册rtc对应的platform_driver。