linux c监控rtc秒,Linux RTC驱动模型分析之rtc-sysfs.c

本文详细介绍了Linux系统中RTC(实时时钟)的sysfs接口,包括rtc-sysfs.c如何创建设备节点及属性。通过分析rtc-sysfs.c,展示了rtc设备在/sys/class/rtc/下的属性,如date、hctosys等,并探讨了rtc_wakealarm属性的show和store函数,以及如何设置和读取RTC报警。此外,还讨论了rtc的设备权限和最大用户频率设置。
摘要由CSDN通过智能技术生成

rtc节点

rtc-sysfs文件主要的操作就是在sys下创建rtc的属性节点,可以方便用户方便快捷的访问,查找问题。下来大概看看sys下的rtc节点,有个直观的认识。

c2d2d34cf91bfa648bd1a9c2ab0eb3e9.png

[root@test ~]# cat /sys/class/rtc/rtc0/

date hctosys power/ time

dev max_user_freq since_epoch uevent

device/ name subsystem/ wakealarm

这是手机上rtc的节点属性,可以看到手机上只有一个rtc0设备。也可以查看/dev/rtc0设备

[root@test ~]# ls -l /dev/rtc0

crw-rw---- 1 root root 254, 0 Jan 1 1970 /dev/rtc0

可以看到rtc的主设备号是254, 次设备号是0。这些信息也可以在/proc/devices下看到。

[root@test ~]# cat /proc/devices

Character devices:

1 mem

2 pty

...

254 rtc

也可以看到rtc的主设备号是254, 这都是通过上一节说的rtc-dev.c中注册得到的。

rtc-sysfs.c分析

void __init rtc_sysfs_init(struct class *rtc_class)

{

rtc_class->dev_groups = rtc_groups;

}

设置rtc的设备组属性,rtc_groups是一个attribute_group的结构体。这个函数会在class.c中rtc_init中调用到,关于rtc_group会在后面说到。

staTIc inline int rtc_does_wakealarm(struct rtc_device *rtc)

{

if (!device_can_wakeup(rtc->dev.parent)) //用来判断是否具有wakeup的能力

return 0;

return rtc->ops->set_alarm != NULL; //用来判断是否具有alarm的能力

}

该函数是用来检测rtc是否支持wakeup功能和alarm功能。 wakeup的能力就是能唤醒suspend-to-RAM/suspend-to-disk设备。wakeup的能力是通过如下代码:

staTIc inline bool device_can_wakeup(struct device *dev)

{

return dev->power.can_wakeup;

}

也就是判断can_wakeup是否为true,至于rtc是否支持就需要看对应的rtc驱动是否实现该功能。

比如驱动: rtc-ds1305.c中就调用如下的代码设置wakeup的能力。

device_set_wakeup_capable(&spi->dev, 1);

也可以通过如下方式判断是否支持wakeup功能:

root@test:/ # cat /sys/class/rtc/rtc0/device/power/wakeup

enabled

显示enabled就代表此rtc支持 wakeup功能,也就是说有唤醒suspend/standby的系统或者设备。

而对于rtc是否支持alarm功能,就通过驱动的ops操作函数集合看set_alarm有没有实现就ok。

如果rtc即支持wakeup功能也支持alarm功能,则:

void rtc_sysfs_add_device(struct rtc_device *rtc)

{

int err;

/* not all RTCs support both alarms and wakeup */

if (!rtc_does_wakealarm(rtc)) //检测是否支持wakeup和alarm功能

return;

err = device_create_file(&rtc->dev, &dev_attr_wakealarm); //创建wakealarm属性

if (err)

dev_err(rtc->dev.parent,

"failed to create alarm attribute, %d\n", err);

}

如果rtc都支持wakup和alarm功能,就创建wakealarm属性节点。否则不创建。

接下来分析wakealarm属性的show和store函数。

staTIc DEVICE_ATTR(wakealarm, S_IRUGO | S_IWUSR, rtc_sysfs_show_wakealarm, rtc_sysfs_set_wakealarm);

这里出现了DEVICE_ATTR,有必要说一下这个宏定义。

----

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值