Linux RTC 子系统

2024-01-15 12:12:49 浏览数 (2)

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 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。

0 人点赞