blob: 0840492586f67945b5a78f68f6ec2bb79b3d8edf [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/**
2 * @file rtc-service.c
3 * @brief Implementation of Sanechips
4 *
5 * Copyright (C) 2017 Sanechips Technology Co., Ltd.
6 * @author linxu Gebin
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14/*******************************************************************************
15 * Include header files *
16 ******************************************************************************/
17#include "rtc-service.h"
18#include "hotplug.h"
19
20/*******************************************************************************
21 * Global variable definitions *
22 ******************************************************************************/
23int g_rtc_fd = 0;
24struct list_head rtc_timer_list;
25struct list_head rtc_alarm_list;
26#define RTC_ALARM_TIMEOUT_MSG "PMIC RTC ALARM IRQ COME"
27#define RTC_TIMER_TIMEOUT_MSG "PMIC RTC TIMER IRQ COME"
28
29#ifdef PRODUCT_NOT_USE_RTC
30time_t g_set_softtime;
31#define RTC_USE_SOFTTIMER_ID 300 //µ±Ã»ÓÐrtcʱ£¬Ô­ÏÈʹÓÃrtc¶¨Ê±Æ÷µÄÓÐrtcͳһÊÊÅäµ½softtimerÉÏ£¬Õû¸ö¿ò¼Ü²»±ä
32#endif
33/*******************************************************************************
34 * Local variable definitions *
35 ******************************************************************************/
36static pthread_t rtc_looper_id = 0;
37static int g_clean_flag = 0;
38static int g_time_offset = 2; //ÔÊÐíÎó²î·¶Î§£¬ÊÊÅärtcºÍOSʱÖÓÆµÂʲ»Ò»ÖÂÎÊÌâ
39/*******************************************************************************
40 * Local function implementations *
41 ******************************************************************************/
42static int open_rtc(void);
43static void close_rtc(int fd);
44static void* rtc_looper();
45static int start_rtc_thread();
46static int handle_get_time(MSG_BUF *pmsg_buf);
47static int handle_set_time(MSG_BUF *pmsg_buf);
48static int handle_alarm_add(MSG_BUF *pmsg_buf);
49static int handle_alarm_del(MSG_BUF *pmsg_buf);
50static int handle_alarm_timeout(MSG_BUF *pmsg_buf);
51static int process_msg(MSG_BUF *pmsg_buf);
52static void msg_looper(void);
53static void update_timer_remain(int new_remian);
54static void alarm_fix_value(struct list_head *rtc_list);
55static void alarm_restart(struct list_head *rtc_list);
56static void update_alarm();
57static void alarm_adjust_value(int time);
58static long get_RtcTime();
59static void convert_time(time_t timeSec, struct tm * tmTime, TIME_CONVERT_TYPE type);
60static void convert_time(time_t timeSec, struct tm * tmTime, TIME_CONVERT_TYPE type)
61{
62 time_t tmpTime = 0;
63 if(tmTime == NULL) {
64 slog(RTC_PRINT, SLOG_ERR, "rtc-service: wrong input param, check it! \n");
65 return ;
66 }
67 tmpTime = timeSec;
68
69 if(type == CONVERT_TYPE_RTC) {
70 gmtime_r((time_t*)&tmpTime, tmTime);
71 }
72 else {
73 localtime_r((time_t*)&tmpTime, tmTime);
74 }
75
76 slog(RTC_PRINT, SLOG_DEBUG, "Time:%ld, tm_year:%d, tm_mon:%d, tm_hour:%d, tm_min:%d, tm_sec:%d, tm_yday:%d, tm_mday:%d, tm_wday:%d \n",
77 mktime(tmTime), tmTime->tm_year, tmTime->tm_mon, tmTime->tm_hour, tmTime->tm_min, tmTime->tm_sec, tmTime->tm_yday, tmTime->tm_mday, tmTime->tm_wday);
78
79}
80
81static long get_RtcTime()
82{
83 long curRtcTime = 0;
84 struct rtc_time rtc_tm = {0};
85 struct tm tmp = {0};
86 if(g_rtc_fd <= 0) {
87 slog(RTC_PRINT, SLOG_ERR, "rtc-service: g_rtc_fd: %d , invalid fd. \n", g_rtc_fd);
88 return -1;
89 }
90
91 if(ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) // cov M CHECKED_RETURN
92 {
93 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
94 }
95 tmp.tm_sec = rtc_tm.tm_sec;
96 tmp.tm_min= rtc_tm.tm_min;
97 tmp.tm_hour= rtc_tm.tm_hour;
98 tmp.tm_mon= rtc_tm.tm_mon;
99 tmp.tm_year= rtc_tm.tm_year;
100 tmp.tm_mday= rtc_tm.tm_mday;
101 tmp.tm_wday= rtc_tm.tm_wday;
102 tmp.tm_yday= rtc_tm.tm_yday;
103 tmp.tm_isdst= rtc_tm.tm_isdst;
104
105 curRtcTime = mktime(&tmp);
106 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: curRtcTime: %ld . \n", curRtcTime);
107 return curRtcTime;
108}
109static void write_lockfile(char *filepath, char *setbuf)
110{
111 int f, len = 0;
112
113 f = open(filepath, O_RDWR);
114 if (f == -1) {
115 return;
116 }
117
118 len = strlen(setbuf);
119 if (write(f, setbuf, len) != len) {
120 } else {
121 }
122 close(f);
123}
124
125
126static void wake_rtc_lock()
127{
128 write_lockfile("/sys/power/wake_lock", "rtc_lock");
129}
130
131static void wake_rtc_unlock()
132{
133 write_lockfile("/sys/power/wake_unlock", "rtc_lock");
134}
135
136static void wake_rtc_io_lock()
137{
138 write_lockfile("/sys/power/wake_lock", "rtc_io_lock");
139}
140
141static void wake_rtc_io_unlock()
142{
143 write_lockfile("/sys/power/wake_unlock", "rtc_io_lock");
144}
145
146static void wake_timeout_lock(char *lockname, unsigned long interval)
147{
148 char cmd[100] = {0};
149 sprintf(cmd, "echo %s %lu > /sys/power/wake_lock", lockname, interval);
150 soft_system(cmd);
151}
152
153static int init_rtc_alarm(void)
154{
155 FILE* fp = NULL;
156 int gap_start = 0;
157 int gap_end = 0;
158 size_t size = 0;
159 long cur_rtc_time = 0;
160 ALARM_T* iter = NULL;
161 RTC_DATA_BUF buf = {0};
162 int ret = -1;
163
164// cur_rtc_time = get_RtcTime();
165 cur_rtc_time = time(0);
166 if ((fp = (FILE*)fopen(RTC_ALARM_DATA, "rb")) == NULL)
167 {
168 slog(RTC_PRINT, SLOG_ERR, "rtc-service: failed to open %s \n", RTC_ALARM_DATA);
169 return -1;
170 }
171
172 while(1)
173 {
174 size = fread(&gap_start, sizeof(int), 1, fp);//0xa5a5
175 if(0 == size || gap_start != DATA_S ||feof(fp) != 0 )
176 break;
177
178 iter = (ALARM_T*)malloc(sizeof(ALARM_T));
179 if(iter)
180 memset(iter,0,sizeof(ALARM_T));
181 else
182 {
183 fclose(fp);
184 return -1;
185 }
186
187 size = fread(iter, sizeof(ALARM_T), 1, fp);//struct
188 if(0 ==size||feof(fp) != 0)//check the end of the file
189 {
190 memset(iter, 0, sizeof(ALARM_T));//kw
191 free(iter);
192 break;
193 }
194
195 size = fread(&gap_end, sizeof(int), 1, fp);//0x5a5a
196 if(0 == size || gap_end != DATA_E ||feof(fp) != 0)
197 {
198 memset(iter, 0, sizeof(ALARM_T));//kw
199 free(iter);
200 break;
201 }
202
203 if(iter->interval < 0 || iter->interval > LONG_MAX-1)
204 {
205 iter->interval = 0 ;
206 }
207
208
209 if(iter->time_val < 0 || iter->time_val > LONG_MAX-1)
210 {
211 iter->time_val = 0 ;
212 }
213
214
215 if(cur_rtc_time > iter->interval + iter->time_val)
216 {
217 buf.module = iter->rtc_id;
218 buf.time_val = iter->time_val + iter->interval;
219 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: target:0x%x, rtc_id:0x%x, utc:%d, cur_rtc_time:%ld \n", iter->module_id, buf.module, iter->is_utc, cur_rtc_time);
220 ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, iter->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
221 if (ret != 0) {
222 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected\n");
223 }
224 }
225 list_add_tail(&iter->list, &rtc_alarm_list);
226 if(feof(fp) != 0)//check the end of the file
227 break;
228 }
229 fclose(fp);
230
231 return 0;
232}
233
234static int save_rtc_alarm(void)
235{
236 FILE* fp = NULL;
237 int gap_start = DATA_S;
238 int gap_end = DATA_E;
239 ALARM_T *temp = NULL;
240
241 if ((fp = (FILE*)fopen(RTC_ALARM_DATA, "wb")) == NULL)
242 {
243 slog(RTC_PRINT, SLOG_ERR, "rtc-service: failed to open %s \n", RTC_ALARM_DATA);
244 return -1;
245 }
246
247 if (!list_empty(&rtc_alarm_list)) {
248 list_for_each_entry(temp, &rtc_alarm_list, list) {
249 if(temp->wakeup)
250 {
251 fwrite(&gap_start, sizeof(int), 1, fp);
252 fwrite(temp, sizeof(ALARM_T), 1, fp);
253 fwrite(&gap_end, sizeof(int), 1, fp);
254 }
255 }
256 }
257
258 fflush(fp);
259 if(fsync(fileno(fp)) < 0)
260 {
261 // todo: cov M
262 }
263 fclose(fp);
264
265 return 0;
266}
267
268/********************************************
269 ¹¦ÄÜ:´ò¿ªrtc
270 *******************************************/
271static int open_rtc(void)
272{
273 int fd = 0;
274 fd = open(RTC_DEV_NAME, O_RDWR);
275
276 if (fd < 0) {
277 slog(RTC_PRINT, SLOG_ERR, "rtc-service: Open %s error!\n", RTC_DEV_NAME);
278 return fd;
279 }
280 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: Open %s OK!\n", RTC_DEV_NAME);
281 return fd;
282}
283
284/********************************************
285 ¹¦ÄÜ:¹Ø±Õrtc
286 *******************************************/
287static void close_rtc(int fd)
288{
289 if (fd < 0) {
290 return;
291 }
292
293 close(fd);
294}
295
296
297/********************************************
298 * handle_get_time
299 * get RTC time.
300 *******************************************/
301static int handle_get_time(MSG_BUF *pmsg_buf)
302{
303 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_get_time NOOPS.\n");
304 return 0;
305}
306
307/********************************************
308 * ¹¦ÄÜ:ÉèÖÃrtcʱ¼ä
309 *******************************************/
310static int handle_set_time(MSG_BUF *pmsg_buf)
311{
312 time_t os_time = 0;
313 struct tm tmTime = {0};
314 struct rtc_time rtc_tm = {0};
315 int ret = 0;
316
317 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_set_time enter.\n");
318 memcpy(&os_time, pmsg_buf->aucDataBuf, sizeof(time_t));
319 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_set_time enter: set time: %ld \n", os_time);
320 convert_time(os_time, &tmTime, CONVERT_TYPE_RTC);
321 memcpy(&rtc_tm, &tmTime, sizeof(struct rtc_time));
322 slog(RTC_PRINT, SLOG_ERR, "Time:%ld, tm_year:%d, tm_mon:%d, tm_hour:%d, tm_min:%d, tm_sec:%d, tm_yday:%d, tm_mday:%d, tm_wday:%d \n",
323 mktime(&tmTime), rtc_tm.tm_year, rtc_tm.tm_mon, rtc_tm.tm_hour, rtc_tm.tm_min, tmTime.tm_sec, rtc_tm.tm_yday, rtc_tm.tm_mday, rtc_tm.tm_wday);
324
325 ret = ioctl(g_rtc_fd, RTC_SET_TIME, &rtc_tm);
326 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: RTC_SET_TIME ioctl ret = %d exit.\n", ret);
327 {
328 char buf[32] = {0};
329 snprintf(buf,32,"AT+ZMMI=2,%d,%d\r\n",1900 + rtc_tm.tm_year,1 + rtc_tm.tm_mon);
330 ret = get_modem_info(buf, NULL, NULL);
331 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_set_time ret=%d %s\n",ret,buf);
332 }
333 return 0;
334}
335
336/********************************************
337 * ¹¦ÄÜ:Ôö¼Ó¶¨Ê±Æ÷
338 *******************************************/
339static int handle_alarm_add(MSG_BUF *pmsg_buf)
340{
341 //long cur_rtc_time = 0;
342
343 struct rtc_time rtc_tm = {0};
344 ALARM_T *pAlarm = 0;
345
346 RTC_DATA_BUF *buf = pmsg_buf->aucDataBuf;
347 ALARM_T *temp = NULL;
348 int mark = 0;
349
350 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_add enter.\n");
351
352 if (buf->ulSec <= 0) {
353 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add invalid interval.\n");
354 return -1;
355 }
356
357 pAlarm = malloc(sizeof(ALARM_T));
358 if (pAlarm == NULL) {
359 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add no memory.\n");
360 return -1;
361 }
362
363 //»ñÈ¡µ±Ç°Ê±¼ä second
364 if(ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) // cov M CHECKED_RETURN
365 {
366 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
367 }
368 memcpy(&pAlarm->rtc_tm, &rtc_tm, sizeof(rtc_tm));
369
370 pAlarm->rtc_id = buf->module;
371 pAlarm->module_id = pmsg_buf->src_id;
372 pAlarm->interval = buf->ulSec ; // count down time
373 pAlarm->remain_time = buf->ulSec; // remain count down time
374 pAlarm->wakeup = buf->wakeup;
375 pAlarm->is_utc = buf->is_utc;
376 pAlarm->cpu = buf->cpu;
377 pAlarm->time_val = buf->time_val;// cur_rtc_time is mktime(&local_tm)
378 //pAlarm->time_val = get_RtcTime();// cur_rtc_time is mktime(&local_tm)
379
380 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_add pAlarm->interval is %ld ,pAlarm->time_val() is %ld, is_utc:%d.\n",
381 pAlarm->interval, pAlarm->time_val, pAlarm->is_utc);
382/*
383 if (pAlarm->time_val + pAlarm->remain_time < cur_rtc_time) {
384 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service handle_alarm_add error, pAlarm->remain_time = %ld, pAlarm->time_val = %ld, current= %ld\n", pAlarm->remain_time, pAlarm->time_val, cur_rtc_time);
385 }
386*/
387
388#ifdef PRODUCT_NOT_USE_RTC
389 pAlarm->is_utc = 0; //´Ëģʽ϶¼°´timerÉèÖö¨Ê±Æ÷£¬²»Ö§³Öutc
390 pAlarm->wakeup = 0;
391#endif
392
393 if (pAlarm->is_utc == 0) {
394 if (!list_empty(&rtc_timer_list)) {
395 //update_timer_remain(pAlarm->remain_time);
396 list_for_each_entry(temp, &rtc_timer_list, list) {
397 if (temp->remain_time > pAlarm->remain_time) {
398 mark = 1;
399 list_add(&pAlarm->list, temp->list.prev);
400 break;
401 }
402 }
403 }
404 if (mark == 0) {
405 list_add_tail(&pAlarm->list, &rtc_timer_list);
406 }
407 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: add rtc timer\n");
408 alarm_restart(&rtc_timer_list);
409 } else {
410 if (!list_empty(&rtc_alarm_list)) {
411 list_for_each_entry(temp, &rtc_alarm_list, list) {
412 if (temp->interval + temp->time_val > pAlarm->interval + pAlarm->time_val) {
413 mark = 1;
414 list_add(&pAlarm->list, temp->list.prev);
415 break;
416 }
417 }
418 }
419 if (mark == 0) {
420 list_add_tail(&pAlarm->list, &rtc_alarm_list);
421 }
422
423 if(pAlarm->wakeup)
424 save_rtc_alarm();
425
426 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: add rtc alarm \n");
427 alarm_restart(&rtc_alarm_list);
428 }
429
430 return 0;
431}
432
433/********************************************
434 * ¹¦ÄÜ:°´µ±Ç°¶¨Ê±Æ÷Ê£Óàʱ¼ä¸üж¨Ê±Æ÷
435 *******************************************/
436static void update_timer_remain(int new_remian)
437{
438 if (list_empty(&rtc_timer_list)) {
439 return;
440 }
441 int ret, remain_time;
442 ALARM_T *pTmp;
443 //list_entry(pTmp, &rtc_timer_list, list);
444 pTmp = list_entry(rtc_timer_list.next, ALARM_T, list);
445
446#ifdef PRODUCT_NOT_USE_RTC
447 time_t cur = time(NULL);
448 remain_time = g_set_softtime + pTmp->remain_time - cur;
449 if ((remain_time > pTmp->remain_time) || (remain_time <= 0)) {
450 slog(RTC_PRINT, SLOG_ERR, "rtc-service: cur:%u, set:%u, remain:%u, inveral:%u\n", cur, g_set_softtime, remain_time, pTmp->remain_time);
451 //ʱ¼ä·¢Éú¹ýÖØÖõȣ¬Ö±½ÓÉèÖö¨Ê±Æ÷µ½£¬¸÷Ä£¿éÓ¦ÔÚÊÕµ½RTC_MSG_TIME_CHANGEDÏûϢʱ¼°Ê±¸üж¨Ê±Æ÷
452 remain_time = 0;
453 }
454#else
455 ret = ioctl(g_rtc_fd, ZX234290_GET_TIMER_REMAIN, &remain_time);
456#endif
457 if (ret < 0) {
458 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add no free alarm remain_time %d %s errno.\n", errno, strerror(errno));
459 // return -1;
460 }
461 //if(remain_time > new_remian)
462 {
463 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: pTmp->remain_time: %d, rtc remain_time: %d \n", pTmp->remain_time, remain_time);
464 alarm_adjust_value(pTmp->remain_time - remain_time);
465 alarm_fix_value(&rtc_timer_list);
466 }
467}
468
469/********************************************
470 * ¹¦ÄÜ:ɾ³ýÏûÏ¢Ô´Ä£¿éµÄËùÓж¨Ê±Æ÷
471 *******************************************/
472static int handle_alarm_del(MSG_BUF *pmsg_buf)
473{
474 RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
475 ALARM_T *pTmp, *pTmp1;
476 int wakeup = 0;
477
478 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del enter.\n");
479 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list) {
480 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del timer module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
481 buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
482 if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)) {
483 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del timer module:0x%x , src:0x%x \n",
484 buf->module, buf->srcModule );
485 list_del(&pTmp->list);
486 free(pTmp);
487 break;
488 }
489 }
490
491 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list) {
492 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del alarm module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
493 buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
494 if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id)) {
495 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del alarm module:0x%x , src:0x%x \n",
496 buf->module, buf->srcModule );
497 wakeup = pTmp->wakeup;
498 list_del(&pTmp->list);
499 free(pTmp);
500 break;
501 }
502 }
503
504 if(wakeup)
505 save_rtc_alarm();
506
507 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del exit.\n");
508
509 return 0;
510}
511
512/********************************************
513 *¹¦ÄÜ:¶¨Ê±Æ÷³¬Ê±´¦Àí
514 *******************************************/
515static int handle_alarm_timeout(MSG_BUF *pmsg_buf)
516{
517 long ret = -1;
518 ALARM_T *pAlarm;
519 RTC_DATA_BUF buf = {0};
520 long rtc_report_time = 0;
521 long alarm_node_time = 0;
522 enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
523 int wakeup = 0;
524
525 if (cmd == RTC_MSG_TIMER_TIMEOUT && !list_empty(&rtc_timer_list)) {
526 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: rtc timer timeout\n");
527 pAlarm = list_entry(rtc_timer_list.next, ALARM_T, list);
528 } else if (cmd == RTC_MSG_ALARM_TIMEOUT && !list_empty(&rtc_alarm_list)) {
529 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: rtc alarm timeout\n");
530 pAlarm = list_entry(rtc_alarm_list.next, ALARM_T, list);
531 rtc_report_time = atol(pmsg_buf->aucDataBuf);
532 if (rtc_report_time < 0 || rtc_report_time > LONG_MAX-1)
533 {
534 rtc_report_time = 0;
535 }
536 alarm_node_time = pAlarm->interval + pAlarm->time_val;
537 if((rtc_report_time>alarm_node_time && (rtc_report_time-alarm_node_time)>g_time_offset)
538 ||(alarm_node_time>rtc_report_time && (alarm_node_time-rtc_report_time)>g_time_offset))
539 {
540 slog(RTC_PRINT, SLOG_ERR, "rtc-service: rtc node was deleted, timeout unexpected; node:%ld, rtc:%ld \n", alarm_node_time, rtc_report_time);
541 alarm_fix_value(&rtc_alarm_list);
542
543 if(pAlarm->wakeup)
544 save_rtc_alarm();
545
546 alarm_restart(&rtc_alarm_list);
547 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart alarm.\n");
548 return 0;
549 }
550 buf.time_val = alarm_node_time;
551 } else {
552 slog(RTC_PRINT, SLOG_ERR, "rtc-service: timeout unexpected\n");
553 return -1;
554 }
555
556 wakeup = pAlarm->wakeup;
557 list_del(&pAlarm->list);
558 buf.module = pAlarm->rtc_id;
559 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: target:0x%x, rtc_id:0x%x, utc:%d \n", pAlarm->module_id, buf.module, pAlarm->is_utc);
560 ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, pAlarm->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
561 if (ret != 0) {
562 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected\n");
563 }
564
565 if (pAlarm->is_utc == 0) {
566 alarm_adjust_value(pAlarm->remain_time);
567 alarm_fix_value(&rtc_timer_list);
568 alarm_restart(&rtc_timer_list);
569 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart imer.\n");
570 } else {
571 alarm_fix_value(&rtc_alarm_list);
572 if(wakeup)
573 save_rtc_alarm();
574 alarm_restart(&rtc_alarm_list);
575 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart alarm.\n");
576 }
577
578 free(pAlarm);
579 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout exit.\n");
580 return 0;
581}
582
583/********************************************
584 * ¹¦ÄÜ:ɾ³ý¹Ø»ú²»±£´æµÄ¶¨Ê±Æ÷
585 *******************************************/
586static void handle_del_all(MSG_BUF *pmsg_buf)
587{
588 ALARM_T *pTmp, *pTmp1;
589
590 update_timer_remain(0);
591 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list) {
592 if (pTmp->wakeup == 0) {
593 list_del(&pTmp->list);
594 free(pTmp);
595 }
596 }
597 alarm_restart(&rtc_timer_list);
598
599 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list) {
600 if (pTmp->wakeup == 0) {
601 list_del(&pTmp->list);
602 free(pTmp);
603 }
604 }
605 alarm_restart(&rtc_alarm_list);
606}
607
608/********************************************
609 * ¹¦ÄÜ:sntpͬ²½³É¹¦ºó£¬¸üÐÂalarm_list
610 *******************************************/
611static void update_alarm()
612{
613 ALARM_T *pTmp, *pTmp1;
614 //long sec = get_RtcTime();
615 long sec = time(0);
616 RTC_DATA_BUF buf = {0};
617
618#ifdef PRODUCT_NOT_USE_RTC
619 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list) {
620 buf.module = pTmp->rtc_id;
621 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
622 if (pTmp->interval + pTmp->time_val < sec) {
623 list_del(&pTmp->list);
624 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: delete ELAPSED timer, alarm_id(%d), alarm_time(%ld).\n", pTmp->rtc_id, (pTmp->interval + pTmp->time_val));
625 free(pTmp);
626 } else {
627 pTmp->remain_time = pTmp->interval + pTmp->time_val - sec;
628 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: timer adjust, alarm_id(%d), alarm_time(%ld), remain(%ld).\n", pTmp->rtc_id, (pTmp->interval + pTmp->time_val), pTmp->remain_time);
629 }
630 }
631 alarm_restart(&rtc_timer_list);
632#else
633 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list) {
634 buf.module = pTmp->rtc_id;
635 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
636 if (pTmp->interval + pTmp->time_val < sec) {
637 list_del(&pTmp->list);
638 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: delete ELAPSED alarm, alarm_id(%d), alarm_time(%ld).\n", pTmp->rtc_id, (pTmp->interval + pTmp->time_val));
639 free(pTmp);
640 }
641 }
642 alarm_restart(&rtc_alarm_list);
643#endif
644 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: update_alarm exit cur_rtc_time: % ld.\n", sec);
645}
646
647/********************************************
648 * ¹¦ÄÜ:¸üж¨Ê±Æ÷Ê£Óàʱ¼ä
649 *******************************************/
650static void alarm_adjust_value(int time)
651{
652 ALARM_T * temp;
653 list_for_each_entry(temp, &rtc_timer_list, list) {
654 temp->remain_time -= time;
655 }
656}
657
658/********************************************
659 *¹¦ÄÜ: ɾ³ýÎÞЧ¶¨Ê±Æ÷
660 *******************************************/
661static void alarm_fix_value(struct list_head *rtc_list)
662{
663 ALARM_T *pTmp, *pTmp1;
664 RTC_DATA_BUF buf = {0};
665 int wakeup = 0;
666
667 if (rtc_list == &rtc_timer_list) {
668 list_for_each_entry_safe(pTmp, pTmp1, rtc_list, list) {
669 if (pTmp->remain_time <= 0) {
670 buf.module = pTmp->rtc_id;
671 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
672 list_del(&pTmp->list);
673 free(pTmp);
674 }
675 }
676 } else if (rtc_list == &rtc_alarm_list) {
677 list_for_each_entry_safe(pTmp, pTmp1, rtc_list, list) {
678 if (pTmp->time_val + pTmp->interval <= (time(0) + g_time_offset)) {
679 if(pTmp->wakeup)
680 wakeup = pTmp->wakeup;
681
682 buf.module = pTmp->rtc_id;
683 buf.time_val = pTmp->time_val + pTmp->interval;
684 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
685 list_del(&pTmp->list);
686 free(pTmp);
687 }
688 }
689
690 if(wakeup)
691 save_rtc_alarm();
692 }
693 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_fix_value exit.\n");
694}
695
696#ifdef PRODUCT_NOT_USE_RTC
697/*¶ÔӦûÓÐrtcµÄ²úÆ·£¬rtc¶¨Ê±Æ÷ÊÊÅäµ½softtimerµÄ»Øµ÷º¯Êý*/
698static void rtc_set_softtimer_cb(void *param)
699{
700 int ret = -1;
701
702 slog(NET_PRINT, SLOG_ERR, "rtc-service: rtc_adapt_softtimer_cb \n");
703
704 ret = ipc_send_message(MODULE_ID_RTC_SERVICE, MODULE_ID_RTC_SERVICE, RTC_MSG_TIMER_TIMEOUT, 0, 0, 0);;
705 if (ret != 0) {
706 slog(MISC_PRINT, SLOG_ERR, "rtc-service: set rtc timer send msg failed \n");
707 }
708 return 0;
709}
710#endif
711
712/********************************************
713 * ¹¦ÄÜ:ÖØÆô¶¨Ê±Æ÷£¬Ã»ÓÐÔò¹Ø±Õ¶¨Ê±Æ÷
714 *******************************************/
715static void alarm_restart(struct list_head *rtc_list)
716{
717 int ret = 0;
718 //struct tm *p_tm = 0;
719 struct tm ret_tm = {0};
720 struct rtc_wkalrm alarm = {0};
721 long tVal = 0;
722 long remain = -1;
723 ALARM_T *ptmp = NULL;
724 long cur_rtc_time = time(0);
725 RTC_DATA_BUF buf = {0};
726NEXT:
727 if (!list_empty(rtc_list)) {
728 ptmp = list_entry(rtc_list->next, ALARM_T, list);
729 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_restart enter.\n");
730 memset(&buf, 0, sizeof(RTC_DATA_BUF));
731 if (ptmp->is_utc == 0) {
732#ifdef PRODUCT_NOT_USE_RTC
733 g_set_softtime = time(NULL);
734 DeleteSoftTimer(RTC_USE_SOFTTIMER_ID);
735 ret = CreateSoftTimer(RTC_USE_SOFTTIMER_ID, TIMER_FLAG_ONCE, ptmp->remain_time*1000, rtc_set_softtimer_cb, NULL);
736#else
737 ret = ioctl(g_rtc_fd, ZX234290_SET_TIMER, ptmp->remain_time);
738#endif
739 if (ret != 0) {
740 slog(RTC_PRINT, SLOG_ERR, "rtc-service: alarm_restart timer: set failed, ret:%d \n", ret);
741 return;
742 }
743 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart: set timer ok, remain_time:%ld, cur_rtc_time:%ld, module:0x%x, rtc_id:0x%x\n", ptmp->remain_time, cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
744 } else {
745 tVal = ptmp->interval + ptmp->time_val;
746 remain = tVal - cur_rtc_time;
747 if (remain <= g_time_offset) {
748 //¹ýʱ¶¨Ê±Æ÷¶ªÆú´¦Àí£¬Èç¹û¶àÄ£¿éÕýºÃÉèµÄ»ù±¾ÔÚͬһ¸öʱ¼äµã£¬ºóÕ߻ᱻ¶ªÆú£¬¿¼ÂÇÐ޸ijÉÖ±½Ó֪ͨģ¿éʱ¼äµ½
749 slog(RTC_PRINT, SLOG_ERR, "rtc-service: remain time error, time_set:%ld, remain:%ld, alarmer:%ld, interval:%ld, current:%ld, module:0x%x, rtc_id:0x%x\n", ptmp->time_val, remain, tVal, ptmp->interval, cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
750 buf.module = ptmp->rtc_id;
751 buf.time_val = ptmp->time_val + ptmp->interval;
752 ipc_send_message2(MODULE_ID_RTC_SERVICE, ptmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), (unsigned char*)&buf, 0);
753 list_del(&ptmp->list);
754 free(ptmp);
755 ptmp = NULL;
756 goto NEXT;
757 }
758
759 //localtime_r(&tVal, &ret_tm);
760 gmtime_r(&tVal, &ret_tm);
761 memcpy(&alarm.time, &ret_tm, sizeof(struct rtc_time));
762 alarm.enabled = 1;
763
764 /*Ê×ÏÈ´ò¿ªalarm ÖжÏ*/
765 ret = ioctl(g_rtc_fd, RTC_AIE_ON);
766 if (ret != 0) {
767 slog(RTC_PRINT, SLOG_ERR, "rtc-service: open alarm failed, ret:%d\n", ret);
768 return;
769 }
770
771 /*ÉèÖÃalarm ʱ¼ä*/
772 ret = ioctl(g_rtc_fd, RTC_WKALM_SET, &alarm);
773 if (ret != 0) {
774 slog(RTC_PRINT, SLOG_ERR, "rtc-service: set alarm failed, ret:%d\n", ret);
775 return;
776 }
777 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart set alarm ok, remain_time:%ld, cur_rtc_time:%ld, module:0x%x, rtc_id:0x%x \n", remain, cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
778 }
779 } else {
780 if (rtc_list == &rtc_timer_list) {
781 //¹Ø±Õrtc time, Éè¼ä¸ôʱ¼äΪ0
782 ret = ioctl(g_rtc_fd, ZX234290_TIMER_ENABLED, 0);
783 if (ret != 0) {
784 slog(RTC_PRINT, SLOG_ERR, "rtc-service: disable timer failed, ret:%d\n", ret);
785 return;
786 }
787 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart disable timer ok \n");
788 } else {
789 /*¹Ø±Õalarm ÖжÏ*/
790 ret = ioctl(g_rtc_fd, RTC_AIE_OFF);
791 if (ret != 0) {
792 slog(RTC_PRINT, SLOG_ERR, "rtc-service: disable alarm failed, ret:%d\n", ret);
793 return;
794 }
795 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart disable alarm ok \n");
796 }
797 }
798 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_restart exit.\n");
799}
800
801static void rtc_set_local_time(MSG_BUF *msg)
802{
803 struct tm set_tm = {0};
804 struct timeval time_tv;
805
806 slog(RTC_PRINT, SLOG_DEBUG, "rtc_set_local_time, %d, %d \n", sizeof(struct tm), msg->usDataLen);
807
808 memcpy(&set_tm, msg->aucDataBuf, msg->usDataLen);
809
810 slog(RTC_PRINT, SLOG_ERR, "rtc_set_local_time, year:%d, month:%d, day:%d, hour:%d, min:%d, sec:%d, wday:%d \n",
811 set_tm.tm_year, set_tm.tm_mon, set_tm.tm_mday, set_tm.tm_hour, set_tm.tm_min, set_tm.tm_sec, set_tm.tm_wday);
812
813 time_tv.tv_sec = mktime(&set_tm);
814 if(time_tv.tv_sec < 0)
815 {
816
817 slog(RTC_PRINT, SLOG_DEBUG, "mktime fail, set time_tv.tv_sec to 0 \n");
818 time_tv.tv_sec = 0;
819 }
820 time_tv.tv_usec = 0;
821
822 if (0 != settimeofday(&time_tv, NULL))
823 slog(RTC_PRINT, SLOG_ERR, "rtc_set_local_time failed \n");
824}
825
826/********************************************
827 * process_msg
828 * handle the specified MSG.
829 *******************************************/
830static int process_msg(MSG_BUF *pmsg_buf)
831{
832 enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
833 unsigned short req_cmd = 0;
834
835 switch (cmd) {
836 case RTC_MSG_GET_TIME:
837 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_GET_TIME, src:0x%x.\n", pmsg_buf->src_id);
838 handle_get_time(pmsg_buf);
839 break;
840 case RTC_MSG_SET_TIME:
841 security_log(pmsg_buf->src_id,"set time");
842 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_SET_TIME, src:0x%x.\n", pmsg_buf->src_id);
843 handle_set_time(pmsg_buf);
844 update_alarm();
845 break;
846 case RTC_MSG_ADD_ALARM:
847 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_ADD_ALARM, src:0x%x, g_clean_flag = %d.\n", pmsg_buf->src_id, g_clean_flag);
848 //Ìí¼ÓrtcǰÏÈɾ³ý´Ërtc_idÒÑÌí¼Ó¼Ç¼£¬Ã¿¸örtc_idÖ»±£Áô1¸ö¶¨Ê±Æ÷
849 if(0 == g_clean_flag){
850 update_timer_remain(0);
851 handle_alarm_del(pmsg_buf);
852 handle_alarm_add(pmsg_buf);
853 }
854 else{
855 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: g_clean_flag is nonzero:0x%x, dont add alarm.\n", g_clean_flag);
856 }
857
858 //wifi´¦ÀíÍêǰ²»ÄÜÐÝÃߣ¬ÔÝʱʹÓÃÑÓÊ±Ëø£¬´ý·½°¸×鏸³ö·½°¸ºóÔÙµ÷Õû
859 //if (pmsg_buf->usSourceModuleID == MODULE_ID_WDT)
860 //write_lockfile("/sys/power/wake_unlock", "rtc_io_time_timeout_lock");
861
862 break;
863 case RTC_MSG_DEL_ALARM:
864 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_DEL_ALARM, src:0x%x.\n", pmsg_buf->src_id);
865 update_timer_remain(0);
866 handle_alarm_del(pmsg_buf);
867 alarm_restart(&rtc_timer_list);
868 alarm_restart(&rtc_alarm_list);
869 break;
870 case RTC_MSG_ALARM_TIMEOUT:
871 case RTC_MSG_TIMER_TIMEOUT:
872 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_TIMEOUT, src:0x%x, cmd:0x%x.\n", pmsg_buf->src_id, cmd);
873 handle_alarm_timeout(pmsg_buf);
874 break;
875 case RTC_MSG_DEL_ALL:
876 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_DEL_ALL, src:0x%x.\n", pmsg_buf->src_id);
877 memcpy(&req_cmd, pmsg_buf->aucDataBuf, sizeof(unsigned short));
878 if(MSG_CMD_RESET_RSP == req_cmd || MSG_CMD_POWEROFF_RSP == req_cmd || MSG_CMD_RESTART_RSP == req_cmd){
879 g_clean_flag = req_cmd;
880 }
881 handle_del_all(pmsg_buf);
882 save_rtc_alarm();
883 //ÕâÀﻹÐèҪ֪ͨÖ÷¿Ø
884 ipc_send_message(MODULE_ID_RTC_SERVICE, pmsg_buf->src_id, req_cmd, 0, 0, 0);
885 break;
886
887 default:
888 break;
889 }
890 return 0;
891}
892
893static int rtc_service_sock_init()
894{
895 int sockfd = 0;
896 int ret;
897 struct sockaddr_nl snl;
898
899 bzero(&snl, sizeof(struct sockaddr_nl));
900 snl.nl_family = AF_NETLINK;
901 snl.nl_pid = getpid();
902 snl.nl_groups = 1;
903
904 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
905 perror ("signal");
906
907 sockfd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
908 if (sockfd < 0)
909 {
910 slog(RTC_PRINT,SLOG_ERR, "create rtc service socket failed!\n");
911 return -1;
912 }
913// setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
914
915 ret = bind(sockfd, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
916 if (ret < 0)
917 {
918 slog(RTC_PRINT,SLOG_ERR, "rtc service socket bind fail!\n");
919 close(sockfd);
920 return -1;
921 }
922
923 return sockfd;
924}
925//change@/devices/platform/zx29_i2c.0/i2c-0/0-0012/zx234290-rtc
926static int rtc_time_msg_parse(const char *msg, int msglen)
927{
928 int offlen = 0;
929 const char *keys = NULL;
930 char* timeStr = NULL;
931 char *pSec = NULL;
932 slog(RTC_PRINT,SLOG_ERR, "[%s][%d] zx234290-rtc \n", __func__, __LINE__);
933
934 offlen += strlen((char *)msg) + 1;
935 while (offlen <= msglen) {
936 keys = (char *)(msg + offlen);
937 //slog(NET_PRINT,SLOG_ERR, "[%s][%d] zx234290-rtc%s, %d\n", __func__, __LINE__, keys, offlen);
938 if (strncmp(keys, RTC_ALARM_TIMEOUT_MSG, strlen(RTC_ALARM_TIMEOUT_MSG)) == 0)
939 {
940#if 1 // cov M DEADCODE
941 pSec = strstr(keys, "sec:");
942 if (pSec == NULL) {
943 slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event no sec \n");
944 return -1;
945 }
946 timeStr = pSec + strlen("sec:");
947
948#else
949 timeStr = strstr(keys, "sec:") + strlen("sec:");
950 if (timeStr == NULL) {
951 slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event no sec \n");
952 return -1;
953 }
954#endif
955 ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_ALARM_TIMEOUT, strlen(timeStr), timeStr, 0);
956 slog(RTC_PRINT,SLOG_NORMAL, "zx234290-rtc alarm timeout \n");
957 return 0;
958 }
959 else if (strncmp(keys, RTC_TIMER_TIMEOUT_MSG, strlen(keys)) == 0)
960 {
961 ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_TIMER_TIMEOUT, 0, NULL, 0);
962 slog(RTC_PRINT,SLOG_NORMAL, "zx234290-rtc timer timeout \n");
963 return 0;
964 }
965 offlen += strlen((char *)keys) + 1;
966 }
967 slog(RTC_PRINT,SLOG_ERR, "zx234290-rtc event not supported \n");
968 return -1;
969}
970
971/********************************************
972 * rtc_service_thread_process
973 * looper for processing zx234290-rtc msg.
974 *******************************************/
975void rtc_event_process(void)
976{
977 int rtc_service_fd = 0;
978 fd_set readfds;
979 int maxfd = 0;
980 char buf[RTC_MSG_BUFFER_SIZE] = {0};
981 int len = 0;
982 int ret = 0;
983 prctl(PR_SET_NAME, "rtceventhandle", 0, 0, 0);
984 rtc_service_fd = rtc_service_sock_init();
985 if(rtc_service_fd < 0)
986 {
987 slog(RTC_PRINT,SLOG_ERR, "rtc service socket init fail!\n");
988 return ;
989 }
990
991 maxfd = rtc_service_fd;
992 while (1)
993 {
994 FD_ZERO(&readfds);
995 FD_SET(rtc_service_fd, &readfds);
996
997 ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
998 if (ret == -1 && errno == EINTR)
999 continue;
1000
1001 if(FD_ISSET(rtc_service_fd, &readfds))
1002 {
1003 memset(buf, 0, sizeof(buf));
1004 len = recv(rtc_service_fd, &buf, sizeof(buf), 0);
1005 if(len <= 0)
1006 {
1007 slog(RTC_PRINT,SLOG_ERR, "rtc service socket recv msg fail!\n");
1008 continue;
1009 }
1010
1011 /*½øÐÐueventÏûÏ¢½âÎö£¬·µ»Ø½âÎö½á¹û*/
1012 if (strstr(buf, "zx234290-rtc")){
1013 rtc_time_msg_parse(buf, len);
1014 }
1015 continue;
1016 }
1017 }
1018}
1019
1020/********************************************
1021 * msg_looper
1022 * main looper for processing MSG.
1023 *******************************************/
1024static void msg_looper(void)
1025{
1026 int ret = 0;
1027 int msg_id = 0;
1028 MSG_BUF msg_buf = {0};
1029// key_t msgkey = get_msg_key();
1030
1031 msg_id = msgget(MODULE_ID_RTC_SERVICE, IPC_CREAT | 0600);
1032
1033 memset(&msg_buf, 0, sizeof(msg_buf));
1034
1035 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: msg_looper enter(msgid=%d)&waiting...\n", msg_id);
1036 while (1) {
1037 ret = msgrcv(msg_id, &msg_buf, sizeof(MSG_BUF) - sizeof(long), 0, 0);
1038 wake_rtc_lock();
1039 if (ret <= 0) {
1040 slog(RTC_PRINT, SLOG_ERR, "rtc-service: msg_looper recv msg break(%d)\n", ret);
1041 wake_rtc_unlock();
1042 continue;
1043 }
1044 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: msg_looper process_msg in, src:0x%x, target:0x%x.\n", msg_buf.src_id, msg_buf.dst_id);
1045
1046 process_msg(&msg_buf);
1047
1048 slog(RTC_PRINT, SLOG_ERR, "rtc-service: msg_looper process_msg out.\n");
1049 wake_rtc_unlock();
1050 }
1051}
1052
1053static void print_rtc_list_info(void)
1054{
1055 ALARM_T *temp = NULL;
1056 int remain_time;
1057
1058 if(ioctl(g_rtc_fd, ZX234290_GET_TIMER_REMAIN, &remain_time) < 0) // cov M CHECKED_RETURN
1059 {
1060 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
1061 }
1062
1063
1064 slog(RTC_PRINT, SLOG_ERR, "rtc-service: rtc remain_time :%ld \n", remain_time);
1065
1066 if (!list_empty(&rtc_timer_list)) {
1067 list_for_each_entry(temp, &rtc_timer_list, list) {
1068 slog(RTC_PRINT,SLOG_ERR, "rtc-service rtc_alarm_list node rtc_id:0x%x, module_id:0x%x, time_val:%ld, remain_time:%ld, cpu:%d\n",
1069 temp->rtc_id,
1070 temp->module_id,
1071 temp->time_val,
1072 temp->remain_time,
1073 temp->cpu);
1074 }
1075 }
1076 else {
1077 slog(RTC_PRINT,SLOG_ERR, "rtc-service rtc_timer_list is empty!");
1078 }
1079
1080 if (!list_empty(&rtc_alarm_list)) {
1081 list_for_each_entry(temp, &rtc_alarm_list, list) {
1082 slog(RTC_PRINT,SLOG_ERR, "rtc-service rtc_alarm_list node rtc_id:0x%x, module_id:0x%x, time_val:%ld, remain_time:%ld, cpu:%d, \
1083 rtc_tm.tm_year:%d, rtc_tm.tm_mon:%d, rtc_tm.tm_mday:%d, rtc_tm.tm_min:%d, rtc_tm.tm_sec:%d \n",
1084 temp->rtc_id,
1085 temp->module_id,
1086 temp->time_val,
1087 temp->remain_time,
1088 temp->cpu,
1089 temp->rtc_tm.tm_year, temp->rtc_tm.tm_mon, temp->rtc_tm.tm_mday, temp->rtc_tm.tm_min, temp->rtc_tm.tm_sec);
1090 }
1091 }
1092 else {
1093 slog(RTC_PRINT,SLOG_ERR, "rtc-service rtc_alarm_list is empty!");
1094 }
1095}
1096
1097/* ÐźŴ¦Àí*/
1098static void sig_usr(int signo)
1099{
1100#if 0//(APP_OS_TYPE == APP_OS_LINUX)
1101 if (signo == SIGUSR1)
1102 {
1103 slog(RTC_PRINT,SLOG_NORMAL, "rtc-service receive SIGUSR1! \n");
1104 print_rtc_list_info();
1105 }
1106 else
1107 {
1108 slog(RTC_PRINT,SLOG_ERR, "rtc-service receive signo:%d", signo);
1109 }
1110#endif
1111}
1112
1113/*RTCÏûÏ¢½âÎö*/
1114int rtc_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)
1115{
1116 if (strstr(msg, "zx234290-rtc")){
1117 rtc_time_msg_parse(msg, msglen);
1118 }
1119 return -1;
1120}
1121
1122/********************************************
1123 * main
1124 * entry of RTC-Service!
1125 *******************************************/
1126int rtc_service_main(int argc, char **argv)
1127{
1128
1129 slog(RTC_PRINT,SLOG_DEBUG, "rtc-service enter...\n");
1130 pthread_t rtcservice_thread_id;
1131 pthread_attr_t attr;
1132 int result = 0;
1133 prctl(PR_SET_NAME, "rtc-service", 0, 0, 0);
1134
1135 //¸ù¾ÝNV³õʼ»¯´òÓ¡¼¶±ð£¬²¢×¢²á¶¯Ì¬µ÷Õû´òÓ¡¼¶±ðÐźÅÁ¿
1136 loglevel_init();
1137
1138 if (signal(SIGUSR1, sig_usr) == SIG_ERR)
1139 {
1140 slog(RTC_PRINT,SLOG_ERR, "rtc-service not catch SIGUSR1 \n");
1141 }
1142
1143 INIT_LIST_HEAD(&rtc_timer_list);
1144 INIT_LIST_HEAD(&rtc_alarm_list);
1145
1146 g_clean_flag = 0;
1147
1148 //rtcÔÚAPʱ£¬½Úµã±ØÐë´ò¿ª³É¹¦£»ÔÚÆäËûºËʱÓÉÆäËûºËÅжÏ
1149 if ((g_rtc_fd = open_rtc()) < 0) {
1150 slog(RTC_PRINT, SLOG_ERR, "Cannt open rtc dev!\n");
1151 return -1;
1152 }
1153 init_rtc_alarm();
1154/*
1155 pthread_attr_init(&attr);
1156 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1157 result = pthread_create(&rtcservice_thread_id, &attr, rtc_event_process, NULL);
1158 pthread_attr_destroy(&attr);
1159 if(result != 0)
1160 {
1161 slog(RTC_PRINT,SLOG_ERR, "[rtc-service] rtcservice_thread pthread_create faild!\n");
1162 return -1;
1163 }
1164 else
1165 {
1166 printf("[rtc-service] rtcservice_thread pthread_create SUCCESS!\n");
1167 }
1168*/
1169 hotplug_parse_register(DEVICE_TYPE_APP_RTC, rtc_app_msg_parse);
1170 msg_looper();
1171 //klocwork
1172 //close_rtc(g_rtc_fd);
1173
1174 //slog(RTC_PRINT, SLOG_ERR, "rtc-service exit...\n");
1175
1176 return 0;
1177}