Alarm.cpp中的代码并没用直接调用setAlarm函数,他只是打开了一个设备文件
时间: 2024-04-04 20:35:29 浏览: 225
你说的是对的,我之前理解有误,非常抱歉。Alarm.cpp中的代码并没有直接调用setAlarm函数,而是通过打开RTC设备文件,将rtc_wkalrm结构体填充好后,调用ioctl函数,将rtc_wkalrm中的时间信息传递给RTC设备驱动的rtc_class_ops结构体中的set_alarm函数,从而完成了设置RTC闹钟时间的操作。
ioctl是Linux中的一个系统调用,用于向设备发送控制命令和数据。在该代码中,使用ioctl函数向RTC设备发送设置闹钟时间的命令。当ioctl函数的第二个参数是RTC_ALM_SET时,它会调用rtc_class_ops结构体中的set_alarm函数,将rtc_wkalrm中的时间信息传递给set_alarm函数,从而完成了设置RTC闹钟时间的操作。
因此,当Alarm.cpp中的代码打开RTC设备文件并调用ioctl函数时,实际上是调用了RTC设备驱动中的set_alarm函数,从而完成了设置RTC闹钟时间的操作。
相关问题
还是之前的问题,这里我有点看不懂,在Alarm.cpp 中 他去操作只读打开了文件 dev/rtc0,然后给驱动的结构体赋值,最后通过 ioctl(fd,RTC_WKALM_SET,&rtc_alarm) 就能直接调用我的驱动函数,为什么?
在Alarm.cpp中打开/dev/rtc0文件是为了获得文件描述符(file descriptor,fd),这个描述符是用来表示打开的文件的。然后,程序将要设置的闹钟时间写入到一个驱动程序提供的结构体 rtc_alarm 中。最后,通过ioctl系统调用,将设置好的rtc_alarm结构体传递给驱动程序的RTC_WKALM_SET命令,以便驱动程序正确地设置闹钟时间。
ioctl系统调用是非常强大和通用的系统调用,它可以与设备驱动程序交互,传递各种命令和参数,以便对设备进行各种操作。在这个例子中,ioctl系统调用将用户空间的rtc_alarm结构体传递给驱动程序,驱动程序会根据这个结构体中的数据设置闹钟时间。
还是之前的那个问题 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闹钟时间的操作。
阅读全文