xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/ddr_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 
6 #include "test_case.h"
7 #include "ddr_test.h"
8 #include "common.h"
9 //#include "extra-functions.h"
10 #include "language.h"
11 
12 #define MAX_TEST 255
13 #define MAX_USE_RATE 0.850000
14 #define DDR_TXT "/data/get_ddr_msg.txt"
15 #define DDR_NOTE "/proc/driver/ddr_ts"
16 
17 #define GET_TOTAL_SIZE  0x01
18 #define GET_USE_RATE	0x02
19 #define GET_FREE_RATE	0x03
20 
21 #define TAG	"[PCBA,DDR]: "
22 #define LOG(x...)	printf(TAG x)
23 
24 
25 #if 0
26 static float total_size;
27 
28 int get_data(char *buf, char *data)
29 {
30 	char *p1 = NULL, *p2 = NULL;
31 	int num = 0;
32 
33 	p1 = buf;
34 	p2 = strstr(p1, data);
35 	if (p2 == NULL) {
36 		printf("%s no find  %s --- %s\r\n", __func__, buf, data);
37 		return 0;
38 	}
39 
40 	p1 = p2 + strlen(data);
41 	while (1) {
42 		if (p1[0] != 0x20)
43 			break;
44 
45 		p1++;
46 	}
47 
48 	num = atoi(p1);
49 
50 	return num;
51 }
52 
53 float get_ddr_msg(int state)
54 {
55 	FILE *fp = NULL;
56 	char command[1024], buf[1024];
57 	int num = 0, len = 0, ddr_free = 0, ddr_used = 0;
58 	float result;
59 
60 	memset(command, 0, sizeof(command));
61 	sprintf(command, "busybox top -n1 | busybox grep Mem: > %s", DDR_TXT);
62 	__system(command);
63 
64 	fp = fopen(DDR_TXT, "r");
65 	if (fp == NULL) {
66 		printf("%s open err\r\n", __func__);
67 		return -1;
68 	}
69 
70 	memset(buf, 0, sizeof(buf));
71 	len = fread(buf, 1, sizeof(buf), fp);
72 	if (len <= 0) {
73 		printf("%s read err\r\n", __func__);
74 		fclose(fp);
75 		return -1;
76 	}
77 
78 	ddr_used = get_data(buf, "Mem:");
79 	ddr_free = get_data(buf, "used,");
80 
81 	if (ddr_free == 0 || ddr_used == 0) {
82 		fclose(fp);
83 		return -1;
84 	}
85 
86 	fclose(fp);
87 
88 	switch (state) {
89 	case GET_TOTAL_SIZE:
90 		return ((float)ddr_used + (float)ddr_free);
91 
92 	case GET_USE_RATE:
93 		return ((float)ddr_used / ((float)ddr_used + (float)ddr_free));
94 
95 	case GET_FREE_RATE:
96 		break;
97 
98 	default:
99 		break;
100 	}
101 
102 	return -1;
103 }
104 
105 int get_block_size(int total_size)
106 {
107 	if (total_size < 256 * 1024)
108 		return -1;
109 
110 	return ((total_size / 256) * 5);
111 }
112 
113 int ddr_check_test(void)
114 {
115 	char *ddr_data1[MAX_TEST];
116 	char *ddr_data2[MAX_TEST];
117 	int val = 0, num = 0, result = 0, i = 0, block_size = 0, y = 0;
118 	float use_rate = 0;
119 
120 	block_size = get_block_size((int)total_size);
121 	if (block_size <= 0)
122 		return -1;
123 
124 	while (1) {
125 		if (num >= MAX_TEST)
126 			break;
127 
128 		use_rate = get_ddr_msg(GET_USE_RATE);
129 		if (use_rate >= MAX_USE_RATE) {
130 			printf("%s : test ok :%f\r\n", __func__, use_rate);
131 			break;
132 		}
133 
134 		ddr_data1[num] = calloc(1, block_size * 1024);
135 		if (ddr_data1[num] == NULL)
136 			break;
137 
138 		ddr_data2[num] = calloc(1, block_size * 1024);
139 		if (ddr_data2[num] == NULL)
140 			break;
141 
142 		memset(ddr_data1[num], num, block_size * 1024);
143 		memset(ddr_data2[num], num, block_size * 1024);
144 
145 		if (memcmp(ddr_data1[num], ddr_data2[num], block_size * 1024)) {
146 			result = -1;
147 			break;
148 		}
149 		num++;
150 	}
151 
152 	for (i = 0; i < num; i++) {
153 		if (ddr_data1[i])
154 			free(ddr_data1[i]);
155 
156 		if (ddr_data2[i])
157 			free(ddr_data2[i]);
158 	}
159 
160 	return result;
161 }
162 
163 int ddr_freq_test(void)
164 {
165 	char cmd[512];
166 	int max_freq = 0, min_freq = 0, ret = 0, freq_test = 0;
167 
168 	if (script_fetch("ddr", "freq_test", &freq_test, 1) != 0) {
169 		printf("%s: freq test err : %d !!!\r\n", __func__, min_freq);
170 		return -1;
171 	}
172 
173 	if (freq_test > 0) {
174 		/* check node */
175 		ret = access(DDR_NOTE, F_OK);
176 		if (ret != 0) {
177 			printf("%s:note err !!!\r\n", __func__);
178 			return -1;
179 		}
180 
181 		if (script_fetch("ddr", "max_freq", &max_freq, 1) != 0) {
182 			printf("%s: max freq err : %d !!!\r\n", __func__,
183 			       max_freq);
184 			return -1;
185 		}
186 
187 		if (script_fetch("ddr", "min_freq", &min_freq, 1) != 0) {
188 			printf("%s: min freq err : %d !!!\r\n", __func__,
189 			       min_freq);
190 			return -1;
191 		}
192 
193 		if (min_freq <= 0 || max_freq <= 0) {
194 			printf("%s: parameter error err : %d,%s !!!\r\n",
195 			       __func__, min_freq, max_freq);
196 			return -1;
197 		} else {
198 			memset(cmd, 0, sizeof(cmd));
199 			sprintf(cmd, "echo 'a:%dM-%dM-1000T' > %s &", min_freq,
200 				max_freq, DDR_NOTE);
201 			printf("%s: set ddr freq cmd: %s \r\n", __func__, cmd);
202 			__system(cmd);
203 		}
204 	}
205 
206 	return 0;
207 }
208 #endif
209 
ddr_test(void * argv)210 void *ddr_test(void *argv)
211 {
212 	int ret = 0, y;
213 	struct testcase_info *tc_info = (struct testcase_info *)argv;
214 
215 	/* remind ddr test */
216 	if (tc_info->y <= 0)
217 		tc_info->y = get_cur_print_y();
218 
219     y = tc_info->y;
220 	ui_print_xy_rgba(0, tc_info->y, 255, 255, 0, 255, "%s:[%s..]\n",
221 			 PCBA_DDR, PCBA_TESTING);
222 
223 #if 0    //Android pcba test
224 	/* get ddr total size */
225 	total_size = get_ddr_msg(GET_TOTAL_SIZE);
226 
227 	/* check ddr test */
228 	ret = ddr_check_test();
229 	if (ret < 0) {
230 		ui_print_xy_rgba(0, tc_info->y, 255, 0, 0, 255,
231 				 "%s:[%s] {%s}\n", PCBA_DDR, PCBA_FAILED,
232 				 PCBA_ERR_CHECK);
233 		goto ERR;
234 	}
235 	/* ddr freq test */
236 	ret = ddr_freq_test();
237 	if (ret < 0) {
238 		ui_print_xy_rgba(0, tc_info->y, 255, 0, 0, 255,
239 				 "%s:[%s] {%s}\n", PCBA_DDR, PCBA_FAILED,
240 				 PCBA_ERR_FREQ);
241 		goto ERR;
242 	}
243 
244 	tc_info->result = 1;
245 	ui_print_xy_rgba(0, tc_info->y, 0, 255, 0, 255, "%s:[%s] { %d MB }\n",
246 			 PCBA_DDR, PCBA_SECCESS, ((int)total_size) / 1024);
247 	return argv;
248 
249 ERR:
250 	tc_info->result = -1;
251 #else    //Linux pcba test
252 
253     int rst;
254     char ddr_buf[128]= {0};
255     char ddr_size[32] = {0};
256     char result_filename[100] = {0};
257 
258     printf("======================start ddr test=============================\n");
259     rst = run_test_item_cmd("echo_auto_test echo_ddr_test");
260 
261     if(rst == 0) {
262         snprintf(result_filename, sizeof(result_filename),
263                 "%s/echo_ddr_test_result", "/tmp");
264         ret = parse_test_result(result_filename, "ddr_test", ddr_buf);
265 
266     }else  {
267         return NULL;
268     }
269 
270     if(ret == 0) {
271         if(strstr(ddr_buf, "size") != NULL) {
272             char *result = NULL;
273             char delims[] = " ";
274 
275             memset(ddr_size, 0, sizeof(ddr_size));
276             result = strtok(ddr_buf, delims );
277             while( result != NULL ) {
278                 printf("result is \"%s\"\n", result);
279 
280                 if(strstr(result,"size")!= NULL){
281                     strcat(ddr_size, result);
282                 }
283 
284                 result = strtok( NULL, delims );
285             }
286         }
287         ui_print_xy_rgba(0,  y, 0, 255, 0, 255, "%s:[%s] { %s }\n", PCBA_DDR,
288                  PCBA_SECCESS, ddr_size);
289         tc_info->result = 0;
290         LOG("ddr_test success.\n");
291     } else {
292         ui_print_xy_rgba(0,  y, 225, 0, 0, 255, "%s:[%s] { %s }\n", PCBA_DDR,
293                  PCBA_FAILED, ddr_size);
294         tc_info->result = -1;
295         LOG("ddr_test failed.\n");
296     }
297 #endif
298 
299 	return argv;
300 }
301