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