本文的RTC使用I2C接口操作pcf8563,这里针对pcf8563对Linux的RTC框架进行分析。

Linux常见的驱动在driver目录下都有一个文件夹,进入kernel主目录下的drivers/rtc,发现下面包含了许多芯片的RTC驱动,我们这里是以pcf8563为主,她是我们要分析的核心。其他几个相关联的文件分别是:alarm.c、alarm-dev.c、class.c、hctosys.c、interface.c和rtc-dev.c。
        class.c:向linux设备模型核心注册了一个类RTC,提供了RTC子系统的一些公共函数,让各个RTC驱动注册集成到我们的linux内核中,向驱动程序提供了注册/注销接口。
        rtc-dev.c:定义了基本的设备文件操作函数,用户程序与RTC驱动的接口函数,这里定义了每个ioctl命令需要调用的函数,还有open,read等。
        interface.c:提供了ioctl各个命令需要调用的函数。
        rtc-sysfs.c:与sysfs有关,提供通过sys文件系统操作pcf8563。
        rtc-proc.c:与proc文件系统有关,提供通过proc文件系统操作pcf8563。

hctosys.c:系统起来之后会调用到这个文件中的rtc_hctosys()函数,主要功能是系统起来的时候去读RTC硬件中的时间,然后更新我们的系统时间。

rtc.h:定义了与RTC有关的数据结构。

pcf8563.c是最底层的直接和硬件打交道的驱动文件,pcf8563.c上面一层为interface.c,为接口文件,它主要是对pcf8563.c进行封装,给上层提供统一的接口,屏蔽底层差异化。Interface.c再往上就到了rtc-dev.c.,rtc-dev.c最终生成了/dev/rtc设备节点,上层的应用程序就是通过操作此文件来进行RTC相关的设置系统时间和闹钟等操作的。

文件关系图如下:

接下来我们从最底层驱动程序(pcf8563.c)到RTC核心(class.c)来逐一分析。
        看一个设备驱动,一般都从模块初始化和退出函数开始,pcf8563.c的为:
static int __init pcf8563_init(void)
{
    return i2c_add_driver(&pcf8563_driver);
}

static void __exit pcf8563_exit(void)
{
    i2c_del_driver(&pcf8563_driver);
}
        因为pcf8563为I2C接口设备,此处就是添加或者删除I2C设备。接下来看下rtc结构体pcf8563_driver:
static struct i2c_driver pcf8563_driver = {
    .driver        = {
        .name    = "rtc-pcf8563",
    },
    .probe        = pcf8563_probe,
    .remove        = pcf8563_remove,
    .id_table    = pcf8563_id,
};
        I2C设备结构体比较简单,主要就是探测和移除函数,首先看下探测设备函数pcf8563_probe:
static int pcf8563_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
{
    struct pcf8563 *pcf8563;
    int err = 0;
    dev_dbg(&client->dev, "%s\n", __func__);
    if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
        return -ENODEV;
    pcf8563 = kzalloc(sizeof(struct pcf8563), GFP_KERNEL);
    if (!pcf8563)
        return -ENOMEM;
    dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");
    i2c_set_clientdata(client, pcf8563);
    pcf8563->rtc = rtc_device_register(pcf8563_driver.driver.name,
                &client->dev, &pcf8563_rtc_ops, THIS_MODULE);
    if (IS_ERR(pcf8563->rtc)) {
        err = PTR_ERR(pcf8563->rtc);
        goto exit_kfree;
    }
    return 0;
exit_kfree:
    kfree(pcf8563);
    return err;
}
        探测函数比较简单,比较重要的语句为红色标注部分,这里主要涉及到两个部分。
        1、rtc设备注册函数rtc_device_register,此函数完成rtc设备的注册,在后面会重点讲述。
        2、pcf8563_rtc_ops,此结构体定义了操作pcf8563的函数,包括读时间和设置时间等,上层调用的对时间操作就是调用此处的函数,具体如下:
s

Linux RTC驱动分析(一)----pcf8563驱动和class.c相关推荐

  1. linux i2c模型 rtc模型 详细分析,Linux RTC驱动分析(一)----pcf8563驱动和class.c

    来逐一分析. 看一个设备驱动,一般都从模块初始化和退出函数开始,pcf8563.c的为: static int __init pcf8563_init(void) { return i2c_add_d ...

  2. Linux spi驱动分析----SPI设备驱动(W25Q32BV)

    转载地址:http://blog.chinaunix.net/uid-25445243-id-4026974.html 一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它 ...

  3. linux 网卡驱动分析,LINUX_网卡驱动分析

    LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...

  4. linux内核组件分析之--设备驱动模型之bus

    前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起.本节就来看看设备驱动模型中起枢纽作用的bus.本节的头文件 ...

  5. linux内核部件分析之——设备驱动模型之class

    前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...

  6. linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...

    前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...

  7. linux下camera驱动分析_LINUX设备驱动模型分析之三 驱动模块相关(DRIVER)接口分析...

    本系列前几篇文章链接如下: <LINUX设备驱动模型分析之一 总体概念说明> <LINUX设备驱动模型分析之二 总线(BUS)接口分析> 上一章我们分析了bus-driver- ...

  8. linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析

    linux pl320 mbox控制器驱动分析-(3)pl320驱动代码分析 1 pl320 mbox控制器宏定义 2 初始化接口 3 ipc_handler mbox中断处理函数 4 数据的收发 4 ...

  9. android 触摸屏驱动分析,Android 触摸屏驱动代码分析(ADC 类型触摸屏 CPU:s3c

    Android 2.1 farsight version for s5pc100 File Name: s3c-ts.c 1           简介 1.1          本例基于s5pc100 ...

  10. 触摸屏驱动分析: (本机驱动)

    触摸屏驱动为本机驱动,由微软提供有通用层 MDD,我们只需要编写PDD层就可以了.触摸屏驱动由GWES 加载,GWES 通过MDD层的DDI设备驱动程序接口函数(Device Driver Inter ...

最新文章

  1. shlve模块 序列化 python任意的数据
  2. java:输入输出流
  3. 记录一个需求:折线图,要求指定年份每一天的记录
  4. java面试题37 关于对象成员占用内存的说法哪个正确?( )
  5. 小程序消息服务器webapi,小程序订阅消息
  6. centOS 7下安装与配置heartbeat高可用集群
  7. 数据结构之查找的概念及简单实现
  8. VMWare 各版本下载地址
  9. 外贸人必收藏开发客户、找邮箱等高效工具
  10. 什么是云渲染?云渲染应用场景有哪些?
  11. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
  12. jquery打印网页当前页
  13. 如何实现windows命令提示符的tab补全
  14. CSMA/CD与CSMA/CA区别
  15. ubuntu 的 arm 版本及其仿真
  16. ios状态栏的颜色修改
  17. 针对好玩游戏物品清单
  18. 让你的浏览器3D起来
  19. 解决U盘变为2m大小的问题
  20. linux下 恢复gho镜像,手动使用ghost恢复win7系统gho镜像包教程

热门文章

  1. 解锁新姿势:探讨复杂的 if-else 语句“优雅处理”的思路
  2. SSM药房管理系统 计算机毕设源码42430
  3. LeetCode 2359. 找到离给定两个节点最近的节点 基环树
  4. P2359 三素数数(dp)
  5. 外贸人通过(穷举邮箱+验证邮箱)来挖掘精准客户邮箱
  6. 智慧消防的现状剖析及发展前景概况
  7. 部署vue.js项目,第一次进入能够访问界面,刷新界面后报错
  8. 博客项目(前台功能实现)
  9. Cacti监控软件安装与应用
  10. 用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)