xref: /OK3568_Linux_fs/external/rk_pcba_test/echo_rtc_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  rtc_test.c  --  rtc test application
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2017 Rockchip Electronics Co. Ltd.
5*4882a593Smuzhiyun  *  Author: Panzhenzhuan Wang <randy.wang@rock-chips.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun  * You may obtain a copy of the License at
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * 	 http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun  * limitations under the License.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun //RTC�����ܳ�����������ϵͳʱ��ͻ�ȡϵͳʱ��
20*4882a593Smuzhiyun #include <stdio.h>
21*4882a593Smuzhiyun #include <stdlib.h>
22*4882a593Smuzhiyun #include <string.h>
23*4882a593Smuzhiyun //time���ͷ�ļ�
24*4882a593Smuzhiyun #include <time.h>
25*4882a593Smuzhiyun #include <sys/time.h>
26*4882a593Smuzhiyun //open()���ͷ�ļ�
27*4882a593Smuzhiyun #include <sys/types.h>
28*4882a593Smuzhiyun #include <sys/stat.h>
29*4882a593Smuzhiyun #include <fcntl.h>
30*4882a593Smuzhiyun //error���ͷ�ļ�
31*4882a593Smuzhiyun #include <errno.h>
32*4882a593Smuzhiyun //RTC�й�ͷ�ļ�
33*4882a593Smuzhiyun #include <linux/rtc.h>
34*4882a593Smuzhiyun #include <sys/ioctl.h>
35*4882a593Smuzhiyun #include <unistd.h>
36*4882a593Smuzhiyun #include "rtc_test.h"
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define LOG_TAG "rtc_test"
39*4882a593Smuzhiyun #include "common.h"
40*4882a593Smuzhiyun #define RTC_PROC_ERR -95
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define RTC_TIME_DIFF 1
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define MAJOR_RTC_PATH "/dev/rtc"
45*4882a593Smuzhiyun #define MINOR_RTC_PATH "/dev/rtc0"
46*4882a593Smuzhiyun #define MAX_TEST 2
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun //* ��ȡRTC��ȡ·��
rtc_xopen(int flags)49*4882a593Smuzhiyun int rtc_xopen(int flags)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	int rtc_fd;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	rtc_fd = open(MAJOR_RTC_PATH, flags);
54*4882a593Smuzhiyun 	if (rtc_fd < 0) {
55*4882a593Smuzhiyun 		rtc_fd = open(MINOR_RTC_PATH, flags);
56*4882a593Smuzhiyun 		if (rtc_fd < 0) {
57*4882a593Smuzhiyun 			printf("open %s failed:%s\n", MINOR_RTC_PATH,
58*4882a593Smuzhiyun 			       strerror(errno));
59*4882a593Smuzhiyun 		}
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	else {
63*4882a593Smuzhiyun 		printf("open %s\n", MAJOR_RTC_PATH);
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 	return rtc_fd;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun //* ����ϵͳʱ��
set_system_time(struct tm * tm_p)69*4882a593Smuzhiyun int set_system_time(struct tm *tm_p)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     int ret;
72*4882a593Smuzhiyun     int fd;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun     //fd = rtc_xopen(O_RDWR|O_NOCTTY|O_NDELAY);
75*4882a593Smuzhiyun     fd = open(MINOR_RTC_PATH, O_RDWR|O_NOCTTY|O_NDELAY);
76*4882a593Smuzhiyun     if (fd < 0)
77*4882a593Smuzhiyun     {
78*4882a593Smuzhiyun         printf("open %s failed:%s\n", MINOR_RTC_PATH,strerror(errno));
79*4882a593Smuzhiyun         return -1;
80*4882a593Smuzhiyun     }
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun     //ʹ��RTC��Ӧ��ioctl��������ʱ��
83*4882a593Smuzhiyun     ret = ioctl(fd, RTC_SET_TIME, tm_p);
84*4882a593Smuzhiyun     if (ret < 0)
85*4882a593Smuzhiyun     {
86*4882a593Smuzhiyun         printf("set rtc failed:%s\n", strerror(errno));
87*4882a593Smuzhiyun         return -1;
88*4882a593Smuzhiyun     }
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun     close(fd);
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun     return 0;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun //1��rtc����ϵͳʱ�����
rtc_set_system_time_test(char * time_set,time_t * local_time)96*4882a593Smuzhiyun int rtc_set_system_time_test(char *time_set, time_t *local_time)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun     char *s;
99*4882a593Smuzhiyun     int day, hour;
100*4882a593Smuzhiyun     struct tm tm_p;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     printf("==========rtc_set_system_time_test start===========\n");
103*4882a593Smuzhiyun     s = time_set;
104*4882a593Smuzhiyun     //�����ꡢ�¡���,�õ����Ǹ���ʱ��
105*4882a593Smuzhiyun     day = atoi(s);
106*4882a593Smuzhiyun     //printf("day value is %d\n",day);
107*4882a593Smuzhiyun     tm_p.tm_year = day/10000 - 1900;
108*4882a593Smuzhiyun     tm_p.tm_mon = (day%10000)/100 - 1;
109*4882a593Smuzhiyun     tm_p.tm_mday = (day%100);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     //ѭ������С����������ֵ����ʱ����ֵ
112*4882a593Smuzhiyun     while (*s && *s != '.')
113*4882a593Smuzhiyun         s++;
114*4882a593Smuzhiyun     if (*s)
115*4882a593Smuzhiyun         s++;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun     //����ʱ���֡���
118*4882a593Smuzhiyun     hour = atoi(s);
119*4882a593Smuzhiyun     //printf("hour value is %d\n",hour);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun     tm_p.tm_hour = hour/10000;
122*4882a593Smuzhiyun     tm_p.tm_min = (hour%10000)/100;
123*4882a593Smuzhiyun     tm_p.tm_sec = (hour%100);
124*4882a593Smuzhiyun     tm_p.tm_isdst = -1;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun     //mktime()�����γɱ���ʱ��
127*4882a593Smuzhiyun     *local_time = mktime(&tm_p);
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     //struct tm *��ʽ���룬��ӡ���õı���ʱ��
130*4882a593Smuzhiyun     //printf("asctime(&tm_p) is %s\n",asctime(&tm_p));
131*4882a593Smuzhiyun     //time_t *��ʽ���룬��ӡ���õı���ʱ��
132*4882a593Smuzhiyun     //printf("ctime(local_time) is %s\n",ctime(local_time));
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     /*1������ϵͳʱ��*/
135*4882a593Smuzhiyun     int ret;
136*4882a593Smuzhiyun     ret = set_system_time(&tm_p);
137*4882a593Smuzhiyun     if (ret < 0)
138*4882a593Smuzhiyun     {
139*4882a593Smuzhiyun         //printf("test rtc failed:set_system_time failed.\n");
140*4882a593Smuzhiyun         ret = -1;
141*4882a593Smuzhiyun     }
142*4882a593Smuzhiyun     else
143*4882a593Smuzhiyun     {
144*4882a593Smuzhiyun         //printf("rtc test: rtc_set_system_time success.\n");
145*4882a593Smuzhiyun         ret = 0;
146*4882a593Smuzhiyun     }
147*4882a593Smuzhiyun     printf("==========rtc_set_system_time_test finish===========\n\n");
148*4882a593Smuzhiyun     return ret;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun //2����ȡϵͳʱ��
rtc_get_system_time_test(time_t * local_time)152*4882a593Smuzhiyun int rtc_get_system_time_test(time_t *local_time)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun     int fd,ret;
155*4882a593Smuzhiyun     struct tm tm_p;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun     //printf("==========rtc_get_system_time_test start===========\n");
158*4882a593Smuzhiyun     //fd = rtc_xopen(O_RDONLY|O_NOCTTY|O_NDELAY);
159*4882a593Smuzhiyun     fd = open(MINOR_RTC_PATH, O_RDONLY);
160*4882a593Smuzhiyun     if (fd < 0)
161*4882a593Smuzhiyun     {
162*4882a593Smuzhiyun         printf("open %s failed:%s\n", MINOR_RTC_PATH,strerror(errno));
163*4882a593Smuzhiyun         return -1;
164*4882a593Smuzhiyun     }
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun     //ʹ��RTC��Ӧ��ioctl������ȡϵͳʱ��
167*4882a593Smuzhiyun     memset(&tm_p,0,sizeof(tm_p));
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun     ret = ioctl(fd, RTC_RD_TIME, &tm_p);
170*4882a593Smuzhiyun     if (ret < 0)
171*4882a593Smuzhiyun     {
172*4882a593Smuzhiyun         printf("test rtc failed:get_system_time failed: %s\n",strerror(errno));
173*4882a593Smuzhiyun         return -1;
174*4882a593Smuzhiyun     }
175*4882a593Smuzhiyun 	else
176*4882a593Smuzhiyun     {
177*4882a593Smuzhiyun         //printf("rtc test: rtc_get_system_time success.\n");
178*4882a593Smuzhiyun         *local_time = mktime(&tm_p);  //ʹ��mktime�����õ�time_t��ʽ�����
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun         //printf("test time is: %04d-%02d-%02d %02d:%02d:%02d\n", 1900+tm_p.tm_year,
181*4882a593Smuzhiyun         //       1 + tm_p.tm_mon, tm_p.tm_mday, tm_p.tm_hour, tm_p.tm_min, tm_p.tm_sec);
182*4882a593Smuzhiyun     }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     //printf("System time is :%s\n",asctime(&tm_p));
185*4882a593Smuzhiyun     close(fd);
186*4882a593Smuzhiyun     //printf("==========rtc_get_system_time_test finish.===========\n");
187*4882a593Smuzhiyun     return 0;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
rtc_test(void * argv)190*4882a593Smuzhiyun void *rtc_test(void *argv)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun     char time_set[32] = {"20180101.120000" };   //��Ҫ���õ�ϵͳʱ����š�.��ǰ���������գ�������ʱ����
193*4882a593Smuzhiyun     int ret =0;
194*4882a593Smuzhiyun     time_t lt_set,lt_get1,lt_get2;
195*4882a593Smuzhiyun     char cmd[128];
196*4882a593Smuzhiyun     int count = 0;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun     //printf("=================rtc test start=================\n\n");
199*4882a593Smuzhiyun     //sprintf(cmd,"aplay %s/rtc_test_start.wav",AUDIO_PATH);
200*4882a593Smuzhiyun     //system(cmd);
201*4882a593Smuzhiyun     //system("aplay /data/test/rtc_test_start.wav");
202*4882a593Smuzhiyun     //* 1����������ϵͳʱ��*/
203*4882a593Smuzhiyun     ret = rtc_set_system_time_test(time_set,&lt_set);
204*4882a593Smuzhiyun     if(ret<0)
205*4882a593Smuzhiyun         goto fail;
206*4882a593Smuzhiyun     sleep(RTC_TIME_DIFF); //����RTC_TIME_DIFF s
207*4882a593Smuzhiyun     lt_get1 = lt_set;
208*4882a593Smuzhiyun     //* 2��Ȼ���ȡϵͳʱ�䡢�Ӷ�֪��RTC�Ƿ���������*/
209*4882a593Smuzhiyun     ret = rtc_get_system_time_test(&lt_get2);
210*4882a593Smuzhiyun     if(ret<0)
211*4882a593Smuzhiyun         goto fail;
212*4882a593Smuzhiyun     //printf("lt_get2-lt_get1 = %d\n",lt_get2-lt_get1);
213*4882a593Smuzhiyun     //printf("lt_set is \t: %s\n",ctime(&lt_set));
214*4882a593Smuzhiyun     //printf("lt_get2 is \t: %s\n",ctime(&lt_get2));
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun     //��������s����RTC�����������ӣ�������ǣ������ʧ��
217*4882a593Smuzhiyun     if(RTC_TIME_DIFF>(lt_get2%60-lt_get1%60)){
218*4882a593Smuzhiyun         ret = -1;
219*4882a593Smuzhiyun         goto fail;
220*4882a593Smuzhiyun     }
221*4882a593Smuzhiyun     //printf("=================rtc test success=================\n");
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun     return (void*)ret;
224*4882a593Smuzhiyun     fail:
225*4882a593Smuzhiyun         printf("=================rtc test failed=================\n");
226*4882a593Smuzhiyun         return (void*)ret;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 
main(int argc,char * argv[])230*4882a593Smuzhiyun int main(int argc, char *argv[])
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun     int test_flag = 0,err_code = 0;
233*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = "rtc_test";
234*4882a593Smuzhiyun     char result[COMMAND_VALUESIZE] = RESULT_PASS;
235*4882a593Smuzhiyun     test_flag = (int)rtc_test(argv[0]);
236*4882a593Smuzhiyun     if(test_flag < 0)
237*4882a593Smuzhiyun     {
238*4882a593Smuzhiyun         strcpy(result,RESULT_FAIL);
239*4882a593Smuzhiyun         err_code = RTC_PROC_ERR;
240*4882a593Smuzhiyun     }
241*4882a593Smuzhiyun     send_msg_to_server(buf, result, err_code);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
244