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