linux 2.6驱动采用了分层的设计思想。核心层实现了RTC设备的共同操作,而针对不同设备特定的操作放到下层来实现。
针对linux-kernel-2.6.25.8内核版本,ARM-s3c2440。
/drivers/rtc
class.c rtc-dev.c rtc-s3c.c rtc-sysfs.c
对于上述4个文件:
rtc-dev.c实现了RTC的设备核心层,填充了结构体:
static const struct file_operations rtc_dev_fops
并实现了以下5个函数:
void rtc_dev_prepare(struct rtc_device *rtc)
void rtc_dev_add_device(struct rtc_device *rtc)
void rtc_dev_del_device(struct rtc_device *rtc)
void __init rtc_dev_init(void)
void __exit rtc_dev_exit(void)
rtc-s3c.c实现了RTC的具体设备对应的函数,填充了结构体:
static const struct rtc_class_ops s3c_rtcops(此结构体在下面这个结构体里面所引用)
static struct platform_driver s3c2410_rtcdrv
注册了S3C的RTC的 platform_driver 驱动程序。
上述红色部分函数及结构体和rtc-sysfs.c里面实现的文件都在class.c里面的下面2个函数所调用。
static int __init rtc_init(void)
static void __exit rtc_exit(void)
subsys_initcall(rtc_init);
module_exit(rtc_exit);
上面2个函数实现了RTC子系统的内核调用。
而class.c也实现了下面2个函数:
struct rtc_device *rtc_device_register(const char *name, struct device *dev,const struct rtc_class_ops *ops,struct module *owner)
void rtc_device_unregister(struct rtc_device *rtc)
这2个函数在rtc-s3c.c里面调用用于注册rtc设备。