Linux RTC 子系统

发布时间:2024年01月24日

rtc 一般负责系统关机后计时、闹钟等,Linux 内核提供了一个 rtc 子系统,来支持所有的 rtc 设备。

rtc 设备本质上是一个字符设备,rtc 子系统在字符设备的基础上抽象与硬件无关的部分,并在这个基础上拓展 sysfs 和 proc 文件系统下的访问。

源码目录

kernel-6.1/drivers/rtc/class.c
kernel-6.1/drivers/rtc/dev.c
kernel-6.1/drivers/rtc/interface.c
kernel-6.1/drivers/rtc/lib.c
kernel-6.1/drivers/rtc/nvmem.c
kernel-6.1/drivers/rtc/proc.c
kernel-6.1/drivers/rtc/sysfs.c
kernel-6.1/drivers/rtc/rtc-xxx.c
  • class.c:向内核注册 RTC 类,为底层驱动提供 register 与 unregister 接口用于 RTC 设备的注册/注销。初始化 RTC 设备结构、sysfs、proc
  • interface.c:提供用户程序与 RTC 的接口函数
  • dev.c:将 RTC 设备抽象为通用的字符设备,提供文件操作函数集
  • sysfs.c:管理 RTC 设备的 sysfs 属性,获取 RTC 设备名、日期、时间等
  • proc.c:管理 RTC 设备的 procfs 属性,提供中断状态和标志查询
  • lib.c:提供 RTC、Data 和 Time 之间的转换函数
  • rtc-xxx.c:各平台 RTC 设备的实际驱动
  • rtc.h:定义与 RTC 有关的数据结构

RK3399

以博主手边的 RK3399 为例,RTC 驱动在 /kernel/drivers/rtc/rtc-rx8010.c,生成的设备节点是 /dev/rtc0

开机 log

[1.578141] rk808-rtc rk808-rtc: rtc core: registered rk808-rtc as rtc0
[2.663991] rk808-rtc rk808-rtc: setting system clock to 2022-12-04 11:16:23 UTC (1670152583)

生成节点

rtc-rx8010.c

rtc 这个模块比较简单,实现的函数也少,总共才 400 行。主要是设置时间、获取时间、设置闹钟、读闹钟,以及 rtc 中断处理函数和闹钟中断处理函数。

rx8010_alarm_irq_enable
rx8010_get_time
rx8010_init
rx8010_ioctl
rx8010_irq_1_handler
rx8010_probe
rx8010_read_alarm
rx8010_set_alarm
rx8010_set_time

大家多看几个 Linux 子系统就会发现,基本上每个子系统都差不多,Linux 都会封装上中下 3 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。

粉丝福利, 免费领取C/C++ 开发学习资料包、技术视频/代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

文章来源:https://blog.csdn.net/m0_60259116/article/details/135825664
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。