1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Thomas Martitz, Andree Buschmann
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
26 #define BUF_SIZE (1<<13) /* 32 KB = (1<<13)*sizeof(int) */
28 #define LOOP_REPEAT_DRAM 256
29 static volatile int buf_dram
[BUF_SIZE
];
31 #if defined(PLUGIN_USE_IRAM)
32 #define LOOP_REPEAT_IRAM 1024
33 static volatile int buf_iram
[BUF_SIZE
] IBSS_ATTR
;
36 /* (Byte per loop * loops)>>20 * ticks per s * 10 / ticks = dMB per s */
37 #define dMB_PER_SEC(cnt, delta) ((((BUF_SIZE*sizeof(int)*cnt)>>20)*HZ*10)/delta)
39 void memset_test(volatile int *buf
, int buf_size
, int loop_cnt
,
40 int line
, char *ramtype
)
43 int last_tick
= *rb
->current_tick
;
45 for(i
=0; i
< loop_cnt
; i
++)
46 memset((void *)buf
, 0xff, buf_size
);
48 delta
= *rb
->current_tick
- last_tick
;
49 delta
= delta
>0 ? delta
: delta
+1;
50 dMB
= dMB_PER_SEC(loop_cnt
, delta
);
51 rb
->screens
[0]->putsf(0, line
, "%s st: %3d.%d MB/s (%2d ticks for %d MB)",
52 ramtype
, dMB
/10, dMB
%10, delta
,
53 (loop_cnt
*BUF_SIZE
*4)>>20);
57 void memcpy_test(volatile int *buf
, int buf_size
, int loop_cnt
,
58 int line
, char *ramtype
)
61 int last_tick
= *rb
->current_tick
;
63 for(i
=0; i
< loop_cnt
; i
++)
64 memcpy((void *)buf
+(buf_size
/2), (void *)buf
, buf_size
/2);
66 delta
= *rb
->current_tick
- last_tick
;
67 delta
= delta
>0 ? delta
: delta
+1;
68 dMB
= dMB_PER_SEC(loop_cnt
, delta
);
69 rb
->screens
[0]->putsf(0, line
, "%s cp: %3d.%d MB/s (%2d ticks for %d MB)",
70 ramtype
, dMB
/10, dMB
%10, delta
,
71 (loop_cnt
*BUF_SIZE
*4)>>21);
75 void write_test(volatile int *buf
, int buf_size
, int loop_cnt
,
76 int line
, char *ramtype
)
79 int last_tick
= *rb
->current_tick
;
88 ".outer_loop_read: \n"
91 ".inner_loop_read: \n"
92 "stmia r4!, {r0-r3} \n"
93 "stmia r4!, {r0-r3} \n"
95 "bgt .inner_loop_read \n"
97 "bgt .outer_loop_read \n"
99 : [loops
] "r" (loop_cnt
), [size
] "r" (buf_size
), [buf_p
] "r" (buf
)
100 : "r0", "r1", "r2", "r3", "r4", "r5", "r6"
104 for(i
= 0; i
< loop_cnt
; i
++)
106 for (j
= 0; j
< buf_size
; j
+=4)
115 delta
= *rb
->current_tick
- last_tick
;
116 delta
= delta
>0 ? delta
: delta
+1;
117 dMB
= dMB_PER_SEC(loop_cnt
, delta
);
118 rb
->screens
[0]->putsf(0, line
, "%s wr: %3d.%d MB/s (%2d ticks for %d MB)",
119 ramtype
, dMB
/10, dMB
%10, delta
,
120 (loop_cnt
*BUF_SIZE
*4)>>20);
123 void read_test(volatile int *buf
, int buf_size
, int loop_cnt
,
124 int line
, char *ramtype
)
127 int last_tick
= *rb
->current_tick
;
131 "mov r6, %[loops] \n"
132 ".outer_loop_write: \n"
133 "mov r4, %[buf_p] \n"
135 ".inner_loop_write: \n"
136 "ldmia r4!, {r0-r3} \n"
137 "ldmia r4!, {r0-r3} \n"
139 "bgt .inner_loop_write \n"
141 "bgt .outer_loop_write \n"
143 : [loops
] "r" (loop_cnt
), [size
] "r" (buf_size
), [buf_p
] "r" (buf
)
144 : "r0", "r1", "r2", "r3", "r4", "r5", "r6"
148 for(i
= 0; i
< loop_cnt
; i
++)
150 for(j
= 0; j
< buf_size
; j
+=4)
159 delta
= *rb
->current_tick
- last_tick
;
160 delta
= delta
>0 ? delta
: delta
+1;
161 dMB
= dMB_PER_SEC(loop_cnt
, delta
);
162 rb
->screens
[0]->putsf(0, line
, "%s rd: %3d.%d MB/s (%2d ticks for %d MB)",
163 ramtype
, dMB
/10, dMB
%10, delta
,
164 (loop_cnt
*BUF_SIZE
*4)>>20);
168 enum plugin_status
plugin_start(const void* parameter
)
175 rb
->lcd_setfont(FONT_SYSFIXED
);
177 rb
->screens
[0]->clear_display();
178 rb
->screens
[0]->putsf(0, 0, "patience, may take some seconds...");
179 rb
->screens
[0]->update();
185 rb
->screens
[0]->clear_display();
186 rb
->screens
[0]->putsf(0, line
++, "%s", boost
?"boosted":"unboosted");
188 rb
->screens
[0]->putsf(0, line
++, "clock: %d Hz", *rb
->cpu_frequency
);
190 rb
->screens
[0]->putsf(0, line
++, "loop#: %d", ++count
);
192 read_test (buf_dram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "DRAM");
193 write_test(buf_dram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "DRAM");
194 memset_test(buf_dram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "DRAM");
195 memcpy_test(buf_dram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "DRAM");
196 #if defined(PLUGIN_USE_IRAM)
197 read_test (buf_iram
, BUF_SIZE
, LOOP_REPEAT_IRAM
, line
++, "IRAM");
198 write_test(buf_iram
, BUF_SIZE
, LOOP_REPEAT_IRAM
, line
++, "IRAM");
199 memset_test(buf_iram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "IRAM");
200 memcpy_test(buf_iram
, BUF_SIZE
, LOOP_REPEAT_DRAM
, line
++, "IRAM");
203 rb
->screens
[0]->update();
205 switch (rb
->get_action(CONTEXT_STD
, HZ
/5))
207 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
208 case ACTION_STD_PREV
:
216 case ACTION_STD_NEXT
:
219 rb
->cpu_boost(false);
224 case ACTION_STD_CANCEL
: