Linux RTC 驱动模型介绍

Linux RTC 驱动模型介绍
目录:
一、 RTC 的概念与作用
二、 RTC 的属性
三、 RTC 相关文件以及驱动实现一、 RTC 的概念与作用
RTC(real time clock) 实时时钟,依靠一个外部的 32.768kHz 的石英晶振,产生周期
性的脉冲信号,当有一个信号到来时,计数器就加 1 ,通过这种方式完成计时功能。
主要的作用给 Linux 系统提供时间, RTC 使用的是电池供电,所以掉电后时间不丢
失。内核启动时,从 RTC 中读取时间与日期作为基准值。
如果提供 IRQ 中断并可以定时,可以作为对内核睡眠时的定时唤醒闹钟
user
hctosys.c
/dev/rtcN /sys/ /proc/driver/rtc
rtc-dev.c rtc-sysfs.c rtc-proc.c
interface.c
rtc-lib.c
class.c
kernel
hardware
RTC 驱动( rtc-xx.c )
三、 RTC 相关文件以及驱动实现

3.2 RTC 文件相关的作用
1 、 hardware :提供时间信息。
2 、 rtc 驱动:与硬件进行交互。
3 、 class.c :创建 rtc 类,提供一些设备注册、注销接口。
4 、 interface.c :用户程序和驱动接口, ioctl 和 RTC 驱动交互需要调用的函数。
5 、 rtc-lib.c : RTC 库函数,通用的时间操作函数。
6 、 hctosys.c :系统上电后同步 RTC 时间到操作系统。
7 、 rtc-dev.c :在 /dev/ 目录下创建设备节点,供应用程序访问。
8 、 rtc-sysfs.c/rtc-proc.c :生成在 /sys/ 和 /proc/ 下的相关设备信息。

三、 RTC 相关文件以及驱动实现
Class.c
static int __init rtc_init(void)
{
rtc_class = class_create(THIS_MODULE, “rtc”); //sys/class 下创建一个 rtc 类
if (IS_ERR(rtc_class)) {
pr_err(“couldn’t create class\n”);
return PTR_ERR(rtc_class);
}
rtc_class->suspend = rtc_suspend;
rtc_class->resume = rtc_resume;
rtc_dev_init();
// 动态分配设备号
rtc_sysfs_init(rtc_class); // /sys/class/rtc/rtcN 下属性配置
return 0;
}

song@Server4-3:~$ ls /sys/class/rtc/rtc0
date dev device hctosys max_user_freq name power since_epoch subsystem time
uevent wakealarm
wssong@Server4-3:~$ cat /sys/class/rtc/rtc0/uevent
MAJOR=254
MINOR=0
DEVNAME=rtc0

三、 RTC 相关文件以及驱动实现
rtc-xx.c: 驱动注册,调用 class.c 中 rtc_device_register 函数做对应的初始化工作。
1 、调用 dev_set_name(&rtc->dev, “rtc%d”, id) ->rtc_dev_add_device(rtc);
2 、之后就有了 /dev/rtcN 出现。
3 、有了 /dev/rtc0 后,通过 open/ioctl 操作 RTC 设备 file_operations 。

static const struct file_operations rtc_dev_fops = {
.owner= THIS_MODULE,
.llseek= no_llseek,
.read= rtc_dev_read,
.poll= rtc_dev_poll,
.unlocked_ioctl = rtc_dev_ioctl,
.open= rtc_dev_open,
.release= rtc_dev_release,
.fasync= rtc_dev_fasync,
};

可以通过当前的 ioctl 去调用 rtc_class_ops 的 ioctl 实现特定的功能。

三、 RTC 相关文件以及驱动实现

struct rtc_class_ops {
int (*open)(struct device *); // 打开设备
void (*release)(struct device *); // 关闭设备
int (*ioctl)(struct device *, unsigned int, unsigned long); // 应用层和驱动( cmd )
int (*read_time)(struct device *, struct rtc_time *); // 读取时间
int (*set_time)(struct device *, struct rtc_time *); // 设置时间
int (*read_alarm)(struct device *, struct rtc_wkalrm *);// 读下一次闹钟
int (*set_alarm)(struct device *, struct rtc_wkalrm *); // 设置下一次闹钟
int (*proc)(struct device *, struct seq_file *); //proc 相关信息的输出
int (*set_mmss)(struct device *, unsigned long secs);// 设置时间
int (*read_callback)(struct device *, int data); // 读回调函数
int (*alarm_irq_enable)(struct device *, unsigned int enabled);// 中断使能开关
};

struct rtc_wkalrm {
unsigned char enabled; /* 0 = alarm disabled, 1 = alarm enabled /
unsigned char pending; /
0 = alarm not pending, 1 = alarm pending /
struct rtc_time time; /
time the alarm is set to */
};

三、 RTC 相关文件以及驱动实现

将 rtcN 设备加入到 /proc/driver/
rtc-proc.c
void rtc_proc_add_device(struct rtc_device *rtc)
{
if (is_rtc_hctosys(rtc))
proc_create_data(“driver/rtc”, 0, NULL, &rtc_proc_fops, rtc);
}
完成添加实现在驱动注册时: rtc_device_register ()
–—> rtc_proc_add_device(rtc);

song@Server4-3:~$ cat /proc/driver/rtc
rtc_time : 12:28:57
rtc_date : 2019-07-08
alrm_time
: 00:00:00
alrm_date : 2019-04-16
alarm_IRQ : no
alrm_pending
: no

执行过程: rtc_proc_open()
----->rtc_proc_show()

三、 RTC 相关文件以及驱动实现

user
hctosys.c
/dev/rtcN /sys/ /proc/driver/rtc
rtc-dev.c rtc-sysfs.c rtc-proc.c
interface.c
rtc-lib.c
class.c
kernel
hardware

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值