Linux RTC驱动分析(一)----pcf8563驱动和class.c
本文的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相关推荐
- linux i2c模型 rtc模型 详细分析,Linux RTC驱动分析(一)----pcf8563驱动和class.c
来逐一分析. 看一个设备驱动,一般都从模块初始化和退出函数开始,pcf8563.c的为: static int __init pcf8563_init(void) { return i2c_add_d ...
- Linux spi驱动分析----SPI设备驱动(W25Q32BV)
转载地址:http://blog.chinaunix.net/uid-25445243-id-4026974.html 一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它 ...
- linux 网卡驱动分析,LINUX_网卡驱动分析
LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...
- linux内核组件分析之--设备驱动模型之bus
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起.本节就来看看设备驱动模型中起枢纽作用的bus.本节的头文件 ...
- linux内核部件分析之——设备驱动模型之class
前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...
- linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...
前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...
- linux下camera驱动分析_LINUX设备驱动模型分析之三 驱动模块相关(DRIVER)接口分析...
本系列前几篇文章链接如下: <LINUX设备驱动模型分析之一 总体概念说明> <LINUX设备驱动模型分析之二 总线(BUS)接口分析> 上一章我们分析了bus-driver- ...
- linux pl320 mbox控制器驱动分析-(3) pl320驱动代码分析
linux pl320 mbox控制器驱动分析-(3)pl320驱动代码分析 1 pl320 mbox控制器宏定义 2 初始化接口 3 ipc_handler mbox中断处理函数 4 数据的收发 4 ...
- android 触摸屏驱动分析,Android 触摸屏驱动代码分析(ADC 类型触摸屏 CPU:s3c
Android 2.1 farsight version for s5pc100 File Name: s3c-ts.c 1 简介 1.1 本例基于s5pc100 ...
- 触摸屏驱动分析: (本机驱动)
触摸屏驱动为本机驱动,由微软提供有通用层 MDD,我们只需要编写PDD层就可以了.触摸屏驱动由GWES 加载,GWES 通过MDD层的DDI设备驱动程序接口函数(Device Driver Inter ...
最新文章
- shlve模块 序列化 python任意的数据
- java:输入输出流
- 记录一个需求:折线图,要求指定年份每一天的记录
- java面试题37 关于对象成员占用内存的说法哪个正确?( )
- 小程序消息服务器webapi,小程序订阅消息
- centOS 7下安装与配置heartbeat高可用集群
- 数据结构之查找的概念及简单实现
- VMWare 各版本下载地址
- 外贸人必收藏开发客户、找邮箱等高效工具
- 什么是云渲染?云渲染应用场景有哪些?
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
- jquery打印网页当前页
- 如何实现windows命令提示符的tab补全
- CSMA/CD与CSMA/CA区别
- ubuntu 的 arm 版本及其仿真
- ios状态栏的颜色修改
- 针对好玩游戏物品清单
- 让你的浏览器3D起来
- 解决U盘变为2m大小的问题
- linux下 恢复gho镜像,手动使用ghost恢复win7系统gho镜像包教程
热门文章
- 解锁新姿势:探讨复杂的 if-else 语句“优雅处理”的思路
- SSM药房管理系统 计算机毕设源码42430
- LeetCode 2359. 找到离给定两个节点最近的节点 基环树
- P2359 三素数数(dp)
- 外贸人通过(穷举邮箱+验证邮箱)来挖掘精准客户邮箱
- 智慧消防的现状剖析及发展前景概况
- 部署vue.js项目,第一次进入能够访问界面,刷新界面后报错
- 博客项目(前台功能实现)
- Cacti监控软件安装与应用
- 用Requests和正则表达式爬取猫眼电影(TOP100+最受期待榜)