在drivers/rtc/rtc-proc.c 中定义了一个接口,是的可以通过cat /proc/driver/rtc 来查询rtc的情况.
在rtc_device_register->rtc_proc_add_device
void rtc_proc_add_device(struct rtc_device *rtc)
{
//proc_create_data 会在/proc/driver/rtc 下创建一个文件
if (is_rtc_hctosys(rtc))
proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc);
}
这个时候如果cat /proc/driver/rtc的时候会调用
static const struct file_operations rtc_proc_fops = {
.open = rtc_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = rtc_proc_release,
};
的rtc_proc_open
static int rtc_proc_open(struct inode *inode, struct file *file)
{
int ret;
struct rtc_device *rtc = PDE_DATA(inode);
if (!try_module_get(rtc->owner))
return -ENODEV;
会打开rtc_proc_show
ret = single_open(file, rtc_proc_show, rtc);
if (ret)
module_put(rtc->owner);
return ret;
}
。所以cat /proc/driver/rtc的时候最终会调用rtc_proc_show
static int rtc_proc_show(struct seq_file *seq, void *offset)
{
int err;
struct rtc_device *rtc = seq->private;
const struct rtc_class_ops *ops = rtc->ops;
struct rtc_wkalrm alrm;
struct rtc_time tm;
err = rtc_read_time(rtc, &tm);
if (err == 0) {
seq_printf(seq,
"rtc_time\t: d:d:d\n"
"rtc_date\t: d-d-d\n",
tm.tm_hour, tm.tm_min, tm.tm_sec,
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
}
return 0;
}
实际测试如下: