Linux RTC驱动模型分析之rtc-sysfs.c.doc
《Linux RTC驱动模型分析之rtc-sysfs.c.doc》由会员分享,可在线阅读,更多相关《Linux RTC驱动模型分析之rtc-sysfs.c.doc(5页珍藏版)》请在三一文库上搜索。
1、Linux RTC驱动模型分析之rtc-sysfs.crtc节点rtc-sysfs文件主要的操作就是在sys下创建rtc的属性节点,可以方便用户方便快捷的访问,查找问题。下来大概看看sys下的rtc节点,有个直观的认识。roottest # cat /sys/class/rtc/rtc0/date hctosys power/ timedev max_user_freq since_epoch ueventdevice/ name subsystem/ wakealarm这是手机上rtc的节点属性,可以看到手机上只有一个rtc0设备。也可以查看/dev/rtc0设备roottest # ls
2、-l /dev/rtc0crw-rw- 1 root root 254, 0 Jan 1 1970 /dev/rtc0可以看到rtc的主设备号是254, 次设备号是0。这些信息也可以在/proc/devices下看到。roottest # cat /proc/devicesCharacter devices:1 mem2 pty.254 rtc也可以看到rtc的主设备号是254, 这都是通过上一节说的rtc-dev.c中注册得到的。rtc-sysfs.c分析void _init rtc_sysfs_init(struct class *rtc_class)rtc_class-dev_group
3、s = 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是否支持wak
4、eup功能和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(也可以通过如下方式判断是否支持wakeu
5、p功能:roottest:/ # cat /sys/class/rtc/rtc0/device/power/wakeupenabled显示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 a
6、nd wakeup */if (!rtc_does_wakealarm(rtc) /检测是否支持wakeup和alarm功能return;err = device_create_file( /创建wakealarm属性if (err)dev_err(rtc-dev.parent,failed to create alarm attribute, %dn, err);如果rtc都支持wakup和alarm功能,就创建wakealarm属性节点。否则不创建。接下来分析wakealarm属性的show和store函数。staTIc DEVICE_ATTR(wakealarm, S_IRUGO | S
7、_IWUSR, rtc_sysfs_show_wakealarm, rtc_sysfs_set_wakealarm);这里出现了DEVICE_ATTR,有必要说一下这个宏定义。-#define DEVICE_ATTR(_name, _mode, _show, _store) struct device_attribute dev_attr_#_name = _ATTR(_name, _mode, _show, _store)#define _ATTR(_name, _mode, _show, _store) .attr = .name = _stringify(_name), .mode =
8、VERIFY_OCTAL_PERMISSIONS(_mode) , .show = _show, .store = _store, 以上就是DEVICE_ATTR的宏定义,则按照定义将wakealarm的属性展开,如下:struct device_attribute dev_attr_wakealarm .name = wakealarm,.mode = S_IRUGO | S_IWUSR,.show = rtc_sysfs_show_wakealarm,.store = rtc_sysfs_set_wakealarm,上面的属性可以知道,wakealarm的属性为可读可写的,当cat wak
9、ealarm的时候最终调用show函数,echo的时候最终调用strore函数。roottest:/ # cat /sys/class/rtc/rtc0/wakealarmroottest:/ #当读wakealarm的时候,没有任何值,说明目前没有设备alarm。也可以通过cat /proc/driver/rtc获得更多的信息:rtc_TIme : 07:07:46rtc_date : 2012-01-01alrm_time : 00:00:00alrm_date : 1970-01-01alarm_IRQ : noalrm_pending : noupdate IRQ enabled :
10、noperiodic IRQ enabled : noperiodic IRQ frequency : 1max user IRQ frequency : 6424hr : yes可以看到alarm_IRQ是no, 当设置正确的alarm值后就会变为yes的。接下来设置当前的时间之后的100sroottest:/ # echo +100 /sys/class/rtc/rtc0/wakealarmroottest:/ # cat /proc/driver/rtcrtc_time : 07:09:32rtc_date : 2012-01-01alrm_time : 07:11:05alrm_dat
11、e : 2012-01-01alarm_IRQ : yesalrm_pending : noupdate IRQ enabled : noperiodic IRQ enabled : noperiodic IRQ frequency : 1max user IRQ frequency : 6424hr : yes可以看到alrm_time变为当前时间+100s了,同时alarm_IRQ也变为yes。同时再次cat wakealarm,即可获得值。roottest:/ # cat /sys/class/rtc/rtc0/wakealarm1325401865此值是unix的时间戳,必须要转换为U
12、TC时间,可以通过如下的网址转换,http:/tool.chinaz/Tools/unixtime.aspx可以看到转换后的时间是2012/1/1 15:11:5,为什么感觉和alrm_time对不上呢? 那是因为北京在东八区,相差8个小时,15-8=7则就是alrm_time。当cat wakealarm有值的时候,再次echo值进如wakealarm的时候就会出现设备忙,所以再次设备时候必须清除以前的设置。roottest:/ # cat /sys/class/rtc/rtc0/wakealarm1325401865roottest:/ # echo +100 /sys/class/rtc
13、/rtc0/wakealarmsh: echo: write error: Device or resource busy那如何就可以清空wakealarm的值,可以通过echo 0 wakealarm就可以清空roottest:/ # cat /sys/class/rtc/rtc0/wakealarm1325401865roottest:/ # echo 0 /sys/class/rtc/rtc0/wakealarmroottest:/ # cat /sys/class/rtc/rtc0/wakealarmroottest:/ #在知道了上述的设置之后,再来看代码,在看代码之前先看一下必要的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux RTC驱动模型分析之rtc-sysfs.c RTC 驱动 模型 分析 sysfs
链接地址:https://www.31doc.com/p-3255200.html