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