Linux驱动分析之RTC框架

简介: 当Linux内核启动时,它会从RTC中读取时间与日期,作为基准值。然后通过软件来维护系统时间和日期。Linux系统中提供了RTC核心层,对于驱动开发者而言,操作起来就变得很简单了。我们来看看整体框架。

前言

当Linux内核启动时,它会从RTC中读取时间与日期,作为基准值。然后通过软件来维护系统时间和日期。Linux系统中提供了RTC核心层,对于驱动开发者而言,操作起来就变得很简单了。我们来看看整体框架。


驱动框架

下面是整体框架图

640.png

与RTC核心有关的文件有:

文件

描述

/drivers/rtc/class.c

这个文件向linux设备模型核心注册了一个类RTC,然后向驱动程序提供了注册/注销接口

/drivers/rtc/rtc-dev.c

这个文件定义了基本的设备文件操作函数,如:open,read等

/drivers/rtc/interface.c

这个文件主要提供了用户程序与RTC驱动的接口函数,用户程序一般通过ioctl与RTC驱动交互,这里定义了每个ioctl命令需要调用的函数

/drivers/rtc/rtc-sysfs.c

与sysfs有关

/drivers/rtc/rtc-proc.c

与proc文件系统有关

/include/linux/rtc.h

定义了与RTC有关的数据结构



重要结构体

  • rtc_device
//RTC设备structrtc_device {
structdevicedev;
structmodule*owner;
intid;
conststructrtc_class_ops*ops; //rtc操作函数structmutexops_lock;
structcdevchar_dev;
unsignedlongflags;
unsignedlongirq_data;
spinlock_tirq_lock;
wait_queue_head_tirq_queue;
structfasync_struct*async_queue;
intirq_freq;
intmax_user_freq;
structtimerqueue_headtimerqueue;
structrtc_timeraie_timer; 
structrtc_timeruie_rtctimer;
structhrtimerpie_timer; /* sub second exp, so needs hrtimer */intpie_enabled;
structwork_structirqwork;
/* Some hardware can't support UIE mode */intuie_unsupported;
longset_offset_nsec;
boolregistered;
structnvmem_device*nvmem;
/* Old ABI support */boolnvram_old_abi;
structbin_attribute*nvram;
time64_trange_min;
timeu64_trange_max;
time64_tstart_secs;
time64_toffset_secs;
boolset_start_time;
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMULstructwork_structuie_task;
structtimer_listuie_timer;
/* Those fields are protected by rtc->irq_lock */unsignedintoldsecs;
unsignedintuie_irq_active:1;
unsignedintstop_uie_polling:1;
unsignedintuie_task_active:1;
unsignedintuie_timer_active:1;
#endif};

上面的结构体表示一个RTC设备,比较简单,主要就是中断信息,字符设备对象,操作函数等。


  • rtc_class_ops
//RTC操作函数structrtc_class_ops {
int (*ioctl)(structdevice*, unsignedint, unsignedlong);
int (*read_time)(structdevice*, structrtc_time*);
int (*set_time)(structdevice*, structrtc_time*);
int (*read_alarm)(structdevice*, structrtc_wkalrm*);
int (*set_alarm)(structdevice*, structrtc_wkalrm*);
int (*proc)(structdevice*, structseq_file*);
int (*set_mmss64)(structdevice*, time64_tsecs);
int (*set_mmss)(structdevice*, unsignedlongsecs);
int (*read_callback)(structdevice*, intdata);
int (*alarm_irq_enable)(structdevice*, unsignedintenabled);
int (*read_offset)(structdevice*, long*offset);
int (*set_offset)(structdevice*, longoffset);
};

就是一些设置时间和读取时间,以及闹钟等接口函数。


  • rtc_time
//时间结构体structrtc_time {
inttm_sec;
inttm_min;
inttm_hour;
inttm_mday;
inttm_mon;
inttm_year;
inttm_wday;
inttm_yday;
inttm_isdst;
};


API函数

// 注册RTC classstaticstructrtc_device*rtc_device_register(constchar*name,
structdevice*dev,
conststructrtc_class_ops*ops,
structmodule*owner)
structrtc_device*devm_rtc_device_register(structdevice*dev,
constchar*name,
conststructrtc_class_ops*ops,
structmodule*owner)
//注销RTC      staticvoidrtc_device_unregister(structrtc_device*rtc)     
voiddevm_rtc_device_unregister(structdevice*dev, structrtc_device*rtc)


总结

RTC也是字符设备驱动,只是进行了封装,封装完之后我们调用起来其实就很简单了。只要实现好接口函数,填充好结构体,然后进行注册即可。


相关文章
|
1月前
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
87 33
|
11天前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
20 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
14天前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
26 0
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
|
3月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
103 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3月前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
73 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
3月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
72 7
|
3月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
4月前
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
6月前
|
存储 传感器 Linux
STM32微控制器为何不适合运行Linux系统的分析
总的来说,虽然技术上可能存在某些特殊情况下将Linux移植到高端STM32微控制器上的可能性,但从资源、性能、成本和应用场景等多个方面考虑,STM32微控制器不适合运行Linux系统。对于需要运行Linux的应用,更适合选择ARM Cortex-A系列处理器的开发平台。
374 0
|
6月前
|
Linux 程序员 编译器
Linux内核驱动程序接口 【ChatGPT】
Linux内核驱动程序接口 【ChatGPT】