xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/rtc_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5 #include <errno.h>
6 #include <fcntl.h>
7 #include <sys/ioctl.h>
8 #include <sys/time.h>
9 #include <linux/rtc.h>
10 #include <unistd.h>
11 #include <ctype.h>
12 
13 #include "common.h"
14 #include "rtc_test.h"
15 #include "script.h"
16 #include "test_case.h"
17 #include "Language/language.h"
18 
19 
20 #define TAG	"[PCBA,RTC]: "
21 #define LOG(x...)	printf(TAG x)
22 
23 
rtc_xopen(int flags)24 int rtc_xopen(int flags)
25 {
26 	int rtc;
27 	char major_rtc[] = "/dev/rtc";
28 	char minor_rtc[] = "/dev/rtc0";
29 
30 	rtc = open(major_rtc, flags);
31 	if (rtc < 0) {
32 		rtc = open(minor_rtc, flags);
33 		if (rtc < 0) {
34 			printf("open %s failed:%s\n", minor_rtc,
35 			       strerror(errno));
36 		}
37 	}
38 
39 	else {
40 		printf("open %s\n", major_rtc);
41 	}
42 	return rtc;
43 }
44 
rtc_read_tm(struct tm * ptm,int fd)45 int rtc_read_tm(struct tm *ptm, int fd)
46 {
47 	int ret;
48 
49 	memset(ptm, 0, sizeof(*ptm));
50 
51 	ret = ioctl(fd, RTC_RD_TIME, ptm);
52 	if (ret < 0)
53 		printf("read rtc failed:%s\n", strerror(errno));
54 	else
55 		ptm->tm_isdst = -1;	/* "not known" */
56 
57 	return ret;
58 }
59 
read_rtc(time_t * time_p)60 static int read_rtc(time_t *time_p)
61 {
62 	int fd;
63 	int ret;
64 	struct tm tm_time;
65 
66 	//fd = rtc_xopen(O_RDONLY);
67 	fd = open("/dev/rtc0", O_RDONLY);
68 	if (fd < 0)
69 		return fd;
70 	else
71 		ret = rtc_read_tm(&tm_time, fd);
72 
73 	close(fd);
74 
75 	if (ret < 0)
76 		return ret;
77 
78 	else
79 		*time_p = mktime(&tm_time);
80 
81 	return 0;
82 }
83 
get_system_time(char * dt)84 int get_system_time(char *dt)
85 {
86 	int ret;
87 	int fd;
88 	time_t t;
89 	time_t timep;
90 	struct tm *p;
91 
92 	ret = read_rtc(&timep);
93 	if (ret < 0)
94 		return ret;
95 
96 	else
97 		p = localtime(&timep);
98 
99 	sprintf(dt, "%04d-%02d-%02d %02d:%02d:%02d", (1900 + p->tm_year),
100 		(1 + p->tm_mon), p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
101 
102 	return 0;
103 }
104 
set_system_time(struct timeval * tv)105 int set_system_time(struct timeval *tv)
106 {
107 	int ret;
108 	int fd;
109 
110 	fd = open("/dev/rtc0", O_RDWR);
111 	if (fd < 0) {
112 		printf("open /dev/rtc0 failed:%s\n", strerror(errno));
113 		return -1;
114 	}
115 	ret = ioctl(fd, RTC_SET_TIME, tv);
116 	//ret = ioctl(fd, ANDROID_ALARM_SET_RTC, tv);
117 	if (ret < 0) {
118 		printf("set rtc failed:%s\n", strerror(errno));
119 		return -1;
120 	}
121 
122   close(fd);
123 
124 	return 0;
125 }
126 
127 
rtc_test(void * argc)128 void *rtc_test(void *argc)
129 {
130 	struct testcase_info *tc_info = (struct testcase_info *)argc;
131 	char dt[32] = { "20120926.132600" };
132 	int ret, y;
133 	struct tm tm;
134 	struct timeval tv;
135 	char *s;
136 	int day, hour;
137 	time_t t;
138 	struct tm *p;
139 	struct timespec ts;
140 	struct rtc_time rtc;
141 
142 	/* remind ddr test */
143 	if (tc_info->y <= 0)
144 		tc_info->y = get_cur_print_y();
145 	y = tc_info->y;
146 
147 	ui_print_xy_rgba(0, y, 255, 255, 0, 255, "%s:[%s..]\n", PCBA_RTC,
148 			 PCBA_TESTING);
149 
150 #if 0
151 	s = malloc(32);
152 	if (script_fetch("rtc", "module_args", (int *)dt, 8) == 0)
153 		strncpy(s, dt, 32);
154 	day = atoi(s);
155 	while (*s && *s != '.')
156 		s++;
157 	if (*s)
158 		s++;
159 	hour = atoi(s);
160 
161 	tm.tm_year = day / 10000 - 1900;
162 	tm.tm_mon = (day % 10000) / 100 - 1;
163 	tm.tm_mday = (day % 100);
164 	tm.tm_hour = hour / 10000;
165 	tm.tm_min = (hour % 10000) / 100;
166 	tm.tm_sec = (hour % 100);
167 	tm.tm_isdst = -1;
168 	tv.tv_sec = mktime(&tm);
169 	tv.tv_usec = 0;
170 	printf("set rtc time :%lu\n", tv.tv_sec);
171 	//ret = set_system_time(&tv);
172 	ret = set_system_time(&tm);
173 	if (ret < 0) {
174 		printf("test rtc failed:set_system_time failed\n");
175 		ret = -1;
176 	}
177 
178 	else {
179 		sleep(1);
180 
181 		while (1) {
182 			t = get_system_time(dt);
183 			if (t < 0) {
184 				ret = -1;
185 				break;
186 			}
187 			p = localtime(&t);
188 
189 			ui_display_sync(0, y, 0, 255, 0, 255,
190 					"%s:[%s] { %04d/%02d/%02d %02d:%02d:%02d }\n",
191 					PCBA_RTC, PCBA_SECCESS,
192 					(1900 + p->tm_year),
193 					(1 + p->tm_mon), p->tm_mday,
194 					p->tm_hour, p->tm_min, p->tm_sec);
195 			sleep(1);
196 		}
197 	}
198 #else
199 {
200     int rst;
201     char result_filename[100] = {0};
202 
203     LOG("=======pcba_core :start rtc test========\n");
204     rst = run_test_item_cmd("echo_auto_test echo_rtc_test");
205 
206     if(rst == 0) {
207         snprintf(result_filename, sizeof(result_filename),
208 		        "%s/echo_%s_test_result", "/tmp",tc_info->base_info->name);
209         ret = parse_test_result(result_filename, "rtc_test", NULL);
210     } else {
211         return NULL;
212     }
213 
214     #define MINOR_RTC_PATH "/dev/rtc0"
215 
216     //show time
217     if (ret == 0) {
218         int fd,ret;
219         struct tm tm_p;
220 
221         //LOG("==========rtc_get_system_time_test start===========\n");
222         //fd = rtc_xopen(O_RDONLY|O_NOCTTY|O_NDELAY);
223         fd = open(MINOR_RTC_PATH, O_RDONLY);
224         if (fd < 0) {
225             LOG("open %s failed:%s\n", MINOR_RTC_PATH,strerror(errno));
226             return argc;
227         }
228 
229         memset(&tm_p,0,sizeof(tm_p));
230         ret = ioctl(fd, RTC_RD_TIME, &tm_p);
231         if (ret < 0) {
232             LOG("test rtc failed:get_system_time failed: %s\n",strerror(errno));
233     		tc_info->result = -1;
234     		ui_print_xy_rgba(0, y, 255, 0, 0, 255, "%s:[%s]\n",
235                             PCBA_RTC, PCBA_FAILED);
236             return NULL;
237         }
238     	else {
239             //LOG("rtc test: rtc_get_system_time success.\n");
240             mktime(&tm_p);  //ʹ��mktime�����õ�time_t��ʽ�����
241 
242             //LOG("test time is: %04d-%02d-%02d %02d:%02d:%02d\n", 1900+tm_p.tm_year,
243             //       1 + tm_p.tm_mon, tm_p.tm_mday, tm_p.tm_hour, tm_p.tm_min, tm_p.tm_sec);
244 
245             tc_info->result = 0;
246 			ui_display_sync(0, y, 0, 255, 0, 255,
247         					"%s:[%s] { %04d/%02d/%02d %02d:%02d:%02d }\n",
248         					PCBA_RTC, PCBA_SECCESS,
249         					1900+tm_p.tm_year, 1 + tm_p.tm_mon, tm_p.tm_mday,
250         					tm_p.tm_hour, tm_p.tm_min, tm_p.tm_sec);
251         }
252 
253         //LOG("System time is :%s\n",asctime(&tm_p));
254         close(fd);
255         //LOG("==========rtc_get_system_time_test finish.===========\n");
256         return 0;
257     } else {
258 		tc_info->result = -1;
259 		ui_print_xy_rgba(0, y, 255, 0, 0, 255, "%s:[%s]\n",
260                         PCBA_RTC, PCBA_FAILED);
261         return argc;
262     }
263 }
264 #endif
265 	if (ret == 0) {
266 		tc_info->result = 0;
267 		ui_print_xy_rgba(0, y, 0, 255, 0, 255, "%s:[%s]\n",
268 				        PCBA_RTC, PCBA_SECCESS);
269 	} else {
270 		tc_info->result = -1;
271 		ui_print_xy_rgba(0, y, 255, 0, 0, 255, "%s:[%s]\n",
272                         PCBA_RTC,PCBA_FAILED);
273 	}
274 	return argc;
275 }
276