blob: fb159e55124a732e89d76f84ef893d9d0590948d [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -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#include <limits.h>
20
21/*******************************************************************************
22 * Global variable definitions *
23 ******************************************************************************/
24int g_rtc_fd = 0;
25struct list_head rtc_timer_list;
xf.li9d1a0e12023-09-20 01:43:20 -070026struct list_head rtc_alarm_list;
lh9ed821d2023-04-07 01:36:19 -070027#define RTC_ALARM_TIMEOUT_MSG "PMIC RTC ALARM IRQ COME"
28#define RTC_TIMER_TIMEOUT_MSG "PMIC RTC TIMER IRQ COME"
29
30#ifdef PRODUCT_NOT_USE_RTC
31time_t g_set_softtime;
32#define RTC_USE_SOFTTIMER_ID 300 //µ±Ã»ÓÐrtcʱ£¬Ô­ÏÈʹÓÃrtc¶¨Ê±Æ÷µÄÓÐrtcͳһÊÊÅäµ½softtimerÉÏ£¬Õû¸ö¿ò¼Ü²»±ä
33#endif
34/*******************************************************************************
35 * Local variable definitions *
36 ******************************************************************************/
37static pthread_t rtc_looper_id = 0;
38static int g_clean_flag = 0;
39static int g_time_offset = 2; //ÔÊÐíÎó²î·¶Î§£¬ÊÊÅärtcºÍOSʱÖÓÆµÂʲ»Ò»ÖÂÎÊÌâ
40/*******************************************************************************
41 * Local function implementations *
42 ******************************************************************************/
43static int open_rtc(void);
44static void close_rtc(int fd);
45static void* rtc_looper();
46static int start_rtc_thread();
47static int handle_get_time(MSG_BUF *pmsg_buf);
48static int handle_set_time(MSG_BUF *pmsg_buf);
49static int handle_alarm_add(MSG_BUF *pmsg_buf);
50static int handle_alarm_del(MSG_BUF *pmsg_buf);
51static int handle_alarm_timeout(MSG_BUF *pmsg_buf);
52static int process_msg(MSG_BUF *pmsg_buf);
xf.li6c8fc1e2023-08-12 00:11:09 -070053static int process_msg_rtc_cap(MSG_BUF *pmsg_buf);
lh9ed821d2023-04-07 01:36:19 -070054static void msg_looper(void);
55static void update_timer_remain(int new_remian);
56static void alarm_fix_value(struct list_head *rtc_list);
57static void alarm_restart(struct list_head *rtc_list);
58static void update_alarm();
59static void alarm_adjust_value(int time);
60static long get_RtcTime();
61static void convert_time(time_t timeSec, struct tm * tmTime, TIME_CONVERT_TYPE type);
62static void convert_time(time_t timeSec, struct tm * tmTime, TIME_CONVERT_TYPE type)
63{
64 time_t tmpTime = 0;
xf.li9d1a0e12023-09-20 01:43:20 -070065 if (tmTime == NULL)
66 {
lh9ed821d2023-04-07 01:36:19 -070067 slog(RTC_PRINT, SLOG_ERR, "rtc-service: wrong input param, check it! \n");
68 return ;
69 }
70 tmpTime = timeSec;
xf.li9d1a0e12023-09-20 01:43:20 -070071
72 if (type == CONVERT_TYPE_RTC)
73 {
lh9ed821d2023-04-07 01:36:19 -070074 gmtime_r((time_t*)&tmpTime, tmTime);
75 }
xf.li9d1a0e12023-09-20 01:43:20 -070076 else
77 {
lh9ed821d2023-04-07 01:36:19 -070078 localtime_r((time_t*)&tmpTime, tmTime);
79 }
xf.li9d1a0e12023-09-20 01:43:20 -070080
81 slog(RTC_PRINT, SLOG_DEBUG,
82 "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",
83 mktime(tmTime), tmTime->tm_year, tmTime->tm_mon, tmTime->tm_hour, tmTime->tm_min, tmTime->tm_sec, tmTime->tm_yday,
84 tmTime->tm_mday, tmTime->tm_wday);
lh9ed821d2023-04-07 01:36:19 -070085
86}
87
88static long get_RtcTime()
89{
xf.li9d1a0e12023-09-20 01:43:20 -070090 long curRtcTime = 0;
lh9ed821d2023-04-07 01:36:19 -070091 struct rtc_time rtc_tm = {0};
92 struct tm tmp = {0};
xf.li9d1a0e12023-09-20 01:43:20 -070093 if (g_rtc_fd <= 0)
94 {
lh9ed821d2023-04-07 01:36:19 -070095 slog(RTC_PRINT, SLOG_ERR, "rtc-service: g_rtc_fd: %d , invalid fd. \n", g_rtc_fd);
96 return -1;
97 }
xf.li9d1a0e12023-09-20 01:43:20 -070098
99 if (ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) // cov M CHECKED_RETURN
100 {
101 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
102 }
lh9ed821d2023-04-07 01:36:19 -0700103 tmp.tm_sec = rtc_tm.tm_sec;
xf.li9d1a0e12023-09-20 01:43:20 -0700104 tmp.tm_min = rtc_tm.tm_min;
105 tmp.tm_hour = rtc_tm.tm_hour;
106 tmp.tm_mon = rtc_tm.tm_mon;
107 tmp.tm_year = rtc_tm.tm_year;
108 tmp.tm_mday = rtc_tm.tm_mday;
109 tmp.tm_wday = rtc_tm.tm_wday;
110 tmp.tm_yday = rtc_tm.tm_yday;
111 tmp.tm_isdst = rtc_tm.tm_isdst;
112
lh9ed821d2023-04-07 01:36:19 -0700113 curRtcTime = mktime(&tmp);
114 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: curRtcTime: %ld . \n", curRtcTime);
115 return curRtcTime;
116}
117static void write_lockfile(char *filepath, char *setbuf)
118{
xf.li9d1a0e12023-09-20 01:43:20 -0700119 int f, len = 0;
lh9ed821d2023-04-07 01:36:19 -0700120
xf.li9d1a0e12023-09-20 01:43:20 -0700121 f = open(filepath, O_RDWR);
122 if (f == -1)
123 {
124 return;
125 }
lh9ed821d2023-04-07 01:36:19 -0700126
xf.li9d1a0e12023-09-20 01:43:20 -0700127 len = strlen(setbuf);
128 if (write(f, setbuf, len) != len)
129 {
130 }
131 else
132 {
133 }
134 close(f);
lh9ed821d2023-04-07 01:36:19 -0700135}
136
137
138static void wake_rtc_lock()
139{
xf.li9d1a0e12023-09-20 01:43:20 -0700140 write_lockfile("/sys/power/wake_lock", "rtc_lock");
lh9ed821d2023-04-07 01:36:19 -0700141}
142
143static void wake_rtc_unlock()
144{
xf.li9d1a0e12023-09-20 01:43:20 -0700145 write_lockfile("/sys/power/wake_unlock", "rtc_lock");
lh9ed821d2023-04-07 01:36:19 -0700146}
147
148static void wake_rtc_io_lock()
149{
xf.li9d1a0e12023-09-20 01:43:20 -0700150 write_lockfile("/sys/power/wake_lock", "rtc_io_lock");
lh9ed821d2023-04-07 01:36:19 -0700151}
152
153static void wake_rtc_io_unlock()
154{
xf.li9d1a0e12023-09-20 01:43:20 -0700155 write_lockfile("/sys/power/wake_unlock", "rtc_io_lock");
lh9ed821d2023-04-07 01:36:19 -0700156}
157
158static void wake_timeout_lock(char *lockname, unsigned long interval)
159{
xf.li9d1a0e12023-09-20 01:43:20 -0700160 char cmd[100] = {0};
161 sprintf(cmd, "echo %s %lu > /sys/power/wake_lock", lockname, interval);
162 soft_system(cmd);
lh9ed821d2023-04-07 01:36:19 -0700163}
164
165static int init_rtc_alarm(void)
166{
xf.li9d1a0e12023-09-20 01:43:20 -0700167 FILE* fp = NULL;
168 int gap_start = 0;
169 int gap_end = 0;
170 size_t size = 0;
171 long cur_rtc_time = 0;
172 ALARM_T* iter = NULL;
173 RTC_DATA_BUF buf = {0};
174 int ret = -1;
lh9ed821d2023-04-07 01:36:19 -0700175
xf.li9d1a0e12023-09-20 01:43:20 -0700176 // cur_rtc_time = get_RtcTime();
177 cur_rtc_time = time(0);
178 if ((fp = (FILE*)fopen(RTC_ALARM_DATA, "rb")) == NULL)
179 {
180 slog(RTC_PRINT, SLOG_ERR, "rtc-service: failed to open %s \n", RTC_ALARM_DATA);
181 return -1;
182 }
lh9ed821d2023-04-07 01:36:19 -0700183
xf.li9d1a0e12023-09-20 01:43:20 -0700184 while (1)
185 {
186 size = fread(&gap_start, sizeof(int), 1, fp);//0xa5a5
187 if (0 == size || gap_start != DATA_S || feof(fp) != 0 )
188 {
189 break;
190 }
lh9ed821d2023-04-07 01:36:19 -0700191
xf.li9d1a0e12023-09-20 01:43:20 -0700192 iter = (ALARM_T*)malloc(sizeof(ALARM_T));
193 if (iter)
194 {
195 memset(iter, 0, sizeof(ALARM_T));
196 }
197 else
198 {
199 fclose(fp);
200 return -1;
201 }
lh9ed821d2023-04-07 01:36:19 -0700202
xf.li9d1a0e12023-09-20 01:43:20 -0700203 size = fread(iter, sizeof(ALARM_T), 1, fp);//struct
204 if (0 == size || feof(fp) != 0) //check the end of the file
205 {
206 memset(iter, 0, sizeof(ALARM_T));//kw
207 free(iter);
208 break;
209 }
lh9ed821d2023-04-07 01:36:19 -0700210
xf.li9d1a0e12023-09-20 01:43:20 -0700211 size = fread(&gap_end, sizeof(int), 1, fp);//0x5a5a
212 if (0 == size || gap_end != DATA_E || feof(fp) != 0)
213 {
214 memset(iter, 0, sizeof(ALARM_T));//kw
215 free(iter);
216 break;
217 }
lh9ed821d2023-04-07 01:36:19 -0700218
xf.li9d1a0e12023-09-20 01:43:20 -0700219 if (iter->interval < 0 || iter->interval > LONG_MAX - 1)
lh9ed821d2023-04-07 01:36:19 -0700220 {
221 iter->interval = 0 ;
222 }
223
224
xf.li9d1a0e12023-09-20 01:43:20 -0700225 if (iter->time_val < 0 || iter->time_val > LONG_MAX - 1)
lh9ed821d2023-04-07 01:36:19 -0700226 {
227 iter->time_val = 0 ;
228 }
229
lh9ed821d2023-04-07 01:36:19 -0700230
xf.li9d1a0e12023-09-20 01:43:20 -0700231 if (cur_rtc_time > iter->interval + iter->time_val)
232 {
233 buf.module = iter->rtc_id;
234 buf.time_val = iter->time_val + iter->interval;
235 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: target:0x%x, rtc_id:0x%x, utc:%d, cur_rtc_time:%ld \n",
236 iter->module_id, buf.module, iter->is_utc, cur_rtc_time);
237 ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, iter->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF),
238 (unsigned char*)&buf, 0);
239 if (ret != 0)
240 {
241 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected\n");
242 }
243 }
244 list_add_tail(&iter->list, &rtc_alarm_list);
245 if (feof(fp) != 0) //check the end of the file
246 {
247 break;
248 }
249 }
250 fclose(fp);
251
252 return 0;
lh9ed821d2023-04-07 01:36:19 -0700253}
254
255static int save_rtc_alarm(void)
256{
xf.li9d1a0e12023-09-20 01:43:20 -0700257 FILE* fp = NULL;
258 int gap_start = DATA_S;
259 int gap_end = DATA_E;
260 ALARM_T *temp = NULL;
lh9ed821d2023-04-07 01:36:19 -0700261
xf.li9d1a0e12023-09-20 01:43:20 -0700262 if ((fp = (FILE*)fopen(RTC_ALARM_DATA, "wb")) == NULL)
263 {
264 slog(RTC_PRINT, SLOG_ERR, "rtc-service: failed to open %s \n", RTC_ALARM_DATA);
265 return -1;
266 }
lh9ed821d2023-04-07 01:36:19 -0700267
xf.li9d1a0e12023-09-20 01:43:20 -0700268 if (!list_empty(&rtc_alarm_list))
269 {
270 list_for_each_entry(temp, &rtc_alarm_list, list)
271 {
272 if (temp->wakeup)
273 {
274 fwrite(&gap_start, sizeof(int), 1, fp);
275 fwrite(temp, sizeof(ALARM_T), 1, fp);
276 fwrite(&gap_end, sizeof(int), 1, fp);
277 }
278 }
279 }
lh9ed821d2023-04-07 01:36:19 -0700280
xf.li9d1a0e12023-09-20 01:43:20 -0700281 fflush(fp);
282 if (fsync(fileno(fp)) < 0)
lh9ed821d2023-04-07 01:36:19 -0700283 {
284 // todo: cov M
xf.li9d1a0e12023-09-20 01:43:20 -0700285 }
286 fclose(fp);
lh9ed821d2023-04-07 01:36:19 -0700287
xf.li9d1a0e12023-09-20 01:43:20 -0700288 return 0;
lh9ed821d2023-04-07 01:36:19 -0700289}
290
291/********************************************
292 ¹¦ÄÜ:´ò¿ªrtc
293 *******************************************/
294static int open_rtc(void)
295{
xf.li9d1a0e12023-09-20 01:43:20 -0700296 int fd = 0;
297 fd = open(RTC_DEV_NAME, O_RDWR);
lh9ed821d2023-04-07 01:36:19 -0700298
xf.li9d1a0e12023-09-20 01:43:20 -0700299 if (fd < 0)
300 {
301 slog(RTC_PRINT, SLOG_ERR, "rtc-service: Open %s error!\n", RTC_DEV_NAME);
302 return fd;
303 }
304 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: Open %s OK!\n", RTC_DEV_NAME);
305 return fd;
lh9ed821d2023-04-07 01:36:19 -0700306}
307
308/********************************************
309 ¹¦ÄÜ:¹Ø±Õrtc
310 *******************************************/
311static void close_rtc(int fd)
312{
xf.li9d1a0e12023-09-20 01:43:20 -0700313 if (fd < 0)
314 {
315 return;
316 }
lh9ed821d2023-04-07 01:36:19 -0700317
xf.li9d1a0e12023-09-20 01:43:20 -0700318 close(fd);
lh9ed821d2023-04-07 01:36:19 -0700319}
320
321
322/********************************************
323 * handle_get_time
324 * get RTC time.
325 *******************************************/
326static int handle_get_time(MSG_BUF *pmsg_buf)
327{
xf.li9d1a0e12023-09-20 01:43:20 -0700328 struct rtc_time rtc_tm = {0};
329 int ret = 0;
330 RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
xf.libdd93d52023-05-12 07:10:14 -0700331
xf.li9d1a0e12023-09-20 01:43:20 -0700332 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_get_time NOOPS.\n");
333
334 if (buf->cpu == RTC_CPU_CAP)
335 {
336 int cmd = RTC_MSG_GET_TIME;
337 RTC_DATA_BUF sendbuf = {0};
338 unsigned long cur_sec = 0;
339
340 ret = ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm);
341 slog(RTC_PRINT, SLOG_NORMAL,
342 "rtc-service: handle_get_time tm_year:%d, tm_mon:%d, tm_hour:%d, tm_min:%d, tm_yday:%d, tm_mday:%d, tm_wday:%d.\n",
343 rtc_tm.tm_year, rtc_tm.tm_mon, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_yday, rtc_tm.tm_mday, rtc_tm.tm_wday);
344 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_get_time src_id:0x%x, buf->cpu:%d.\n", buf->srcModule, buf->cpu);
345
346 cur_sec = mktime(&rtc_tm);
347 sendbuf.srcModule = buf->srcModule;
348 sendbuf.cpu = RTC_CPU_AP;
349 sendbuf.ulSec = cur_sec;
350
351 slog(RTC_PRINT, SLOG_NORMAL, "[rtc] handle_get_time: send to cap cmd:0x%x, srcMod:0x%x, cur_sec:%lu \n", cmd,
352 sendbuf.srcModule, sendbuf.ulSec);
353 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&sendbuf);
354 if (ret != 0)
355 {
356 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected,ret:%d\n", ret);;
357 }
358 }
359
360 return 0;
lh9ed821d2023-04-07 01:36:19 -0700361}
362
363/********************************************
364 * ¹¦ÄÜ:ÉèÖÃrtcʱ¼ä
365 *******************************************/
366static int handle_set_time(MSG_BUF *pmsg_buf)
367{
xf.li9d1a0e12023-09-20 01:43:20 -0700368 time_t os_time = 0;
369 struct tm tmTime = {0};
370 struct rtc_time rtc_tm = {0};
371 int ret = 0;
lh9ed821d2023-04-07 01:36:19 -0700372
xf.li9d1a0e12023-09-20 01:43:20 -0700373 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_set_time enter.\n");
374 memcpy(&os_time, pmsg_buf->aucDataBuf, sizeof(time_t));
375 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_set_time enter: set time: %ld \n", os_time);
376 convert_time(os_time, &tmTime, CONVERT_TYPE_RTC);
377 memcpy(&rtc_tm, &tmTime, sizeof(struct rtc_time));
378 slog(RTC_PRINT, SLOG_ERR,
379 "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",
380 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,
381 rtc_tm.tm_mday, rtc_tm.tm_wday);
lh9ed821d2023-04-07 01:36:19 -0700382
xf.li9d1a0e12023-09-20 01:43:20 -0700383 ret = ioctl(g_rtc_fd, RTC_SET_TIME, &rtc_tm);
384 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: RTC_SET_TIME ioctl ret = %d exit.\n", ret);
385 {
386 char buf[32] = {0};
387 snprintf(buf, 32, "AT+ZMMI=2,%d,%d\r\n", 1900 + rtc_tm.tm_year, 1 + rtc_tm.tm_mon);
388 ret = get_modem_info(buf, NULL, NULL);
389 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_set_time ret=%d %s\n", ret, buf);
390 }
391 return 0;
lh9ed821d2023-04-07 01:36:19 -0700392}
393
394/********************************************
xf.li742dd022023-06-08 01:43:32 -0700395 * ¹¦ÄÜ:sntpͬ²½ÏµÍ³Ê±¼ä
396 *******************************************/
397static int handle_sntp_update(MSG_BUF *pmsg_buf)
398{
399 time_t os_time = 0;
xf.li9d1a0e12023-09-20 01:43:20 -0700400 struct timeval time_tv = {0};
401 int ret = 0;
xf.li742dd022023-06-08 01:43:32 -0700402
xf.li9d1a0e12023-09-20 01:43:20 -0700403 memcpy(&os_time, pmsg_buf->aucDataBuf, sizeof(time_t));
xf.li742dd022023-06-08 01:43:32 -0700404
xf.li9d1a0e12023-09-20 01:43:20 -0700405 time_tv.tv_sec = os_time;
406 ret = settimeofday(&time_tv, NULL);
407 if (ret != 0)
408 {
409 slog(RTC_PRINT, SLOG_ERR, "handle_sntp_update is fail,ret:%d \n", ret);
410 }
411 return 0;
xf.li742dd022023-06-08 01:43:32 -0700412}
413
414/********************************************
lh9ed821d2023-04-07 01:36:19 -0700415 * ¹¦ÄÜ:Ôö¼Ó¶¨Ê±Æ÷
416 *******************************************/
417static int handle_alarm_add(MSG_BUF *pmsg_buf)
418{
xf.li9d1a0e12023-09-20 01:43:20 -0700419 //long cur_rtc_time = 0;
lh9ed821d2023-04-07 01:36:19 -0700420
xf.li9d1a0e12023-09-20 01:43:20 -0700421 struct rtc_time rtc_tm = {0};
422 ALARM_T *pAlarm = 0;
lh9ed821d2023-04-07 01:36:19 -0700423
xf.li9d1a0e12023-09-20 01:43:20 -0700424 RTC_DATA_BUF *buf = pmsg_buf->aucDataBuf;
425 ALARM_T *temp = NULL;
426 int mark = 0;
lh9ed821d2023-04-07 01:36:19 -0700427
xf.li9d1a0e12023-09-20 01:43:20 -0700428 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_add enter.\n");
lh9ed821d2023-04-07 01:36:19 -0700429
xf.li9d1a0e12023-09-20 01:43:20 -0700430 if (buf->ulSec <= 0)
431 {
432 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add invalid interval.\n");
433 return -1;
434 }
lh9ed821d2023-04-07 01:36:19 -0700435
xf.li9d1a0e12023-09-20 01:43:20 -0700436 pAlarm = malloc(sizeof(ALARM_T));
437 if (pAlarm == NULL)
438 {
439 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add no memory.\n");
440 return -1;
441 }
lh9ed821d2023-04-07 01:36:19 -0700442
xf.li9d1a0e12023-09-20 01:43:20 -0700443 //»ñÈ¡µ±Ç°Ê±¼ä second
444 if (ioctl(g_rtc_fd, RTC_RD_TIME, &rtc_tm) < 0) // cov M CHECKED_RETURN
445 {
446 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
447 }
448 memcpy(&pAlarm->rtc_tm, &rtc_tm, sizeof(rtc_tm));
lh9ed821d2023-04-07 01:36:19 -0700449
xf.li9d1a0e12023-09-20 01:43:20 -0700450 pAlarm->rtc_id = buf->module;
451 pAlarm->module_id = buf->srcModule;
452 pAlarm->interval = buf->ulSec ; // count down time
453 pAlarm->remain_time = buf->ulSec; // remain count down time
454 pAlarm->wakeup = buf->wakeup;
455 pAlarm->is_utc = buf->is_utc;
456 pAlarm->cpu = buf->cpu;
457 pAlarm->time_val = buf->time_val;// cur_rtc_time is mktime(&local_tm)
458 //pAlarm->time_val = get_RtcTime();// cur_rtc_time is mktime(&local_tm)
lh9ed821d2023-04-07 01:36:19 -0700459
xf.li9d1a0e12023-09-20 01:43:20 -0700460 slog(RTC_PRINT, SLOG_NORMAL,
461 "rtc-service: handle_alarm_add pAlarm->interval is %ld ,pAlarm->time_val() is %ld, is_utc:%d.\n",
462 pAlarm->interval, pAlarm->time_val, pAlarm->is_utc);
463 /*
464 if (pAlarm->time_val + pAlarm->remain_time < cur_rtc_time) {
465 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);
466 }
467 */
lh9ed821d2023-04-07 01:36:19 -0700468
469#ifdef PRODUCT_NOT_USE_RTC
xf.li9d1a0e12023-09-20 01:43:20 -0700470 pAlarm->is_utc = 0; //´Ëģʽ϶¼°´timerÉèÖö¨Ê±Æ÷£¬²»Ö§³Öutc
471 pAlarm->wakeup = 0;
lh9ed821d2023-04-07 01:36:19 -0700472#endif
473
xf.li9d1a0e12023-09-20 01:43:20 -0700474 if (pAlarm->is_utc == 0)
475 {
476 if (!list_empty(&rtc_timer_list))
477 {
478 //update_timer_remain(pAlarm->remain_time);
479 list_for_each_entry(temp, &rtc_timer_list, list)
480 {
481 if (temp->remain_time > pAlarm->remain_time)
482 {
483 mark = 1;
484 list_add(&pAlarm->list, temp->list.prev);
485 break;
486 }
487 }
488 }
489 if (mark == 0)
490 {
491 list_add_tail(&pAlarm->list, &rtc_timer_list);
492 }
493 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: add rtc timer\n");
494 alarm_restart(&rtc_timer_list);
495 }
496 else
497 {
498 if (!list_empty(&rtc_alarm_list))
499 {
500 list_for_each_entry(temp, &rtc_alarm_list, list)
501 {
502 if (temp->interval + temp->time_val > pAlarm->interval + pAlarm->time_val)
503 {
504 mark = 1;
505 list_add(&pAlarm->list, temp->list.prev);
506 break;
507 }
508 }
509 }
510 if (mark == 0)
511 {
512 list_add_tail(&pAlarm->list, &rtc_alarm_list);
513 }
lh9ed821d2023-04-07 01:36:19 -0700514
xf.li9d1a0e12023-09-20 01:43:20 -0700515 if (pAlarm->wakeup)
516 {
517 save_rtc_alarm();
518 }
lh9ed821d2023-04-07 01:36:19 -0700519
xf.li9d1a0e12023-09-20 01:43:20 -0700520 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: add rtc alarm \n");
521 alarm_restart(&rtc_alarm_list);
522 }
523
524 return 0;
lh9ed821d2023-04-07 01:36:19 -0700525}
526
527/********************************************
528 * ¹¦ÄÜ:°´µ±Ç°¶¨Ê±Æ÷Ê£Óàʱ¼ä¸üж¨Ê±Æ÷
529 *******************************************/
530static void update_timer_remain(int new_remian)
531{
xf.li9d1a0e12023-09-20 01:43:20 -0700532 if (list_empty(&rtc_timer_list))
533 {
534 return;
535 }
536 int ret, remain_time;
537 ALARM_T *pTmp;
538 //list_entry(pTmp, &rtc_timer_list, list);
539 pTmp = list_entry(rtc_timer_list.next, ALARM_T, list);
lh9ed821d2023-04-07 01:36:19 -0700540
541#ifdef PRODUCT_NOT_USE_RTC
xf.li9d1a0e12023-09-20 01:43:20 -0700542 time_t cur = time(NULL);
543 remain_time = g_set_softtime + pTmp->remain_time - cur;
544 if ((remain_time > pTmp->remain_time) || (remain_time <= 0))
545 {
546 slog(RTC_PRINT, SLOG_ERR, "rtc-service: cur:%u, set:%u, remain:%u, inveral:%u\n", cur, g_set_softtime, remain_time,
547 pTmp->remain_time);
548 //ʱ¼ä·¢Éú¹ýÖØÖõȣ¬Ö±½ÓÉèÖö¨Ê±Æ÷µ½£¬¸÷Ä£¿éÓ¦ÔÚÊÕµ½RTC_MSG_TIME_CHANGEDÏûϢʱ¼°Ê±¸üж¨Ê±Æ÷
549 remain_time = 0;
550 }
lh9ed821d2023-04-07 01:36:19 -0700551#else
xf.li9d1a0e12023-09-20 01:43:20 -0700552 ret = ioctl(g_rtc_fd, ZX234290_GET_TIMER_REMAIN, &remain_time);
lh9ed821d2023-04-07 01:36:19 -0700553#endif
xf.li9d1a0e12023-09-20 01:43:20 -0700554 if (ret < 0)
555 {
556 slog(RTC_PRINT, SLOG_ERR, "rtc-service: handle_alarm_add no free alarm remain_time %d %s errno.\n", errno,
557 strerror(errno));
558 // return -1;
559 }
560 //if(remain_time > new_remian)
561 {
562 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: pTmp->remain_time: %d, rtc remain_time: %d \n", pTmp->remain_time,
563 remain_time);
564 alarm_adjust_value(pTmp->remain_time - remain_time);
565 alarm_fix_value(&rtc_timer_list);
566 }
lh9ed821d2023-04-07 01:36:19 -0700567}
568
569/********************************************
570 * ¹¦ÄÜ:ɾ³ýÏûÏ¢Ô´Ä£¿éµÄËùÓж¨Ê±Æ÷
571 *******************************************/
572static int handle_alarm_del(MSG_BUF *pmsg_buf)
573{
xf.li9d1a0e12023-09-20 01:43:20 -0700574 RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
575 ALARM_T *pTmp, *pTmp1;
576 int wakeup = 0;
lh9ed821d2023-04-07 01:36:19 -0700577
xf.li9d1a0e12023-09-20 01:43:20 -0700578 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del enter.\n");
579 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list)
580 {
581 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del timer module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
582 buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
583 if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id) && (buf->cpu == pTmp->cpu))
584 {
585 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del timer module:0x%x , src:0x%x , cpu:%d \n",
586 buf->module, buf->srcModule, buf->cpu);
587 list_del(&pTmp->list);
588 free(pTmp);
589 break;
590 }
591 }
lh9ed821d2023-04-07 01:36:19 -0700592
xf.li9d1a0e12023-09-20 01:43:20 -0700593 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list)
594 {
595 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del alarm module:0x%x - 0x%x, src:0x%x - 0x%x.\n",
596 buf->module, pTmp->rtc_id, buf->srcModule, pTmp->module_id);
597 if ((buf->module == pTmp->rtc_id) && (buf->srcModule == pTmp->module_id) && (buf->cpu == pTmp->cpu))
598 {
599 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_del alarm module:0x%x , src:0x%x , cpu:%d \n",
600 buf->module, buf->srcModule, buf->cpu);
601 wakeup = pTmp->wakeup;
602 list_del(&pTmp->list);
603 free(pTmp);
604 break;
605 }
606 }
lh9ed821d2023-04-07 01:36:19 -0700607
xf.li9d1a0e12023-09-20 01:43:20 -0700608 if (wakeup)
609 {
610 save_rtc_alarm();
611 }
lh9ed821d2023-04-07 01:36:19 -0700612
xf.li9d1a0e12023-09-20 01:43:20 -0700613 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_del exit.\n");
614
615 return 0;
lh9ed821d2023-04-07 01:36:19 -0700616}
617
xf.libdd93d52023-05-12 07:10:14 -0700618void send_ok_del_rsp(MSG_BUF *pmsg_buf)
619{
xf.li9d1a0e12023-09-20 01:43:20 -0700620 RTC_DATA_BUF * buf = pmsg_buf->aucDataBuf;
xf.libdd93d52023-05-12 07:10:14 -0700621
xf.li9d1a0e12023-09-20 01:43:20 -0700622 if (buf->cpu == RTC_CPU_CAP)
623 {
624 int ret = 0;
625 RTC_DATA_BUF sendbuf = {0};
626 sendbuf.cpu = RTC_CPU_AP;
627 sendbuf.module = buf->module;
628 sendbuf.srcModule = buf->srcModule;
629 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, RTC_MSG_DEL_ALARM, sizeof(RTC_DATA_BUF), (void *)&sendbuf);
630 if (ret != 0)
631 {
632 slog(RTC_PRINT, SLOG_ERR, "send_ok_del_rsp: failed,ret:%d\n", ret);
633 }
634 }
xf.libdd93d52023-05-12 07:10:14 -0700635}
lh9ed821d2023-04-07 01:36:19 -0700636/********************************************
637 *¹¦ÄÜ:¶¨Ê±Æ÷³¬Ê±´¦Àí
638 *******************************************/
639static int handle_alarm_timeout(MSG_BUF *pmsg_buf)
640{
xf.li9d1a0e12023-09-20 01:43:20 -0700641 long ret = -1;
642 ALARM_T *pAlarm;
643 RTC_DATA_BUF buf = {0};
lh9ed821d2023-04-07 01:36:19 -0700644 long rtc_report_time = 0;
645 long alarm_node_time = 0;
xf.li9d1a0e12023-09-20 01:43:20 -0700646 enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
647 int wakeup = 0;
lh9ed821d2023-04-07 01:36:19 -0700648
xf.li9d1a0e12023-09-20 01:43:20 -0700649 if (cmd == RTC_MSG_TIMER_TIMEOUT && !list_empty(&rtc_timer_list))
650 {
651 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: rtc timer timeout\n");
652 pAlarm = list_entry(rtc_timer_list.next, ALARM_T, list);
653 }
654 else if (cmd == RTC_MSG_ALARM_TIMEOUT && !list_empty(&rtc_alarm_list))
655 {
656 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: rtc alarm timeout\n");
657 pAlarm = list_entry(rtc_alarm_list.next, ALARM_T, list);
lh9ed821d2023-04-07 01:36:19 -0700658 rtc_report_time = atol(pmsg_buf->aucDataBuf);
xf.li9d1a0e12023-09-20 01:43:20 -0700659 if (rtc_report_time < 0 || rtc_report_time > LONG_MAX - 1)
660 {
661 rtc_report_time = 0;
lh9ed821d2023-04-07 01:36:19 -0700662 }
663 alarm_node_time = pAlarm->interval + pAlarm->time_val;
xf.li9d1a0e12023-09-20 01:43:20 -0700664 if ((rtc_report_time > alarm_node_time && (rtc_report_time - alarm_node_time) > g_time_offset)
665 || (alarm_node_time > rtc_report_time && (alarm_node_time - rtc_report_time) > g_time_offset))
lh9ed821d2023-04-07 01:36:19 -0700666 {
xf.li9d1a0e12023-09-20 01:43:20 -0700667 slog(RTC_PRINT, SLOG_ERR, "rtc-service: rtc node was deleted, timeout unexpected; node:%ld, rtc:%ld \n",
668 alarm_node_time, rtc_report_time);
669 alarm_fix_value(&rtc_alarm_list);
lh9ed821d2023-04-07 01:36:19 -0700670
xf.li9d1a0e12023-09-20 01:43:20 -0700671 if (pAlarm->wakeup)
672 {
673 save_rtc_alarm();
674 }
675
676 alarm_restart(&rtc_alarm_list);
677 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart alarm.\n");
678 return 0;
679 }
680 buf.time_val = alarm_node_time;
681 }
682 else
683 {
684 slog(RTC_PRINT, SLOG_ERR, "rtc-service: timeout unexpected\n");
685 return -1;
686 }
687
688 wakeup = pAlarm->wakeup;
689 list_del(&pAlarm->list);
690 buf.module = pAlarm->rtc_id;
691 buf.srcModule = pAlarm->module_id;
692 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: handle_alarm_timeout: target:0x%x, rtc_id:0x%x, utc:%d \n",
693 pAlarm->module_id, buf.module, pAlarm->is_utc);
694 if (pAlarm->cpu == RTC_CPU_AP)
695 {
696 ret = ipc_send_message2(MODULE_ID_RTC_SERVICE, pAlarm->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF),
697 (unsigned char*)&buf, 0);
698 if (ret != 0)
699 {
700 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected,ret:%d\n", ret);
701 }
702 }
703 else
704 {
705 buf.module = pAlarm->rtc_id;
xf.libdd93d52023-05-12 07:10:14 -0700706 buf.srcModule = pAlarm->module_id;
707 buf.cpu = RTC_CPU_AP;
708 buf.is_utc = pAlarm->is_utc;
lh9ed821d2023-04-07 01:36:19 -0700709
xf.li9d1a0e12023-09-20 01:43:20 -0700710 slog(RTC_PRINT, SLOG_NORMAL, "[rtc] handle_alarm_timeout: send to cap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n",
711 cmd, buf.srcModule, buf.module, pAlarm->is_utc);
xf.libdd93d52023-05-12 07:10:14 -0700712 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
713 if (ret != 0)
714 {
xf.li9d1a0e12023-09-20 01:43:20 -0700715 slog(RTC_PRINT, SLOG_ERR, "rtc-service: ipc_send_message unexpected,ret:%d\n", ret);;
xf.libdd93d52023-05-12 07:10:14 -0700716 }
xf.li9d1a0e12023-09-20 01:43:20 -0700717 }
718 if (pAlarm->is_utc == 0)
719 {
720 alarm_adjust_value(pAlarm->remain_time);
721 alarm_fix_value(&rtc_timer_list);
722 alarm_restart(&rtc_timer_list);
723 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart imer.\n");
724 }
725 else
726 {
727 alarm_fix_value(&rtc_alarm_list);
728 if (wakeup)
729 {
730 save_rtc_alarm();
731 }
732 alarm_restart(&rtc_alarm_list);
733 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout restart alarm.\n");
734 }
lh9ed821d2023-04-07 01:36:19 -0700735
xf.li9d1a0e12023-09-20 01:43:20 -0700736 free(pAlarm);
737 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: handle_alarm_timeout exit.\n");
738 return 0;
lh9ed821d2023-04-07 01:36:19 -0700739}
740
741/********************************************
742 * ¹¦ÄÜ:ɾ³ý¹Ø»ú²»±£´æµÄ¶¨Ê±Æ÷
743 *******************************************/
744static void handle_del_all(MSG_BUF *pmsg_buf)
745{
xf.li9d1a0e12023-09-20 01:43:20 -0700746 ALARM_T *pTmp, *pTmp1;
lh9ed821d2023-04-07 01:36:19 -0700747
xf.li9d1a0e12023-09-20 01:43:20 -0700748 update_timer_remain(0);
749 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list)
750 {
751 if (pTmp->wakeup == 0)
752 {
753 list_del(&pTmp->list);
754 free(pTmp);
755 }
756 }
757 alarm_restart(&rtc_timer_list);
lh9ed821d2023-04-07 01:36:19 -0700758
xf.li9d1a0e12023-09-20 01:43:20 -0700759 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list)
760 {
761 if (pTmp->wakeup == 0)
762 {
763 list_del(&pTmp->list);
764 free(pTmp);
765 }
766 }
767 alarm_restart(&rtc_alarm_list);
lh9ed821d2023-04-07 01:36:19 -0700768}
769
770/********************************************
771 * ¹¦ÄÜ:sntpͬ²½³É¹¦ºó£¬¸üÐÂalarm_list
772 *******************************************/
773static void update_alarm()
774{
xf.li9d1a0e12023-09-20 01:43:20 -0700775 ALARM_T *pTmp, *pTmp1;
776 //long sec = get_RtcTime();
777 long sec = time(0);
778 RTC_DATA_BUF buf = {0};
779
lh9ed821d2023-04-07 01:36:19 -0700780#ifdef PRODUCT_NOT_USE_RTC
xf.li9d1a0e12023-09-20 01:43:20 -0700781 list_for_each_entry_safe(pTmp, pTmp1, &rtc_timer_list, list)
782 {
783 buf.module = pTmp->rtc_id;
784 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF),
785 (unsigned char*)&buf, 0);
786 if (pTmp->is_utc)
787 {
788 if (pTmp->interval + pTmp->time_val < sec)
789 {
790 list_del(&pTmp->list);
791 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: delete ELAPSED timer, alarm_id(%d), alarm_time(%ld).\n", pTmp->rtc_id,
792 (pTmp->interval + pTmp->time_val));
793 free(pTmp);
794 }
795 else
796 {
797 pTmp->remain_time = pTmp->interval + pTmp->time_val - sec;
798 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: timer adjust, alarm_id(%d), alarm_time(%ld), remain(%ld).\n", pTmp->rtc_id,
799 (pTmp->interval + pTmp->time_val), pTmp->remain_time);
800 }
801 }
802 }
803 alarm_restart(&rtc_timer_list);
lh9ed821d2023-04-07 01:36:19 -0700804#else
xf.li9d1a0e12023-09-20 01:43:20 -0700805 list_for_each_entry_safe(pTmp, pTmp1, &rtc_alarm_list, list)
806 {
807 buf.module = pTmp->rtc_id;
808 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_TIME_CHANGED, sizeof(RTC_DATA_BUF),
809 (unsigned char*)&buf, 0);
810 if (pTmp->interval + pTmp->time_val < sec)
811 {
812 list_del(&pTmp->list);
813 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: delete ELAPSED alarm, alarm_id(%d), alarm_time(%ld).\n", pTmp->rtc_id,
814 (pTmp->interval + pTmp->time_val));
815 free(pTmp);
816 }
817 }
818 alarm_restart(&rtc_alarm_list);
lh9ed821d2023-04-07 01:36:19 -0700819#endif
xf.li9d1a0e12023-09-20 01:43:20 -0700820 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: update_alarm exit cur_rtc_time: % ld.\n", sec);
lh9ed821d2023-04-07 01:36:19 -0700821}
822
823/********************************************
824 * ¹¦ÄÜ:¸üж¨Ê±Æ÷Ê£Óàʱ¼ä
825 *******************************************/
826static void alarm_adjust_value(int time)
827{
xf.li9d1a0e12023-09-20 01:43:20 -0700828 ALARM_T * temp;
829 list_for_each_entry(temp, &rtc_timer_list, list)
830 {
831 temp->remain_time -= time;
832 }
lh9ed821d2023-04-07 01:36:19 -0700833}
834
835/********************************************
836 *¹¦ÄÜ: ɾ³ýÎÞЧ¶¨Ê±Æ÷
837 *******************************************/
838static void alarm_fix_value(struct list_head *rtc_list)
839{
xf.li9d1a0e12023-09-20 01:43:20 -0700840 ALARM_T *pTmp, *pTmp1;
841 RTC_DATA_BUF buf = {0};
842 int wakeup = 0;
843 int ret = 0;
844 enum RTC_MSG_CMD cmd = 0;
lh9ed821d2023-04-07 01:36:19 -0700845
xf.li9d1a0e12023-09-20 01:43:20 -0700846 if (rtc_list == &rtc_timer_list)
847 {
848 list_for_each_entry_safe(pTmp, pTmp1, rtc_list, list)
849 {
850 if (pTmp->remain_time <= 0)
851 {
852 buf.module = pTmp->rtc_id;
853 if (pTmp->cpu == RTC_CPU_CAP)
854 {
855 buf.srcModule = pTmp->module_id;
856 buf.cpu = RTC_CPU_AP;
857 buf.is_utc = pTmp->is_utc;
858 cmd = RTC_MSG_TIMER_TIMEOUT;
859 slog(RTC_PRINT, SLOG_NORMAL, "[rtc] handle_alarm_timeout: send to cap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n",
860 cmd, buf.srcModule, buf.module, buf.is_utc);
861 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
862 if (ret != 0)
863 {
864 slog(RTC_PRINT, SLOG_ERR, "rtc-service: send_soc_msg unexpected,ret:%d\n", ret);;
865 }
866 }
867 else
868 {
869 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF),
870 (unsigned char*)&buf, 0);
871 }
872 list_del(&pTmp->list);
873 free(pTmp);
874 }
875 }
876 }
877 else if (rtc_list == &rtc_alarm_list)
878 {
879 list_for_each_entry_safe(pTmp, pTmp1, rtc_list, list)
880 {
881 if (pTmp->time_val + pTmp->interval <= (time(0) + g_time_offset))
882 {
883 if (pTmp->wakeup)
884 {
885 wakeup = pTmp->wakeup;
886 }
887
888 buf.module = pTmp->rtc_id;
lh758261d2023-07-13 05:52:04 -0700889 buf.time_val = pTmp->time_val + pTmp->interval;
xf.li9d1a0e12023-09-20 01:43:20 -0700890 if (pTmp->cpu == RTC_CPU_CAP)
891 {
892 buf.srcModule = pTmp->module_id;
893 buf.cpu = RTC_CPU_AP;
894 buf.is_utc = pTmp->is_utc;
895 cmd = RTC_MSG_ALARM_TIMEOUT;
896 slog(RTC_PRINT, SLOG_NORMAL, "[rtc] handle_alarm_timeout: send to cap cmd:0x%x, srcMod:0x%x, module:0x%x, utc:%d \n",
897 cmd, buf.srcModule, buf.module, buf.is_utc);
898 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, sizeof(RTC_DATA_BUF), (void *)&buf);
899 if (ret != 0)
900 {
901 slog(RTC_PRINT, SLOG_ERR, "rtc-service: send_soc_msg unexpected,ret:%d\n", ret);;
902 }
903 }
904 else
905 {
906 ipc_send_message2(MODULE_ID_RTC_SERVICE, pTmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF),
907 (unsigned char*)&buf, 0);
908 }
909 list_del(&pTmp->list);
910 free(pTmp);
911 }
912 }
lh9ed821d2023-04-07 01:36:19 -0700913
xf.li9d1a0e12023-09-20 01:43:20 -0700914 if (wakeup)
915 {
916 save_rtc_alarm();
917 }
918 }
919 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_fix_value exit.\n");
lh9ed821d2023-04-07 01:36:19 -0700920}
921
922#ifdef PRODUCT_NOT_USE_RTC
923/*¶ÔӦûÓÐrtcµÄ²úÆ·£¬rtc¶¨Ê±Æ÷ÊÊÅäµ½softtimerµÄ»Øµ÷º¯Êý*/
924static void rtc_set_softtimer_cb(void *param)
925{
xf.li9d1a0e12023-09-20 01:43:20 -0700926 int ret = -1;
lh9ed821d2023-04-07 01:36:19 -0700927
xf.li9d1a0e12023-09-20 01:43:20 -0700928 slog(NET_PRINT, SLOG_ERR, "rtc-service: rtc_adapt_softtimer_cb \n");
929
930 ret = ipc_send_message(MODULE_ID_RTC_SERVICE, MODULE_ID_RTC_SERVICE, RTC_MSG_TIMER_TIMEOUT, 0, 0, 0);;
931 if (ret != 0)
932 {
933 slog(MISC_PRINT, SLOG_ERR, "rtc-service: set rtc timer send msg failed \n");
934 }
935 return 0;
lh9ed821d2023-04-07 01:36:19 -0700936}
937#endif
938
939/********************************************
940 * ¹¦ÄÜ:ÖØÆô¶¨Ê±Æ÷£¬Ã»ÓÐÔò¹Ø±Õ¶¨Ê±Æ÷
941 *******************************************/
942static void alarm_restart(struct list_head *rtc_list)
943{
xf.li9d1a0e12023-09-20 01:43:20 -0700944 int ret = 0;
945 //struct tm *p_tm = 0;
946 struct tm ret_tm = {0};
947 struct rtc_wkalrm alarm = {0};
948 long tVal = 0;
949 long remain = -1;
950 ALARM_T *ptmp = NULL;
lh9ed821d2023-04-07 01:36:19 -0700951 long cur_rtc_time = time(0);
xf.li9d1a0e12023-09-20 01:43:20 -0700952 RTC_DATA_BUF buf = {0};
lh9ed821d2023-04-07 01:36:19 -0700953NEXT:
xf.li9d1a0e12023-09-20 01:43:20 -0700954 if (!list_empty(rtc_list))
955 {
956 ptmp = list_entry(rtc_list->next, ALARM_T, list);
957 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_restart enter.\n");
958 memset(&buf, 0, sizeof(RTC_DATA_BUF));
959 if (ptmp->is_utc == 0)
960 {
lh9ed821d2023-04-07 01:36:19 -0700961#ifdef PRODUCT_NOT_USE_RTC
xf.li9d1a0e12023-09-20 01:43:20 -0700962 g_set_softtime = time(NULL);
963 sc_timer_delete(RTC_USE_SOFTTIMER_ID);
964 ret = sc_timer_create(RTC_USE_SOFTTIMER_ID, TIMER_FLAG_ONCE, ptmp->remain_time * 1000, rtc_set_softtimer_cb, NULL);
lh9ed821d2023-04-07 01:36:19 -0700965#else
xf.li9d1a0e12023-09-20 01:43:20 -0700966 ret = ioctl(g_rtc_fd, ZX234290_SET_TIMER, ptmp->remain_time);
lh9ed821d2023-04-07 01:36:19 -0700967#endif
xf.li9d1a0e12023-09-20 01:43:20 -0700968 if (ret != 0)
969 {
970 slog(RTC_PRINT, SLOG_ERR, "rtc-service: alarm_restart timer: set failed, ret:%d \n", ret);
971 return;
972 }
973 slog(RTC_PRINT, SLOG_NORMAL,
974 "rtc-service: alarm_restart: set timer ok, remain_time:%ld, cur_rtc_time:%ld, module:0x%x, rtc_id:0x%x\n",
975 ptmp->remain_time, cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
976 }
977 else
978 {
979 tVal = ptmp->interval + ptmp->time_val;
980 remain = tVal - cur_rtc_time;
981 if (remain <= g_time_offset)
982 {
983 //¹ýʱ¶¨Ê±Æ÷¶ªÆú´¦Àí£¬Èç¹û¶àÄ£¿éÕýºÃÉèµÄ»ù±¾ÔÚͬһ¸öʱ¼äµã£¬ºóÕ߻ᱻ¶ªÆú£¬¿¼ÂÇÐ޸ijÉÖ±½Ó֪ͨģ¿éʱ¼äµ½
984 slog(RTC_PRINT, SLOG_ERR,
985 "rtc-service: remain time error, time_set:%ld, remain:%ld, alarmer:%ld, interval:%ld, current:%ld, module:0x%x, rtc_id:0x%x\n",
986 ptmp->time_val, remain, tVal, ptmp->interval, cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
987 buf.module = ptmp->rtc_id;
988 buf.time_val = ptmp->time_val + ptmp->interval;
989 ipc_send_message2(MODULE_ID_RTC_SERVICE, ptmp->module_id, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF),
990 (unsigned char*)&buf, 0);
991 list_del(&ptmp->list);
992 free(ptmp);
993 ptmp = NULL;
994 goto NEXT;
995 }
lh9ed821d2023-04-07 01:36:19 -0700996
xf.li9d1a0e12023-09-20 01:43:20 -0700997 //localtime_r(&tVal, &ret_tm);
998 gmtime_r(&tVal, &ret_tm);
999 memcpy(&alarm.time, &ret_tm, sizeof(struct rtc_time));
1000 alarm.enabled = 1;
lh9ed821d2023-04-07 01:36:19 -07001001
xf.li9d1a0e12023-09-20 01:43:20 -07001002 /*Ê×ÏÈ´ò¿ªalarm ÖжÏ*/
1003 ret = ioctl(g_rtc_fd, RTC_AIE_ON);
1004 if (ret != 0)
1005 {
1006 slog(RTC_PRINT, SLOG_ERR, "rtc-service: open alarm failed, ret:%d\n", ret);
1007 return;
1008 }
lh9ed821d2023-04-07 01:36:19 -07001009
xf.li9d1a0e12023-09-20 01:43:20 -07001010 /*ÉèÖÃalarm ʱ¼ä*/
1011 ret = ioctl(g_rtc_fd, RTC_WKALM_SET, &alarm);
1012 if (ret != 0)
1013 {
1014 slog(RTC_PRINT, SLOG_ERR, "rtc-service: set alarm failed, ret:%d\n", ret);
1015 return;
1016 }
1017 slog(RTC_PRINT, SLOG_NORMAL,
1018 "rtc-service: alarm_restart set alarm ok, remain_time:%ld, cur_rtc_time:%ld, module:0x%x, rtc_id:0x%x \n", remain,
1019 cur_rtc_time, ptmp->module_id, ptmp->rtc_id);
1020 }
1021 }
1022 else
1023 {
1024 if (rtc_list == &rtc_timer_list)
1025 {
1026 //¹Ø±Õrtc time, Éè¼ä¸ôʱ¼äΪ0
1027 ret = ioctl(g_rtc_fd, ZX234290_TIMER_ENABLED, 0);
1028 if (ret != 0)
1029 {
1030 slog(RTC_PRINT, SLOG_ERR, "rtc-service: disable timer failed, ret:%d\n", ret);
1031 return;
1032 }
1033 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart disable timer ok \n");
1034 }
1035 else
1036 {
1037 /*¹Ø±Õalarm ÖжÏ*/
1038 ret = ioctl(g_rtc_fd, RTC_AIE_OFF);
1039 if (ret != 0)
1040 {
1041 slog(RTC_PRINT, SLOG_ERR, "rtc-service: disable alarm failed, ret:%d\n", ret);
1042 return;
1043 }
1044 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: alarm_restart disable alarm ok \n");
1045 }
1046 }
1047 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: alarm_restart exit.\n");
lh9ed821d2023-04-07 01:36:19 -07001048}
1049
1050static void rtc_set_local_time(MSG_BUF *msg)
1051{
xf.li9d1a0e12023-09-20 01:43:20 -07001052 struct tm set_tm = {0};
1053 struct timeval time_tv;
lh9ed821d2023-04-07 01:36:19 -07001054
xf.li9d1a0e12023-09-20 01:43:20 -07001055 slog(RTC_PRINT, SLOG_DEBUG, "rtc_set_local_time, %d, %d \n", sizeof(struct tm), msg->usDataLen);
lh9ed821d2023-04-07 01:36:19 -07001056
xf.li9d1a0e12023-09-20 01:43:20 -07001057 memcpy(&set_tm, msg->aucDataBuf, msg->usDataLen);
lh9ed821d2023-04-07 01:36:19 -07001058
xf.li9d1a0e12023-09-20 01:43:20 -07001059 slog(RTC_PRINT, SLOG_ERR, "rtc_set_local_time, year:%d, month:%d, day:%d, hour:%d, min:%d, sec:%d, wday:%d \n",
1060 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);
lh9ed821d2023-04-07 01:36:19 -07001061
xf.li9d1a0e12023-09-20 01:43:20 -07001062 time_tv.tv_sec = mktime(&set_tm);
1063 if (time_tv.tv_sec < 0)
1064 {
lh9ed821d2023-04-07 01:36:19 -07001065
xf.li9d1a0e12023-09-20 01:43:20 -07001066 slog(RTC_PRINT, SLOG_DEBUG, "mktime fail, set time_tv.tv_sec to 0 \n");
1067 time_tv.tv_sec = 0;
1068 }
1069 time_tv.tv_usec = 0;
1070
1071 if (0 != settimeofday(&time_tv, NULL))
1072 {
1073 slog(RTC_PRINT, SLOG_ERR, "rtc_set_local_time failed \n");
1074 }
lh9ed821d2023-04-07 01:36:19 -07001075}
1076
1077/********************************************
1078 * process_msg
1079 * handle the specified MSG.
1080 *******************************************/
1081static int process_msg(MSG_BUF *pmsg_buf)
1082{
xf.li9d1a0e12023-09-20 01:43:20 -07001083 enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
1084 unsigned short req_cmd = 0;
lh9ed821d2023-04-07 01:36:19 -07001085
xf.li9d1a0e12023-09-20 01:43:20 -07001086 switch (cmd)
1087 {
1088 case RTC_MSG_GET_TIME:
1089 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_GET_TIME, src:0x%x.\n", pmsg_buf->src_id);
1090 handle_get_time(pmsg_buf);
1091 break;
1092 case RTC_MSG_SET_TIME:
1093 security_log(pmsg_buf->src_id, "set time");
1094 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_SET_TIME, src:0x%x.\n", pmsg_buf->src_id);
1095 handle_set_time(pmsg_buf);
1096 update_alarm();
1097 break;
1098 case RTC_MSG_SNTP_UPDATE:
1099 handle_sntp_update(pmsg_buf);
1100 break;
1101 case RTC_MSG_ADD_ALARM:
1102 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_ADD_ALARM, src:0x%x, g_clean_flag = %d.\n",
1103 pmsg_buf->src_id, g_clean_flag);
1104 //Ìí¼ÓrtcǰÏÈɾ³ý´Ërtc_idÒÑÌí¼Ó¼Ç¼£¬Ã¿¸örtc_idÖ»±£Áô1¸ö¶¨Ê±Æ÷
1105 if (0 == g_clean_flag)
1106 {
1107 update_timer_remain(0);
1108 handle_alarm_del(pmsg_buf);
1109 handle_alarm_add(pmsg_buf);
1110 }
1111 else
1112 {
1113 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: g_clean_flag is nonzero:0x%x, dont add alarm.\n", g_clean_flag);
1114 }
lh9ed821d2023-04-07 01:36:19 -07001115
xf.li9d1a0e12023-09-20 01:43:20 -07001116 //wifi´¦ÀíÍêǰ²»ÄÜÐÝÃߣ¬ÔÝʱʹÓÃÑÓÊ±Ëø£¬´ý·½°¸×鏸³ö·½°¸ºóÔÙµ÷Õû
1117 //if (pmsg_buf->usSourceModuleID == MODULE_ID_WDT)
1118 //write_lockfile("/sys/power/wake_unlock", "rtc_io_time_timeout_lock");
1119
1120 break;
1121 case RTC_MSG_DEL_ALARM:
1122 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_DEL_ALARM, src:0x%x.\n", pmsg_buf->src_id);
1123 update_timer_remain(0);
1124 handle_alarm_del(pmsg_buf);
1125 send_ok_del_rsp(pmsg_buf);
1126 alarm_restart(&rtc_timer_list);
1127 alarm_restart(&rtc_alarm_list);
1128 break;
1129 case RTC_MSG_ALARM_TIMEOUT:
1130 case RTC_MSG_TIMER_TIMEOUT:
1131 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_TIMEOUT, src:0x%x, cmd:0x%x.\n", pmsg_buf->src_id, cmd);
1132 handle_alarm_timeout(pmsg_buf);
1133 break;
1134 case RTC_MSG_DEL_ALL:
1135 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service: process_msg RTC_MSG_DEL_ALL, src:0x%x.\n", pmsg_buf->src_id);
1136 memcpy(&req_cmd, pmsg_buf->aucDataBuf, sizeof(unsigned short));
1137 if (MSG_CMD_RESET_RSP == req_cmd || MSG_CMD_POWEROFF_RSP == req_cmd || MSG_CMD_RESTART_RSP == req_cmd)
1138 {
1139 g_clean_flag = req_cmd;
1140 }
1141 handle_del_all(pmsg_buf);
lh9ed821d2023-04-07 01:36:19 -07001142 save_rtc_alarm();
xf.li9d1a0e12023-09-20 01:43:20 -07001143 //ÕâÀﻹÐèҪ֪ͨÖ÷¿Ø
1144 ipc_send_message(MODULE_ID_RTC_SERVICE, pmsg_buf->src_id, req_cmd, 0, 0, 0);
1145 break;
lh9ed821d2023-04-07 01:36:19 -07001146
xf.li9d1a0e12023-09-20 01:43:20 -07001147 default:
1148 break;
1149 }
1150 return 0;
lh9ed821d2023-04-07 01:36:19 -07001151}
1152
xf.li6c8fc1e2023-08-12 00:11:09 -07001153/********************************************
1154 * process_msg_rtc_ap
1155 * handle the specified MSG to cap, because rtc driver is at cap
1156 *******************************************/
1157static int process_msg_rtc_cap(MSG_BUF *pmsg_buf)
1158{
xf.li9d1a0e12023-09-20 01:43:20 -07001159 enum RTC_MSG_CMD cmd = pmsg_buf->usMsgCmd;
1160 unsigned short req_cmd = 0;
1161 int ret = 0;
1162 struct tm *ptm = NULL;
1163 RTC_DATA_BUF *buf = NULL;
1164 int dst_id = 0;
1165
1166 switch (cmd)
1167 {
1168 case RTC_MSG_GET_TIME:
1169 buf = (RTC_DATA_BUF *)pmsg_buf->aucDataBuf;
1170 slog(RTC_PRINT, SLOG_NORMAL, "to cap: RTC_MSG_GET_TIME \n");
1171 if (buf->cpu == RTC_CPU_AP)
1172 {
1173 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, pmsg_buf->usDataLen, (void *)pmsg_buf->aucDataBuf);
1174 if (ret != 0)
1175 {
1176 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: ipc_send_message unexpected,ret:%d\n", ret);
1177 }
1178 }
1179 else
1180 {
1181 slog(RTC_PRINT, SLOG_NORMAL, "receive rtc time from cap core : RTC_MSG_GET_TIME :%lu \n", buf->ulSec);
1182
1183 }
1184 break;
1185 case RTC_MSG_SET_TIME:
1186 ptm = (struct tm *)pmsg_buf->aucDataBuf;
1187 if (pmsg_buf->src_id == MODULE_ID_CP_RTC_SERVICE)
1188 {
1189 rtc_set_local_time(pmsg_buf);
1190 }
1191 else
1192 {
1193 /*
1194 slog(RTC_PRINT, SLOG_NORMAL, "to cap: cmd:0x%x, %d-%d-%d %d:%d:%d \n", cmd, ptm->tm_year, ptm->tm_mon, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
1195 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, pmsg_buf->usDataLen, (void *)pmsg_buf->aucDataBuf);
1196 if (ret != 0)
1197 {
1198 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: ipc_send_message unexpected,ret:%d\n",ret);
1199 }
1200 */
1201 }
1202 break;
1203 case RTC_MSG_SNTP_UPDATE:
1204 handle_sntp_update(pmsg_buf);
1205 break;
1206 case RTC_MSG_ADD_ALARM:
1207 case RTC_MSG_DEL_ALARM:
1208 buf = (RTC_DATA_BUF *)pmsg_buf->aucDataBuf;
1209 if (buf->cpu == RTC_CPU_AP)
1210 {
1211 slog(RTC_PRINT, SLOG_NORMAL, "to cap: cmd:0x%x, module:0x%x, msg_id:0x%x, sec:%ld: cpu:%d, utc:%d, wakeup:%d \n", cmd,
1212 buf->module, buf->srcModule, buf->ulSec, buf->cpu, buf->is_utc, buf->wakeup);
1213 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, pmsg_buf->usDataLen, (void *)pmsg_buf->aucDataBuf);
1214 if (ret != 0)
1215 {
1216 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: ipc_send_message unexpected,ret:%d\n", ret);
1217 }
1218 }
1219 else
1220 {
1221 slog(RTC_PRINT, SLOG_NORMAL, "from cap: cmd:0x%x, module:0x%x, msg_id:0x%x, del ok \n", cmd, buf->module,
1222 buf->srcModule);
1223 }
1224 break;
1225 case RTC_MSG_ALARM_TIMEOUT:
1226 case RTC_MSG_TIMER_TIMEOUT:
1227 buf = (RTC_DATA_BUF *)pmsg_buf->aucDataBuf;
1228 if (buf->cpu == RTC_CPU_CAP)
1229 {
1230 slog(RTC_PRINT, SLOG_NORMAL, "from cap: cmd:0x%x(timeout), module:0x%x, msg_id:0x%x, sec:%ld: %d, %d, %d \n", cmd,
1231 buf->module, buf->srcModule, buf->ulSec, buf->cpu, buf->is_utc, buf->wakeup);
1232
1233 ret = ipc_send_message(MODULE_ID_RTC_SERVICE, buf->srcModule, RTC_MSG_ALARM_ELAPSED, sizeof(RTC_DATA_BUF), buf, 0);
1234 if (ret != 0)
1235 {
1236 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: ipc_send_message unexpected,ret:%d\n", ret);
1237 }
1238 }
1239 break;
1240 case RTC_MSG_DEL_ALL:
1241 slog(RTC_PRINT, SLOG_NORMAL, "process_msg_to_cap RTC_MSG_DEL_ALL, src:0x%x.\n", pmsg_buf->src_id);
1242 memcpy(&req_cmd, pmsg_buf->aucDataBuf, sizeof(unsigned short));
1243 //ÕâÀﻹÐèҪ֪ͨÖ÷¿Ø
1244 ipc_send_message(MODULE_ID_RTC_SERVICE, pmsg_buf->src_id, req_cmd, 0, 0, 0);
1245 ret = send_soc_msg(FAR_PS, MODULE_ID_RTC_SERVICE, cmd, pmsg_buf->usDataLen, (void *)pmsg_buf->aucDataBuf);
1246 if (ret != 0)
1247 {
1248 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: ipc_send_message unexpected,ret:%d\n", ret);
1249 }
1250 break;
1251 case RTC_MSG_TIME_CHANGED:
1252 buf = (RTC_DATA_BUF *)pmsg_buf->aucDataBuf;
1253 slog(RTC_PRINT, SLOG_ERR, "process_msg_to_cap: RTC_MSG_TIME_CHANGED, dst_id:0x%x.\n", buf->srcModule);
1254 ipc_send_message(MODULE_ID_RTC_SERVICE, buf->srcModule, RTC_MSG_TIME_CHANGED, 0, 0, 0);
1255 break;
1256 default:
1257 break;
1258 }
1259 return 0;
xf.li6c8fc1e2023-08-12 00:11:09 -07001260}
1261
lh9ed821d2023-04-07 01:36:19 -07001262static int rtc_service_sock_init()
1263{
1264 int sockfd = 0;
xf.li9d1a0e12023-09-20 01:43:20 -07001265 int ret;
1266 struct sockaddr_nl snl;
1267
1268 bzero(&snl, sizeof(struct sockaddr_nl));
1269 snl.nl_family = AF_NETLINK;
lh9ed821d2023-04-07 01:36:19 -07001270 snl.nl_pid = getpid();
xf.li9d1a0e12023-09-20 01:43:20 -07001271 snl.nl_groups = 1;
lh9ed821d2023-04-07 01:36:19 -07001272
1273 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
xf.li9d1a0e12023-09-20 01:43:20 -07001274 {
lh9ed821d2023-04-07 01:36:19 -07001275 perror ("signal");
lh9ed821d2023-04-07 01:36:19 -07001276 }
lh9ed821d2023-04-07 01:36:19 -07001277
xf.li9d1a0e12023-09-20 01:43:20 -07001278 sockfd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
1279 if (sockfd < 0)
1280 {
1281 slog(RTC_PRINT, SLOG_ERR, "create rtc service socket failed!\n");
1282 return -1;
1283 }
1284 // setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
lh9ed821d2023-04-07 01:36:19 -07001285
xf.li9d1a0e12023-09-20 01:43:20 -07001286 ret = bind(sockfd, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
1287 if (ret < 0)
1288 {
1289 slog(RTC_PRINT, SLOG_ERR, "rtc service socket bind fail!\n");
1290 close(sockfd);
1291 return -1;
1292 }
1293
1294 return sockfd;
lh9ed821d2023-04-07 01:36:19 -07001295}
1296//change@/devices/platform/zx29_i2c.0/i2c-0/0-0012/zx234290-rtc
1297static int rtc_time_msg_parse(const char *msg, int msglen)
1298{
xf.li9d1a0e12023-09-20 01:43:20 -07001299 int offlen = 0;
1300 const char *keys = NULL;
1301 char* timeStr = NULL;
1302 char *pSec = NULL;
1303 slog(RTC_PRINT, SLOG_ERR, "[%s][%d] zx234290-rtc \n", __func__, __LINE__);
1304
1305 offlen += strlen((char *)msg) + 1;
1306 while (offlen <= msglen)
1307 {
1308 keys = (char *)(msg + offlen);
1309 //slog(NET_PRINT,SLOG_ERR, "[%s][%d] zx234290-rtc%s, %d\n", __func__, __LINE__, keys, offlen);
1310 if (strncmp(keys, RTC_ALARM_TIMEOUT_MSG, strlen(RTC_ALARM_TIMEOUT_MSG)) == 0)
1311 {
lh9ed821d2023-04-07 01:36:19 -07001312#if 1 // cov M DEADCODE
xf.li9d1a0e12023-09-20 01:43:20 -07001313 pSec = strstr(keys, "sec:");
1314 if (pSec == NULL)
1315 {
1316 slog(RTC_PRINT, SLOG_ERR, "zx234290-rtc event no sec \n");
1317 return -1;
lh9ed821d2023-04-07 01:36:19 -07001318 }
xf.li9d1a0e12023-09-20 01:43:20 -07001319 timeStr = pSec + strlen("sec:");
lh9ed821d2023-04-07 01:36:19 -07001320
1321#else
1322 timeStr = strstr(keys, "sec:") + strlen("sec:");
xf.li9d1a0e12023-09-20 01:43:20 -07001323 if (timeStr == NULL)
1324 {
1325 slog(RTC_PRINT, SLOG_ERR, "zx234290-rtc event no sec \n");
1326 return -1;
1327 }
1328#endif
1329 ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_ALARM_TIMEOUT, strlen(timeStr), timeStr, 0);
1330 slog(RTC_PRINT, SLOG_NORMAL, "zx234290-rtc alarm timeout \n");
1331 return 0;
1332 }
1333 else if (strncmp(keys, RTC_TIMER_TIMEOUT_MSG, strlen(keys)) == 0)
1334 {
1335 ipc_send_message2(MODULE_ID_HOTPLUG, MODULE_ID_RTC_SERVICE, RTC_MSG_TIMER_TIMEOUT, 0, NULL, 0);
1336 slog(RTC_PRINT, SLOG_NORMAL, "zx234290-rtc timer timeout \n");
1337 return 0;
1338 }
1339 offlen += strlen((char *)keys) + 1;
1340 }
1341 slog(RTC_PRINT, SLOG_ERR, "zx234290-rtc event not supported \n");
1342 return -1;
lh9ed821d2023-04-07 01:36:19 -07001343}
1344
1345/********************************************
1346 * rtc_service_thread_process
1347 * looper for processing zx234290-rtc msg.
1348 *******************************************/
1349void rtc_event_process(void)
1350{
xf.li9d1a0e12023-09-20 01:43:20 -07001351 int rtc_service_fd = 0;
1352 fd_set readfds;
1353 int maxfd = 0;
1354 char buf[RTC_MSG_BUFFER_SIZE] = {0};
1355 int len = 0;
1356 int ret = 0;
1357 prctl(PR_SET_NAME, "rtceventhandle", 0, 0, 0);
1358 rtc_service_fd = rtc_service_sock_init();
1359 if (rtc_service_fd < 0)
1360 {
1361 slog(RTC_PRINT, SLOG_ERR, "rtc service socket init fail!\n");
1362 return ;
1363 }
lh9ed821d2023-04-07 01:36:19 -07001364
xf.li9d1a0e12023-09-20 01:43:20 -07001365 maxfd = rtc_service_fd;
1366 while (1)
1367 {
1368 FD_ZERO(&readfds);
1369 FD_SET(rtc_service_fd, &readfds);
lh9ed821d2023-04-07 01:36:19 -07001370
xf.li9d1a0e12023-09-20 01:43:20 -07001371 ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
1372 if (ret == -1 && errno == EINTR)
1373 {
1374 continue;
1375 }
lh9ed821d2023-04-07 01:36:19 -07001376
xf.li9d1a0e12023-09-20 01:43:20 -07001377 if (FD_ISSET(rtc_service_fd, &readfds))
1378 {
1379 memset(buf, 0, sizeof(buf));
1380 len = recv(rtc_service_fd, &buf, sizeof(buf), 0);
1381 if (len <= 0)
1382 {
1383 slog(RTC_PRINT, SLOG_ERR, "rtc service socket recv msg fail!\n");
1384 continue;
1385 }
lh9ed821d2023-04-07 01:36:19 -07001386
xf.li9d1a0e12023-09-20 01:43:20 -07001387 /*½øÐÐueventÏûÏ¢½âÎö£¬·µ»Ø½âÎö½á¹û*/
1388 if (strstr(buf, "zx234290-rtc"))
1389 {
1390 rtc_time_msg_parse(buf, len);
1391 }
1392 continue;
1393 }
1394 }
lh9ed821d2023-04-07 01:36:19 -07001395}
1396
1397/********************************************
1398 * msg_looper
1399 * main looper for processing MSG.
1400 *******************************************/
1401static void msg_looper(void)
1402{
xf.li9d1a0e12023-09-20 01:43:20 -07001403 int ret = 0;
1404 int msg_id = 0;
1405 MSG_BUF msg_buf = {0};
1406 // key_t msgkey = get_msg_key();
lh9ed821d2023-04-07 01:36:19 -07001407
xf.li9d1a0e12023-09-20 01:43:20 -07001408 msg_id = msgget(MODULE_ID_RTC_SERVICE, IPC_CREAT | 0600);
lh9ed821d2023-04-07 01:36:19 -07001409
xf.li9d1a0e12023-09-20 01:43:20 -07001410 memset(&msg_buf, 0, sizeof(msg_buf));
lh9ed821d2023-04-07 01:36:19 -07001411
xf.li9d1a0e12023-09-20 01:43:20 -07001412 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: msg_looper enter(msgid=%d)&waiting...\n", msg_id);
1413 while (1)
1414 {
1415 ret = msgrcv(msg_id, &msg_buf, sizeof(MSG_BUF) - sizeof(long), 0, 0);
1416 wake_rtc_lock();
1417 if (ret <= 0)
1418 {
1419 slog(RTC_PRINT, SLOG_ERR, "rtc-service: msg_looper recv msg break(%d)\n", ret);
1420 wake_rtc_unlock();
1421 continue;
1422 }
1423 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service: msg_looper process_msg in, src:0x%x, target:0x%x.\n", msg_buf.src_id,
1424 msg_buf.dst_id);
lh9ed821d2023-04-07 01:36:19 -07001425
xf.li9d1a0e12023-09-20 01:43:20 -07001426#ifdef USE_CAP_SUPPORT
1427 process_msg_rtc_cap(&msg_buf);
1428#else
1429 process_msg(&msg_buf);
1430#endif
1431
1432 slog(RTC_PRINT, SLOG_ERR, "rtc-service: msg_looper process_msg out.\n");
1433 wake_rtc_unlock();
1434 }
lh9ed821d2023-04-07 01:36:19 -07001435}
1436
1437static void print_rtc_list_info(void)
1438{
xf.li9d1a0e12023-09-20 01:43:20 -07001439 ALARM_T *temp = NULL;
1440 int remain_time;
lh9ed821d2023-04-07 01:36:19 -07001441
xf.li9d1a0e12023-09-20 01:43:20 -07001442 if (ioctl(g_rtc_fd, ZX234290_GET_TIMER_REMAIN, &remain_time) < 0) // cov M CHECKED_RETURN
1443 {
1444 slog(RTC_PRINT, SLOG_ERR, "ioctl fail.\n");
1445 }
lh9ed821d2023-04-07 01:36:19 -07001446
lh9ed821d2023-04-07 01:36:19 -07001447
xf.li9d1a0e12023-09-20 01:43:20 -07001448 slog(RTC_PRINT, SLOG_ERR, "rtc-service: rtc remain_time :%ld \n", remain_time);
1449
1450 if (!list_empty(&rtc_timer_list))
1451 {
1452 list_for_each_entry(temp, &rtc_timer_list, list)
1453 {
1454 slog(RTC_PRINT, SLOG_ERR,
1455 "rtc-service rtc_alarm_list node rtc_id:0x%x, module_id:0x%x, time_val:%ld, remain_time:%ld, cpu:%d\n",
1456 temp->rtc_id,
1457 temp->module_id,
1458 temp->time_val,
1459 temp->remain_time,
1460 temp->cpu);
1461 }
1462 }
1463 else
1464 {
1465 slog(RTC_PRINT, SLOG_ERR, "rtc-service rtc_timer_list is empty!");
1466 }
1467
1468 if (!list_empty(&rtc_alarm_list))
1469 {
1470 list_for_each_entry(temp, &rtc_alarm_list, list)
1471 {
1472 slog(RTC_PRINT, SLOG_ERR,
1473 "rtc-service rtc_alarm_list node rtc_id:0x%x, module_id:0x%x, time_val:%ld, remain_time:%ld, cpu:%d, \
1474 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",
1475 temp->rtc_id,
1476 temp->module_id,
1477 temp->time_val,
1478 temp->remain_time,
1479 temp->cpu,
1480 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);
1481 }
1482 }
1483 else
1484 {
1485 slog(RTC_PRINT, SLOG_ERR, "rtc-service rtc_alarm_list is empty!");
1486 }
lh9ed821d2023-04-07 01:36:19 -07001487}
1488
1489/* ÐźŴ¦Àí*/
1490static void sig_usr(int signo)
1491{
1492#if 0//(APP_OS_TYPE == APP_OS_LINUX)
xf.li9d1a0e12023-09-20 01:43:20 -07001493 if (signo == SIGUSR1)
1494 {
1495 slog(RTC_PRINT, SLOG_NORMAL, "rtc-service receive SIGUSR1! \n");
1496 print_rtc_list_info();
1497 }
1498 else
1499 {
1500 slog(RTC_PRINT, SLOG_ERR, "rtc-service receive signo:%d", signo);
1501 }
lh9ed821d2023-04-07 01:36:19 -07001502#endif
1503}
1504
1505/*RTCÏûÏ¢½âÎö*/
1506int rtc_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)
1507{
xf.li9d1a0e12023-09-20 01:43:20 -07001508 if (strstr(msg, "zx234290-rtc"))
1509 {
1510 rtc_time_msg_parse(msg, msglen);
1511 }
1512 return -1;
lh9ed821d2023-04-07 01:36:19 -07001513}
1514
1515/********************************************
1516 * main
1517 * entry of RTC-Service!
1518 *******************************************/
1519int rtc_service_main(int argc, char **argv)
1520{
1521
xf.li9d1a0e12023-09-20 01:43:20 -07001522 slog(RTC_PRINT, SLOG_DEBUG, "rtc-service enter...\n");
1523 pthread_t rtcservice_thread_id;
1524 pthread_attr_t attr;
1525 int result = 0;
1526 prctl(PR_SET_NAME, "rtc-service", 0, 0, 0);
lh9ed821d2023-04-07 01:36:19 -07001527
xf.li9d1a0e12023-09-20 01:43:20 -07001528 //¸ù¾ÝNV³õʼ»¯´òÓ¡¼¶±ð£¬²¢×¢²á¶¯Ì¬µ÷Õû´òÓ¡¼¶±ðÐźÅÁ¿
1529 loglevel_init();
lh9ed821d2023-04-07 01:36:19 -07001530
xf.li9d1a0e12023-09-20 01:43:20 -07001531 if (signal(SIGUSR1, sig_usr) == SIG_ERR)
1532 {
1533 slog(RTC_PRINT, SLOG_ERR, "rtc-service not catch SIGUSR1 \n");
1534 }
1535
lh9ed821d2023-04-07 01:36:19 -07001536 INIT_LIST_HEAD(&rtc_timer_list);
1537 INIT_LIST_HEAD(&rtc_alarm_list);
1538
1539 g_clean_flag = 0;
xf.li9d1a0e12023-09-20 01:43:20 -07001540
1541 //rtcÔÚAPʱ£¬½Úµã±ØÐë´ò¿ª³É¹¦£»ÔÚÆäËûºËʱÓÉÆäËûºËÅжÏ
xf.li6c8fc1e2023-08-12 00:11:09 -07001542#ifndef USE_CAP_SUPPORT
xf.li9d1a0e12023-09-20 01:43:20 -07001543 if ((g_rtc_fd = open_rtc()) < 0)
1544 {
1545 slog(RTC_PRINT, SLOG_ERR, "Cannt open rtc dev!\n");
1546 return -1;
1547 }
1548 init_rtc_alarm();
xf.li6c8fc1e2023-08-12 00:11:09 -07001549#endif
xf.li9d1a0e12023-09-20 01:43:20 -07001550 /*
1551 pthread_attr_init(&attr);
1552 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1553 result = pthread_create(&rtcservice_thread_id, &attr, rtc_event_process, NULL);
1554 pthread_attr_destroy(&attr);
1555 if(result != 0)
1556 {
1557 slog(RTC_PRINT,SLOG_ERR, "[rtc-service] rtcservice_thread pthread_create faild!\n");
1558 return -1;
1559 }
1560 else
1561 {
1562 printf("[rtc-service] rtcservice_thread pthread_create SUCCESS!\n");
1563 }
1564 */
lh9ed821d2023-04-07 01:36:19 -07001565 hotplug_parse_register(DEVICE_TYPE_APP_RTC, rtc_app_msg_parse);
1566 msg_looper();
xf.li9d1a0e12023-09-20 01:43:20 -07001567 //klocwork
1568 //close_rtc(g_rtc_fd);
lh9ed821d2023-04-07 01:36:19 -07001569
xf.li9d1a0e12023-09-20 01:43:20 -07001570 //slog(RTC_PRINT, SLOG_ERR, "rtc-service exit...\n");
lh9ed821d2023-04-07 01:36:19 -07001571
xf.li9d1a0e12023-09-20 01:43:20 -07001572 return 0;
lh9ed821d2023-04-07 01:36:19 -07001573}