还是刚刚那个问题,ops操作set_alarm 调用我的驱动里面的pm8xxx_rtc_set_alarm,我在另一个c文件中看到如下代码:static bool rtc_does_wakealarm(struct rtc_device *rtc) { return rtc->ops->set_alarm != NULL; } static umode_t rtc_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n) { struct device *dev = container_of(kobj, struct device, kobj); struct rtc_device *rtc = to_rtc_device(dev); umode_t mode = attr->mode; if (attr == &dev_attr_wakealarm.attr) { if (!rtc_does_wakealarm(rtc)) mode = 0; } else if (attr == &dev_attr_offset.attr) { if (!rtc->ops->set_offset) mode = 0; } else if (attr == &dev_attr_range.attr) { if (!(rtc->range_max - rtc->range_min)) mode = 0; } return mode; } static struct attribute_group rtc_attr_group = { .is_visible = rtc_attr_is_visible, .attrs = rtc_attrs, }; static const struct attribute_group *rtc_attr_groups[] = { &rtc_attr_group, NULL }; 可是这里后面又不知道它是怎么被framwork调用的来了
时间: 2024-04-05 17:29:08 浏览: 17
这段代码是定义了 rtc 设备的属性组,包含了属性的可见性和属性本身。在 Linux 的设备模型中,设备属性可以通过 sysfs 接口进行访问和操作。这里定义了一个 attribute_group 结构体,其中包含了 is_visible 函数指针和 attrs 数组。is_visible 函数的作用是判断属性是否可见,如果不可见则返回 0,否则返回属性的 mode 值。attrs 数组则是属性的集合。
在 Linux 系统中,设备驱动通常会通过注册设备和属性来向框架注册自己。具体来说,设备驱动会调用函数如 device_register 和 sysfs_create_group 来将设备和属性注册到系统中。这些函数会将设备和属性添加到设备树和 sysfs 中,使得用户可以通过 sysfs 接口来访问和操作这些设备和属性。
相关问题
还是之前的那个问题rtc_wkalrm 是我的驱动 rtc-pm8xxx.c的结构体 vendor/qcom/proprietary/qrdplus/PowerOOffAalrm/hidl-impl/Alarm.cpp #define DEFAULT_RTC_DEV_PATH "dev/rtc0" Return<int32_t> Alarm::setAlarm(int64_t time){ struct rtc_wkalrm rtc_alarm; fd=open(DEFAULT_RTC_DEV_PATH ,0——RDONLY); rtc_alarm.timme.tm_sec=xxxxxx; rtc_alarm.timme.tm_min=xxxxxx; rtc_alarm.timme.tm_hour=xxxxxx; rtc_alarm.timme.tm_mon=xxxxxx; rtc_alarm.timme.tm_year=xxxxxx; rtc_alarm.timme.tm_wday=xxxxxx; rtc_alarm.timme.tm_yday=xxxxxx; rtc_alarm.timme.tm_isdst=xxxxxx; } 这样就可以调用我的驱动rtc-pm8xxx.c里面的pm8xxx_rtc_set_alarm, 而pm8xxx_rtc_set_alarm又属于 static const struct rtc_class_ops_pm8xxx_rtc_ops 的成员变量.set_alarm 我不理解为什么?
这段代码的作用是设置一个实时时钟(RTC)的闹钟时间。其中,rtc_wkalrm是一个结构体,包含了闹钟的时间信息;DEFAULT_RTC_DEV_PATH是RTC设备的默认路径;setAlarm函数的参数time是闹钟的触发时间。通过打开RTC设备文件,将rtc_wkalrm结构体填充好后,可以调用驱动中的pm8xxx_rtc_set_alarm函数来设置RTC的闹钟时间。
具体来说,rtc-pm8xxx.c中的static const struct rtc_class_ops_pm8xxx_rtc_ops结构体定义了一些操作函数,包括set_alarm函数,用于设置闹钟时间。而在Alarm.cpp中,通过打开RTC设备文件,将rtc_wkalrm结构体填充好后,就可以调用pm8xxx_rtc_set_alarm函数,将rtc_wkalrm中的时间信息传递给set_alarm函数,从而设置RTC的闹钟时间。
还是之前的那个问题 framework调用到了这个hidl的cpp, vendor/qcom/proprietary/qrdplus/PowerOOffAalrm/hidl-impl/Alarm.cpp #define DEFAULT_RTC_DEV_PATH "dev/rtc0" Return<int32_t> Alarm::setAlarm(int64_t time){ struct rtc_wkalrm rtc_alarm; fd=open(DEFAULT_RTC_DEV_PATH ,0——RDONLY); rtc_alarm.timme.tm_sec=xxxxxx; rtc_alarm.timme.tm_min=xxxxxx; rtc_alarm.timme.tm_hour=xxxxxx; rtc_alarm.timme.tm_mon=xxxxxx; rtc_alarm.timme.tm_year=xxxxxx; rtc_alarm.timme.tm_wday=xxxxxx; rtc_alarm.timme.tm_yday=xxxxxx; rtc_alarm.timme.tm_isdst=xxxxxx; } 为什么这样就可以调用我的驱动? rtc-pm8xxx.c里面的pm8xxx_rtc_set_alarm, rtc_wkalrm 是我的驱动 rtc-pm8xxx.c的结构体, 而pm8xxx_rtc_set_alarm又属于 static const struct rtc_class_ops_pm8xxx_rtc_ops 的成员变量.set_alarm
这是因为在Linux中,驱动程序通过实现一组结构体中的函数来提供一些操作接口,这组结构体通常被称为字符设备驱动的操作函数表(file_operations结构体),或者是RTC设备驱动的操作函数表(rtc_class_ops结构体)。
在该代码中,rtc-pm8xxx.c文件中定义了一个静态的rtc_class_ops_pm8xxx_rtc_ops结构体,其中包含了一些操作函数,比如set_alarm函数,用于设置RTC的闹钟时间。当系统启动时,RTC设备驱动会被加载,并注册到系统中,将自己的rtc_class_ops结构体指针传递给RTC框架层。
当Alarm.cpp中的代码调用setAlarm函数时,会通过打开RTC设备文件,将rtc_wkalrm结构体填充好后,调用pm8xxx_rtc_set_alarm函数,该函数实际上是调用了rtc_class_ops结构体中的set_alarm函数,将rtc_wkalrm中的时间信息传递给set_alarm函数,从而设置RTC的闹钟时间。
因此,当Alarm.cpp中的代码调用pm8xxx_rtc_set_alarm函数时,实际上是调用了静态rtc_class_ops_pm8xxx_rtc_ops结构体中的set_alarm函数,从而完成了设置RTC闹钟时间的操作。