rtc 一般负责系统关机后计时、闹钟等,Linux 内核提供了一个 rtc 子系统,来支持所有的 rtc 设备。
rtc 设备本质上是一个字符设备,rtc 子系统在字符设备的基础上抽象与硬件无关的部分,并在这个基础上拓展 sysfs 和 proc 文件系统下的访问。
源码目录
代码语言:javascript复制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
代码语言:javascript复制[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 中断处理函数和闹钟中断处理函数。
代码语言:javascript复制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
软件逻辑就不在这里赘述了,大家可以参考下面链接
代码语言:javascript复制https://jasper1024.com/jasper/c089e4b/
大家多看几个 Linux 子系统就会发现,基本上每个子系统都差不多,Linux 都会封装上中下 3 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。