]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-dad.git/blob - sw/app/lx_dad/appl_tests.c
0a8d09c5c627aa177cecb6dc3cf1dcfd3eade84b
[fpga/lx-cpu1/lx-dad.git] / sw / app / lx_dad / appl_tests.c
1 #include <system_def.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <ctype.h>
6 #include <stddef.h>
7 #include <utils.h>
8 #include <cmd_proc.h>
9 #include <hal_gpio.h>
10 #include <hal_mpu.h>
11 #include <hal_machperiph.h>
12 #include <LPC17xx.h>
13 #include <spi_drv.h>
14 #include <lt_timer.h>
15
16 #include <ul_log.h>
17 #include <ul_logreg.h>
18
19 #include "appl_defs.h"
20
21 int cmd_do_test_memusage(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
22 {
23   void *maxaddr;
24   char str[40];
25
26   maxaddr = sbrk(0);
27
28   snprintf(str,sizeof(str),"memusage maxaddr 0x%08lx\n",(unsigned long)maxaddr);
29   cmd_io_write(cmd_io,str,strlen(str));
30
31   return 0;
32 }
33
34 int cmd_do_test_adc(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
35 {
36   printf("ADC: %ld %ld %ld %ld %ld\n",(LPC_ADC->DR[0] & 0xFFF0)>>4,
37                                       (LPC_ADC->DR[1] & 0xFFF0)>>4,
38                                       (LPC_ADC->DR[2] & 0xFFF0)>>4,
39                                       (LPC_ADC->DR[3] & 0xFFF0)>>4,
40                                       (LPC_ADC->DR[7] & 0xFFF0)>>4);
41   return 0;
42 }
43
44 #ifdef APPL_WITH_DISTORE_EEPROM_USER
45 int cmd_do_test_distore(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
46 {
47   appl_distore_user_set_check4change();
48   return 0;
49 }
50
51 int cmd_do_test_diload(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
52 {
53   appl_distore_user_restore();
54   return 0;
55 }
56 #endif /*APPL_WITH_DISTORE_EEPROM_USER*/
57
58 int cmd_do_test_loglevel_cb(ul_log_domain_t *domain, void *context)
59 {
60   char s[30];
61   cmd_io_t *cmd_io = (cmd_io_t *)context;
62
63   s[sizeof(s)-1]=0;
64   snprintf(s,sizeof(s)-1,"%s (%d)\n\r",domain->name, domain->level);
65   cmd_io_puts(cmd_io, s);
66   return 0;
67 }
68
69 int cmd_do_test_loglevel(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
70 {
71   int res=0;
72   char *line;
73   line = param[1];
74
75   if(!line||(si_skspace(&line),!*line)) {
76     ul_logreg_for_each_domain(cmd_do_test_loglevel_cb, cmd_io);
77   } else {
78     res=ul_log_domain_arg2levels(line);
79   }
80
81   return res>=0?0:CMDERR_BADPAR;
82 }
83
84 int cmd_do_spimst_blocking(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
85 {
86   int res;
87   int opchar;
88   char *p=param[3];
89   int spi_chan = (int)(intptr_t)des->info[0];
90   uint8_t *tx_buff = NULL;
91   uint8_t *rx_buff = NULL;
92   long addr = 0;
93   int len = 0;
94   spi_drv_t *spi_drv;
95
96   if((opchar=cmd_opchar_check(cmd_io,des,param))<0) return opchar;
97   if(opchar!=':')
98     return -CMDERR_OPCHAR;
99
100   if(spi_chan==-1)
101     spi_chan=*param[1]-'0';
102
103   spi_drv = spi_find_drv(NULL, spi_chan);
104   if(spi_drv==NULL)
105     return -CMDERR_BADSUF;
106
107   p=param[3];
108
109   si_skspace(&p);
110   if(isdigit((int)*p)){
111     if(si_long(&p,&addr,16)<0) return -CMDERR_BADPAR;
112   }
113   if(si_fndsep(&p,"({")<0) return -CMDERR_BADSEP;
114
115   if((res=si_add_to_arr(&p, (void**)&tx_buff, &len, 16, 1, "})"))<0)
116     return -CMDERR_BADPAR;
117
118   rx_buff=malloc(len);
119
120   res=-1;
121   if(rx_buff!=NULL)
122     res = spi_transfer_with_mode(spi_drv, addr, len, tx_buff, rx_buff, SPI_MODE_3);
123
124   if(res < 0) {
125     printf("SPI! %02lX ERROR\n",addr);
126   } else {
127     int i;
128     printf("SPI! %02lX ",addr);
129     printf("TX(");
130     for(i=0;i<len;i++) printf("%s%02X",i?",":"",tx_buff[i]);
131     printf(") RX(");
132     for(i=0;i<len;i++) printf("%s%02X",i?",":"",rx_buff[i]);
133     printf(")");
134     printf("\n");
135     return 0;
136   }
137
138   if(rx_buff)
139     free(rx_buff);
140   if(tx_buff)
141     free(tx_buff);
142
143   return 0;
144 }
145
146 int sdram_access_test(void)
147 {
148   unsigned int *ptr;
149   unsigned int pattern;
150   size_t ramsz = SDRAM_SIZE;
151   size_t cnt;
152   lt_mstime_t tic;
153   size_t blksz, i;
154
155   lt_mstime_update();
156   tic = actual_msec;
157
158   pattern = 0x12abcdef;
159   for (cnt = ramsz/sizeof(*ptr), ptr = (typeof(ptr))SDRAM_BASE; cnt--;) {
160     *(ptr++) = pattern;
161     pattern = pattern + 0x87654321;
162   }
163
164   lt_mstime_update();
165   printf("SDRAM write %d ms\n", (int)(lt_msdiff_t)(actual_msec - tic));
166
167   lt_mstime_update();
168   tic = actual_msec;
169
170   pattern = 0x12abcdef;
171   for (cnt = ramsz/sizeof(*ptr), ptr = (typeof(ptr))SDRAM_BASE; cnt--;) {
172     if(*ptr != pattern) {
173       printf("SDRAM error modify at %p (%08x)\n", ptr, *ptr ^ pattern);
174       return -1;
175     }
176     *(ptr++) = ~pattern;
177     pattern = pattern + 0x87654321;
178   }
179
180   lt_mstime_update();
181   printf("SDRAM modify %d ms\n", (int)(lt_msdiff_t)(actual_msec - tic));
182
183   lt_mstime_update();
184   tic = actual_msec;
185
186   pattern = 0x12abcdef;
187   for (cnt = ramsz/sizeof(*ptr), ptr = (typeof(ptr))SDRAM_BASE; cnt--;) {
188     if(*(ptr++) != ~pattern) {
189       printf("SDRAM error read at %p (%08x)\n", ptr, *ptr ^ pattern);
190       return -1;
191     }
192     pattern = pattern + 0x87654321;
193   }
194
195   lt_mstime_update();
196   printf("SDRAM read %d ms\n", (int)(lt_msdiff_t)(actual_msec - tic));
197
198   lt_mstime_update();
199   tic = actual_msec;
200
201   pattern = 0;
202   for (cnt = ramsz/sizeof(*ptr), ptr = (typeof(ptr))SDRAM_BASE; cnt--;) {
203     pattern += *(ptr++);
204   }
205
206   lt_mstime_update();
207   printf("SDRAM sum %d ms res 0x%08x\n", (int)(lt_msdiff_t)(actual_msec - tic), pattern);
208
209   for (blksz=1; blksz < 256 ; blksz *= 2) {
210     lt_mstime_update();
211     tic = actual_msec;
212
213     pattern = 0;
214     for (cnt = ramsz/sizeof(*ptr); cnt; cnt -= blksz) {
215       ptr = (typeof(ptr))SDRAM_BASE;
216       //ptr = (typeof(ptr))cmd_do_test_memusage;
217       //ptr = (typeof(ptr))&ptr;
218       for (i = blksz; i--; )
219         pattern += *(ptr++);
220     }
221     lt_mstime_update();
222     printf("SDRAM sum %d blksz %d ms res 0x%08x\n", (int)(lt_msdiff_t)(actual_msec - tic), (int)blksz, pattern);
223   }
224
225   return 0;
226 }
227
228 int cmd_do_testsdram(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
229 {
230   sdram_access_test();
231   return 0;
232 }
233
234 int cmd_do_testmpu(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
235 {
236   int i;
237   int reg_cnt = hal_mpu_region_count();
238   uint32_t ra, rsz;
239
240   for (i = 0; i < reg_cnt; i++) {
241     MPU->RNR = i;
242     ra = MPU->RBAR & MPU_RBAR_ADDR_Msk;
243     rsz = (1 << (__mfld2val(MPU_RASR_SIZE_Msk, MPU->RASR) + 1)) - 1;
244     printf("R%d %08lX..%08lX %08lX %08lX\n", i, ra, ra + rsz, MPU->RBAR, MPU->RASR);
245   }
246
247   /*printf("IAP version %08X\n", lpcisp_read_partid());*/
248
249   return 0;
250 }
251
252 int cmd_do_goaddr(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
253 {
254   char *p;
255   long addr;
256
257   p = param[1];
258
259   si_skspace(&p);
260   if(si_ulong(&p,&addr,16)<0) return -CMDERR_BADPAR;
261
262   printf("Jump to address %08lX\n\n", addr);
263
264   ((void(*)(void))addr)();
265
266   return 0;
267 }
268
269 int cmd_do_mujtest(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
270 {
271         volatile uint32_t *testaddr  = (volatile uint32_t *)0x8000400C;
272         int p=(int) strtol(param[1], (char **)NULL, 10);
273         printf("jen muj testovaci vypis %X\n", p);
274         *testaddr = p;
275         return 0;
276 }
277
278 cmd_des_t const cmd_des_test_memusage={0, 0,
279                         "memusage","report memory usage",cmd_do_test_memusage,
280                         {0,
281                          0}};
282
283 cmd_des_t const cmd_des_test_adc={0, 0,
284                         "testadc","adc test",cmd_do_test_adc,
285                         {0,
286                          0}};
287
288 #ifdef APPL_WITH_DISTORE_EEPROM_USER
289 cmd_des_t const cmd_des_test_distore={0, 0,
290                         "testdistore","test DINFO store",cmd_do_test_distore,
291                         {0,
292                          0}};
293
294 cmd_des_t const cmd_des_test_diload={0, 0,
295                         "testdiload","test DINFO load",cmd_do_test_diload,
296                         {0,
297                          0}};
298 #endif /*APPL_WITH_DISTORE_EEPROM_USER*/
299
300 cmd_des_t const cmd_des_test_loglevel={0, 0,
301                         "loglevel","select logging level",
302                         cmd_do_test_loglevel,{}};
303
304 cmd_des_t const cmd_des_spimst={0, CDESM_OPCHR|CDESM_WR,
305                         "SPIMST","SPI master communication request",
306                         cmd_do_spimst_blocking,{(void*)0}};
307
308 cmd_des_t const cmd_des_spimstx={0, CDESM_OPCHR|CDESM_WR,
309                         "SPIMST#","SPI# master communication request",
310                         cmd_do_spimst_blocking,{(void*)-1}};
311
312 cmd_des_t const cmd_des_testsdram={0, 0,
313                         "testsdram","test SDRAM",
314                         cmd_do_testsdram,{(void*)0}};
315
316 cmd_des_t const cmd_des_testmpu={0, 0,
317                         "testmpu","test MPU",
318                         cmd_do_testmpu,{(void*)0}};
319
320 cmd_des_t const cmd_des_goaddr={0, 0,
321                         "goaddr","run from address",
322                         cmd_do_goaddr,{(void*)0}};
323                         
324 cmd_des_t const cmd_des_mujtest={0,0,"mujtest","run my simple test", cmd_do_mujtest,{(void*)0}};
325
326 cmd_des_t const *const cmd_appl_tests[]={
327   &cmd_des_test_memusage,
328   &cmd_des_test_adc,
329  #ifdef APPL_WITH_DISTORE_EEPROM_USER
330   &cmd_des_test_distore,
331   &cmd_des_test_diload,
332  #endif /*APPL_WITH_DISTORE_EEPROM_USER*/
333   &cmd_des_test_loglevel,
334   &cmd_des_spimst,
335   &cmd_des_spimstx,
336   &cmd_des_testsdram,
337   &cmd_des_testmpu,
338   &cmd_des_goaddr,
339   &cmd_des_mujtest,
340   NULL
341 };
342