RK3568平台 RTC时间框架

一.RTC时间框架概述

RTC(Real Time Clock)是一种用于计时的模块,可以是再soc内部,也可以是外部模块。对于soc内部的RTC,只需要读取寄存器即可,对于外部模块的RTC,一般需要使用到I2C接口进行读取。至于如何供电,都是可以在主电源断开后使用纽扣电源辅助供电,达到设备断电仍然可以计时的效果。

对于soc内部的RTC,需要额外的晶振,而外部模块的RTC不需要。

在linux内核里,rtc是一个字符设备,内核实现了一个通用的字符设备层,提供给应用层系统调用,给底下的RTC硬件驱动层提供注册接口。每款RTC需要编写对应的硬件驱动,填写读取和设置时间的回调函数,并且注册进系统。从上到下分别是应用层、rtc通用字符设备层、rtc底层驱动层。

Linux 内核中,RTC 驱动的结构图如下所示, 可以分为三个层次:

接口层,负责向用户空间提供操作的结点以及相关接口。
• RTC Core, 为rtc 驱动提供了一套API, 完成设备和驱动的注册等。
• RTC 驱动层,负责具体的RTC 驱动实现,如设置时间、闹钟等设置寄存器的操作。

二.RTC设备驱动

申请rtc_device,RTC注册函数:

struct rtc_device *devm_rtc_device_register(struct device *dev,  const char *name, const struct rtc_class_ops *ops,  struct module *owner)

这个接口会自动帮你从设备树的aliases节点获取rtcx的序号,如果没有填写就自动分配一个序号。

注销rtc_device,RTC注销函数:

void devm_rtc_device_unregister(struct device *dev,  struct rtc_device *rtc)

内核RTC框架提供了3中数据结构:

struct rtc_time、struct rtc_device和struct rtc_device_ops结构,其定义如下:

struct rtc_time {int tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year/*从1900开始*/;int tm_wday, tm_yday, tm_isdst/*夏令时标志*/;
};struct rtc_device {struct device dev;struct module *owner;int id; // 由内核提供给rtc设备的全局索引,/dev/rtc<id>char name[RTC_DEVICE_NAME_SIZE];const struct rtc_class_ops *ops; // 一组操作,例如 设置/读取 时间/闹钟struct mutex ops_lock;struct cdev char_dev;ulong flags;ulong irq_data;spinlock_t irq_lock;wait_queue_head_t irq_queue;struct rtc_task *irq_task;spinlock_t irq_task_lock;int irq_freq;int max_user_freq;struct work_struct irqwork;
};struct rtc_class_ops {int (*open)(struct device *dev); // 用户在设备/dev/rtc1上调用read时的callbackint (*release)(struct device *dev);// 用户在设备/dev/rtc1上调用close时的callbackint (*ioctl)(struct device *dev, uint cmd, ulong arg); // 用户在设备/dev/rtc1上调用ioctl时的callbackint (*read_time)(struct device *dev, struct rtc_time *tm); // rtc内核的回调函数int (*set_time)(struct device *dev, struct rtc_time *tm);int (*read_alarm)(struct device *dev, struct rtc_wkalrm *alarm);int (*set_alarm)(struct device *dev, struct rtc_wkalrm *alarm);int (*read_callback)(struct device *dev, int data); // 用户在设备/dev/rtc1上调用read时的callbackint (*alarm_irq_enable)(struct device *dev, uint enabled);
};// rtc模块提供了宏to_rtc_device(d)把 struct device结构转变为struct rtc_device{}结构

读取和设置时间 :

驱动程序负责提供读取和设置设备时间的函数。RTC总是以二进制编码的格式存储/恢复时间,其中每个4位表示0~9而非0~F,内核提供bcd2bin()和bin2bcd()两个转换的宏。提供辅助函数rtc_valid_tm(struct rtm_time *)用于确定struct rtc_time{}表示合法的时间。

函数使用示例:

static int foo_rtc_read_time(struct device *dev, struct rtc_time *tm) {struct foo_regs regs;int error = foo_device_read(dev, &regs, 0, sizeof(regs));if (error) return error;tm->tm_sec = bcd2bin(regs.seconds);tm->tm_min = bcd2bin(regs.minutes);tm->tm_hour = bcd2bin(regs.cent_hours);tm->tm_mday = bcd2bin(regs.date);tm->tm_wday = bcd2bin(regs.day) - 1;tm->tm_mon = bcd2bin(regs.month) - 1;tm->tm_year = bcd2bin(regs.years) + 100; // 设备的epoch是2000,加回到1900return rtc_valid_tm(tm);
}static int foo_rtc_set_time(struct device *dev, struct rtc_time *tm) {struct foo_regs regs;regs.seconds = bin2bcd(tm->tm_sec);regs.minutes = bin2bcd(tm->tm_min);regs.cent_hours = bin2bcd(tm->tm_hour);regs.day = bin2bcd(tm->tm_wday + 1);regs.date = bin2bcd(tm->tm_mday);regs.month = bin2bcd(tm->tm_mon + 1);regs.cent_hours |= BQ32K_CENT;regs.years = bin2bcd(tm->tm_year % 100);return write_into_device(dev, &regs, 0, sizeof(regs));
}

三.RTC用户空间

 rtc在sys中拥有一个类,可以查看一些信息。

  • name 查看rtc型号

  • range 查看rtc支持的起始时间和结束时间

  • date 查看rtc当前日期

  • time 查看rtc当前时间

  • since_epoch 查看当前rtc时间距离epoch经历了多少秒,epoch是一个时间点1970 年 1 月 1 日凌晨零点零分零秒

  • hctosys 这个rtc是否在上电时候同步设置系统时间

  • max_user_freq 可读可写用于查看和设置RTC周期中断的最大频率,一般是1hz

  • offset 查看和设置当前的rtc校准精度的偏移值,和回调read_offset、set_offset有关,注意是ppb为单位,而且是可正可负

  • wakealarm 查看和设置闹钟时间,有的rtc会被隐藏起来这个属性,sys属性如何隐藏可以参考rtc_attr_group、rtc_attr_is_visible、rtc_does_wakealarm这三个。

在注册rtc驱动的时候,会自动在proc注册一个文件/proc/driver/rtc,此文件只可以读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/495542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

Eslint在Vscode中使用技巧的相关技巧

ps :该文章会详细结论构建一个脚手架遇到的问题&#xff0c;会持续更新&#xff0c;请定时查看 Eslint相关​ 在vscode中使用eslint插件 在vscode中用户配置没有开启eslint.enable 在vscode中工作区配置开启eslint.enable settings.json中没有做eslint相关配置 在编写的vue…

历史新知网:寄快递寄个电脑显示器要多少钱?

以下文字信息由&#xff08;新史知识网&#xff09;编辑整理发布。 让我们赶紧来看看吧&#xff01; 问题1&#xff1a;快递寄电脑显示器要多少钱&#xff1f; 此物有多重&#xff1f; 顺丰寄就可以了&#xff0c;但是必须是原包装的&#xff0c;不然不好寄。 问题2&#xff1…

智慧城市建设的新里程碑:公共服务电子支付大屏

随着科技的飞速发展&#xff0c;我们的生活正在经历前所未有的变革。电子支付的出现&#xff0c;无疑是这场变革中的一大亮点&#xff0c;它不仅改变了我们日常的支付方式&#xff0c;更成为智慧城市建设的重要一环&#xff0c;为公众提供了更加便捷、高效的服务体验。 在以前&…

计算机网络实验一 ENSP模拟器使用

实验一 eNSP模拟器的使用 学习目标&#xff1a; 1&#xff09;掌握eNSP模拟器的基本设置方法 2&#xff09;掌握使用eNSP搭建简单的端到端&#xff08;主机&#xff09;网络的方法 3&#xff09;掌握在eNSP中使用wireshark捕获IP报文的方法 4&#xff09;掌握设备的基本配置方…

Redis String 类型底层揭秘

目录 前言 String 类型低层数据结构 节省内存的数据结构 前言 Redis 的 string 是个 “万金油” &#xff0c;这么评价它不为过. 它可以保存Long 类型整数&#xff0c;字符串&#xff0c; 甚至二进制也可以保存。对于key&#xff0c;value 这样的单值&#xff0c;查询以及插…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

面试题 16.15. 珠玑妙算

1&#xff1a;题目 2.思路分析 1.首先malloc开辟的数组&#xff0c;将其中的元素的值为零&#xff0c;方便之后的统计次数 2.先统计猜中的&#xff0c;当猜中时&#xff0c;solution[i]guess[i]时&#xff0c;为让防止之后统计之后伪猜中时重复的&#xff0c;要将值改变&…

Linux下的IO多路复用

文章目录 一. IO的概念和分类1. IO操作的原理&#xff1a;二. I/O多路复用使用场景和作用1. 问题&#xff1a; 一台网络服务器需要接收100台客户端的连接和数据通信&#xff0c;应该如何设计和实现&#xff1f;2. I/O多路复用机制&#xff1a; 三. Select poll epollselectpoll…

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展&#xff0c;旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分&#xff0c;其形式更加多元化智能化。智能导览系统作为一种新的服务方式&#xff0c;能够为游客提供更加便捷的旅游服务和游览体验&#xff0c;也逐渐…

精品基于SpringBoot的体育馆场地预约赛事管理系统的设计与实现-选座

《[含文档PPT源码等]精品基于SpringBoot的体育馆管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#…

3D工业相机及品牌集合

3D相机可以获取物理世界的空间信息&#xff0c;即立体三维的物理信息&#xff0c;不仅可以拍摄到场景的二维图像&#xff0c;而且能获取物体之间的位置关系&#xff0c;再经过进一步深化处理&#xff0c;还能完成三维建模等应用。 3D相机三种方案 1、结构光 通常采用特定波长…