MMI
|
|
alarm.c----alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)--case ANDROID_ALARM_SET_RTC:
|
|
interface.c----rtc_set_time(alarm_rtc_dev, &rtc_new_rtc_time);
|
|
V
rtc-m41t94.c---- m41t94_set_time(struct device *dev, struct rtc_time *tm)
static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
;
;
case ANDROID_ALARM_SET_RTC:
if (copy_from_user(&new_rtc_time, (void __user *)arg,
sizeof(new_rtc_time))) {
rv = -EFAULT;
goto err1;
}
rtc_time_to_tm(new_rtc_time.tv_sec, &rtc_new_rtc_time);
ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_IO,
"set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d/n",
new_rtc_time.tv_sec, new_rtc_time.tv_nsec,
rtc_new_rtc_time.tm_hour, rtc_new_rtc_time.tm_min,
rtc_new_rtc_time.tm_sec, rtc_new_rtc_time.tm_mon + 1,
rtc_new_rtc_time.tm_mday,
rtc_new_rtc_time.tm_year + 1900);
mutex_lock(&alarm_setrtc_mutex);
spin_lock_irqsave(&alarm_slock, flags);
for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++)
hrtimer_try_to_cancel(&alarm_timer[i]);
getnstimeofday(&tmp_time);
elapsed_rtc_delta = timespec_sub(elapsed_rtc_delta,
timespec_sub(tmp_time, new_rtc_time));
spin_unlock_irqrestore(&alarm_slock, flags);
rv = do_settimeofday(&new_rtc_time);
spin_lock_irqsave(&alarm_slock, flags);
for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++)
alarm_start_hrtimer(i);
spin_unlock_irqrestore(&alarm_slock, flags);
if (rv < 0) {
ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_ERRORS,
"Failed to set time/n");
mutex_unlock(&alarm_setrtc_mutex);
goto err1;
}
rv = rtc_set_time(alarm_rtc_dev, &rtc_new_rtc_time);
spin_lock_irqsave(&alarm_slock, flags);
alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
wake_up(&alarm_wait_queue);
spin_unlock_irqrestore(&alarm_slock, flags);
mutex_unlock(&alarm_setrtc_mutex);
if (rv < 0) {
ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_ERRORS,
"Failed to set RTC, time will be lost on reboot/n");
goto err1;
}
break;
}
android RTC 时间设置,
1,用户设置时间,MMI通过ioctrl命令调用,
2,内核执行alarm_ioctl的
case ANDROID_ALARM_SET_RTC:
3,
将用户空间的时间参数通过copy_from_user取出。为绝对的秒保持在new_rtc_time.tv_sec
4,通过rtc_time_to_tm(new_rtc_time.tv_sec, &rtc_new_rtc_time);将绝对的秒转换为年月日时分秒格式放到rtc_new_rtc_time
struct rtc_time {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
5,因为要对RTC操作,要用mutex_lock(&alarm_setrtc_mutex);加锁
要清除alarm,要用spin_lock_irqsave(&alarm_slock, flags);加锁
getnstimeofday(&tmp_time);获得ns级的时间
然后可调用do_settimeofday同步系统时钟:
通过函数
rv = rtc_set_time(alarm_rtc_dev, &rtc_new_rtc_time);
调用interface.c 的
err = mutex_lock_interruptible(&rtc->ops_lock);
err = rtc->ops->set_time(rtc->dev.parent, tm);
mutex_unlock(&rtc->ops_lock);
调用硬件RTC的驱动
static const struct rtc_class_ops m41t94_rtc_ops = {
.read_time= m41t94_read_time,
.set_time= m41t94_set_time,
};
的m41t94_set_time设置到硬件RTC芯片
spin_lock_irqsave(&alarm_slock, flags);
alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
wake_up(&alarm_wait_queue);
spin_unlock_irqrestore(&alarm_slock, flags); 释放原来申请的锁
mutex_unlock(&alarm_setrtc_mutex); 释放原来申请的锁
因为时间改了。唤醒alarm队列,释放原来申请的锁alarm_slock和alarm_setrtc_mutex
分享到:
相关推荐
使用STM32L452/STM32L471均调试可用,使用LL库配置,文件包含函数:1.配置实时时钟(RTC);2.读实时时钟(RTC);3.写实时时钟(RTC);
STM32 RTC 时钟设置、应用 示例代码。完全可用。
1.在linux系统下验证的系统时间设置和获取,rtc时间设置和获取,有需要的可以参考
1. 主循环中,当sec达到15s时,设定15s后闹钟,然后进入待机模式Sys_Enter_Standby; 2. RTC中断定时中,清中断。...通过RTC设置系统进入待机模式,并定时唤醒,是一个非常省电而且非常可靠的方法。
MCU:stm32f103zet6 功能:RTC时间显示,串口发送RTC时间 上下左右四健实现时间设置,支持长按快速加减
STM32F103 RTC初始化/设置/读取,时间戳与日期时间相互转化
读RTC时间或设置RTC时间,设置RTC时间的同时也将系统时间同步
该工程使用Keil编译,里面主要是介绍了RTC的使用(带闹钟中断功能,包括RTC的配置,时间的设置,闹钟的设置,闹钟中断的设置等),同时为了使大家更方便的查看程序效果,该工程还使用了串口功能,当闹钟中断产生时(即...
基于STM32,采用LVGL制作的日历,可与STM32-RTC一并使用,并创立界面,可通过人工交互进行日历修改。
9) 修改RTC时间设置; 10) APP需要识别当前插入U盘的USB端口(USB0,USB1,USB2),U盘插拔时抛出消息; 11)控制USB0,USB1端口电源的GPIO. USB0端口电源控制引脚 - PNL_PWR_CTRL 对应 GPIO19 USB1端口电源控制...
用STM32F103单片机控制SIM900A模块通过连接国外的授时服务器或者访问SIM900A内部获取网络时间,把获得的时间设置到STM32内部的RTC中,实现单片机上电自动校正时间。时间在串口上显示出来。资源是完整的工程,里面...
当我们要用到RTC的时候,就不能再不设置Clock Setting的选项了,猛然间需要对这个神秘的东西进行设置,刚开时我也是云里雾里的(因为,没有任何的文献可供参考),我就只能摸着石头过河,现在把我的设置经验与大家...
DS1302Z读取和设置RTC时间显示在数码管cyclone2 FPGA实验Verilog源码Quartus9.0工程文件 module RTC ( //Global input ports. SYSCLK, RST_B, //RTC ports. RTC_CLK, RTC_RST, RTC_IO, //Output ports. ...
可以使用Xshell通过stm32的USART1打印时间数据
1、设置、读取硬件时间;2、?读取软件时间并保存;3、读取闹钟的时间。
本实验通过TFTLCD显示RTC时间,并可以通过usmart设置RTC时间/闹钟,从而调节时间,或设置RTC闹钟, 以便大家验证RTC功能。
ESP32Time 用于在ESP32板上设置和检索内部RTC时间的Arduino库在上可用功能setTime(30, 24, 15, 17, 1, 2021); // 17th Jan 2021 15:24:30setTime(1609459200); // 1st Jan 2021 00:00:00setTime(); // default 1st ...
RTC芯片 AM1805 可设置年月日时分秒,实现功耗等控制。
linux操作系统中的实时时钟是通常可在BIOS设定的时钟。该程序提供了RTC时间的设置、读取与alarm中断
6.7 clock指令:系统RTC时间设置 6.8 crontab指令:设置计时器 6.9 declare指令:声明 shell 变量 6.10 depmod指令:模块关系 6.11 dircolors指令:ls指令对应的显示颜色设置 6.12 dmesg指令:显示内核信息 6.13 ...