Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49360
  • 博文数量: 8
  • 博客积分: 176
  • 博客等级: 入伍新兵
  • 技术积分: 85
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-27 08:58
文章分类

全部博文(8)

文章存档

2016年(1)

2015年(1)

2011年(3)

2009年(3)

我的朋友

分类:

2011-03-22 11:34:33

  这是我阅读的第一个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。

阅读(2176) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:linux rtc驱动2

给主人留下些什么吧!~~