【Linux驱动开发】RTC 驱动实验

一、简介

  • RTC 设备驱动是标准的字符设备驱动,应用程序通过 openreleasereadwrite ioctl 等函数完成对 RTC 设备的操作。
  • Linux 内核将 RTC 设备抽象为 rtc_device 结构体,RTC 设备驱动申请并初始化 rtc_device,将 rtc_device 注册到内核
  • RTC 设备的操作肯定是用一个操作集合(结构体)来表示的,rtc_device 结构体,此结构体定义在 include/linux/rtc.h 文件中。
  • drivers/rtc/rtc-dev.c Linux 内核提供的 RTC 通用字符设备驱动文件。
【Linux驱动开发】RTC 驱动实验_第1张图片 Linux RTC 驱动调用流程
注册  rtc_device
struct rtc_device * rtc_device_register (const char *name, struct device *dev,
const struct rtc_class_ops *ops, struct module *owner)
name :设备名字。
dev 设备。
ops RTC 底层驱动函数集。
owner :驱动模块拥有者。
返回值: 注册成功的话就返回 rtc_device ,错误的话会返回一个负值。
注销 rtc_device
void rtc_device_unregister (struct rtc_device *rtc)
rtc :要删除的 rtc_device
返回值: 无。
注册 rtc_device
 
devm_rtc_device_register
注销 rtc_device
devm_rtc_device_unregister

 

二、I.MX6U 内部 RTC 驱动分析

  • RTC 底层驱动集为 snvs_rtc_ops。snvs_rtc_ops操作集包含了读取/设置RTC时间,读取/设置闹钟等函数。
  • imx6ull.dtsi,设备节点名为 snvs_rtc。compatible 的值为“fsl,sec-v4.0-mon-rtc-lp”,驱动文件为 drivers/rtc/rtc-snvs.c。
  • 设备树 ID 表,compatible 属性,值为“fsl,sec-v4.0-mon-rtc-lp”, imx6ull.dtsi 中的 snvs_rtc 设备节点会和此驱动匹配。 
  • 当设备和驱动匹配成功以后 snvs_rtc_probe 函数就会执行。
  • platform_get_resource 函数从设备树中获取到 RTC 外设寄存器基地址。
  • devm_ioremap_resource 完成内存映射,得到 RTC 外设寄存器物理基地址对应的虚拟地址。
  • devm_regmap_init_mmio 函数将 RTC 的硬件寄存器转化为 regmap 形式。
  • snvs_rtc_enable 函数使能 RTC,此函数会设置 RTC_LPCR 寄存器。
  • devm_request_irq函数请求RTC中断。
  • snvs_rtc_irq_handler为中断服务函数,用于 RTC 闹钟中断。
  • snvs_rtc_read_time 函数用于读取 RTC 时间值。
  • rtc_read_lp_counter 获取 RTC 计数值,这个时间值是秒数。
  • rtc_time_to_tm 函数将获取到的秒数转换为时间值。
  • rtc_read_lp_counter 函数,此函数用于读取 RTC 计数值。
 

三、RTC 时间查看与设置

1、时间 RTC 查看

  • Linux 内核在启动的时候将 snvs_rtc 设置为 rtc0。
  • Linux 内核启动的时候可以看到系统时钟设置信息:

【Linux驱动开发】RTC 驱动实验_第2张图片

使用“date”命令查看时间:

 

2、设置 RTC 时间

date -s "2020-05-31 14:30:00"        //设置当前系统时间
hwclock -w                            //将当前系统时间写入到 RTC 里面

你可能感兴趣的:(#,Linux驱动开发)