summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/as3525/debug-as3525.c265
1 files changed, 264 insertions, 1 deletions
diff --git a/firmware/target/arm/as3525/debug-as3525.c b/firmware/target/arm/as3525/debug-as3525.c
index 8e2d90ca3b..6533c4b16f 100644
--- a/firmware/target/arm/as3525/debug-as3525.c
+++ b/firmware/target/arm/as3525/debug-as3525.c
@@ -27,17 +27,41 @@
27#include "system.h" 27#include "system.h"
28#include "sprintf.h" 28#include "sprintf.h"
29#include "cpu.h" 29#include "cpu.h"
30#include "pl180.h"
30 31
31#define _DEBUG_PRINTF(a,varargs...) \ 32#define _DEBUG_PRINTF(a,varargs...) \
32 snprintf(buf, sizeof(buf), (a), ##varargs); lcd_puts(0,line++,buf) 33 snprintf(buf, sizeof(buf), (a), ##varargs); lcd_puts(0,line++,buf)
33 34
34#define ON "Enabled" 35#define ON "Enabled"
35#define OFF "Enabled" 36#define OFF "Disabled"
36 37
37#define CP15_MMU (1<<0) /* mmu off/on */ 38#define CP15_MMU (1<<0) /* mmu off/on */
38#define CP15_DC (1<<2) /* dcache off/on */ 39#define CP15_DC (1<<2) /* dcache off/on */
39#define CP15_IC (1<<12) /* icache off/on */ 40#define CP15_IC (1<<12) /* icache off/on */
40 41
42#define CLK_MAIN 24000000 /* 24 MHz */
43
44#define CLK_PLLA 0
45#define CLK_PLLB 1
46#define CLK_922T 2
47#define CLK_FCLK 3
48#define CLK_EXTMEM 4
49#define CLK_PCLK 5
50#define CLK_IDE 6
51#define CLK_I2C 7
52#define CLK_I2SI 8
53#define CLK_I2SO 9
54#define CLK_DBOP 10
55#define CLK_SD_IDENT_NAND 11
56#define CLK_SD_IDENT_MSD 12
57#define CLK_USB 13
58
59#define I2C2_CPSR0 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x1C))
60#define I2C2_CPSR1 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x20))
61#define MCI_NAND *((volatile unsigned long *)(NAND_FLASH_BASE + 0x04))
62#define MCI_SD *((volatile unsigned long *)(SD_MCI_BASE + 0x04))
63
64
41/* FIXME: target tree is including ./debug-target.h rather than the one in 65/* FIXME: target tree is including ./debug-target.h rather than the one in
42 * sansa-fuze/, even though deps contains the correct one 66 * sansa-fuze/, even though deps contains the correct one
43 * if I put the below into a sansa-fuze/debug-target.h, it doesn't work*/ 67 * if I put the below into a sansa-fuze/debug-target.h, it doesn't work*/
@@ -57,8 +81,247 @@ static unsigned read_cp15 (void)
57 return (value); 81 return (value);
58} 82}
59 83
84int calc_freq(int clk)
85{
86 int out_div;
87
88 switch(clk) {
89 /* clk_main = clk_int = 24MHz oscillator */
90 case CLK_PLLA:
91 if(CGU_PLLASUP & (1<<3))
92 return 0;
93
94 /*assume 24MHz oscillator only input available */
95 out_div = ((CGU_PLLA>>13) & 0x3); /* bits 13:14 */
96 if (out_div == 3) /* for 11 NO=4 */
97 out_div=4;
98 if(out_div) /* NO = 0 not allowed */
99 return ((2 * (CGU_PLLA & 0xff))*CLK_MAIN)/
100 (((CGU_PLLA>>8) & 0x1f)*out_div);
101 return 0;
102 case CLK_PLLB:
103 if(CGU_PLLBSUP & (1<<3))
104 return 0;
105
106 /*assume 24MHz oscillator only input available */
107 out_div = ((CGU_PLLB>>13) & 0x3); /* bits 13:14 */
108 if (out_div == 3) /* for 11 NO=4 */
109 out_div=4;
110 if(out_div) /* NO = 0 not allowed */
111 return ((2 * (CGU_PLLB & 0xff))*CLK_MAIN)/
112 (((CGU_PLLB>>8) & 0x1f)*out_div);
113 return 0;
114 case CLK_922T:
115 if (!(read_cp15()>>30)) /* fastbus */
116 return calc_freq(CLK_PCLK);
117 else /* Synch or Asynch bus*/
118 return calc_freq(CLK_FCLK);
119 case CLK_FCLK:
120 switch(CGU_PROC & 3) {
121 case 0:
122 return CLK_MAIN/
123 ((8/(8-((CGU_PROC & 0xc)>>2)))*(((CGU_PROC & 0xf0)>>4) + 1));
124 case 1:
125 return calc_freq(CLK_PLLA)/
126 ((8/(8-((CGU_PROC & 0xc)>>2)))*(((CGU_PROC & 0xf0)>>4) + 1));
127 case 2:
128 return calc_freq(CLK_PLLB)/
129 ((8/(8-((CGU_PROC & 0xc)>>2)))*(((CGU_PROC & 0xf0)>>4) + 1));
130 default:
131 return 0;
132 }
133 case CLK_EXTMEM:
134 switch(CGU_PERI & 3) {
135 case 0:
136 return CLK_MAIN/(((CGU_PERI & 0x3c)>>2)+1);
137 case 1:
138 return calc_freq(CLK_PLLA)/(((CGU_PERI & 0x3c)>>2)+1);
139 case 2:
140 return calc_freq(CLK_PLLB)/(((CGU_PERI & 0x3c)>>2)+1);
141 case 3:
142 return calc_freq(CLK_FCLK)/(((CGU_PERI & 0x3c)>>2)+1);
143 default:
144 return 0;
145 }
146 case CLK_PCLK:
147 return calc_freq(CLK_EXTMEM)/(((CGU_PERI & 0x40)>>6)+1);
148 case CLK_IDE:
149 switch(CGU_IDE & 3) {
150 case 0:
151 return CLK_MAIN/(((CGU_IDE & 0x3c)>>2)+1);
152 case 1:
153 return calc_freq(CLK_PLLA)/(((CGU_IDE & 0x3c)>>2)+1);;
154 case 2:
155 return calc_freq(CLK_PLLB)/(((CGU_IDE & 0x3c)>>2)+1);
156 default:
157 return 0;
158 }
159 case CLK_I2C:
160 return calc_freq(CLK_PCLK)/(I2C2_CPSR1<<8 | I2C2_CPSR0);
161 case CLK_I2SI:
162 switch((CGU_AUDIO>>12) & 3) {
163 case 0:
164 return CLK_MAIN/(((CGU_AUDIO>>14) & 0x1ff)+1);
165 case 1:
166 return calc_freq(CLK_PLLA)/(((CGU_AUDIO>>14) & 0x1ff)+1);
167 case 2:
168 return calc_freq(CLK_PLLB)/(((CGU_AUDIO>>14) & 0x1ff)+1);
169 default:
170 return 0;
171 }
172 case CLK_I2SO:
173 switch(CGU_AUDIO & 3) {
174 case 0:
175 return CLK_MAIN/(((CGU_AUDIO>>2) & 0x1ff)+1);
176 case 1:
177 return calc_freq(CLK_PLLA)/(((CGU_AUDIO>>2) & 0x1ff)+1);
178 case 2:
179 return calc_freq(CLK_PLLB)/(((CGU_AUDIO>>2) & 0x1ff)+1);
180 default:
181 return 0;
182 }
183 case CLK_DBOP:
184 return calc_freq(CLK_PCLK)/((CGU_DBOP & 7)+1);
185 case CLK_SD_IDENT_NAND:
186 return calc_freq(CLK_PCLK)/(((MCI_NAND & 0xff)*2)+1);
187 case CLK_SD_IDENT_MSD:
188 return calc_freq(CLK_PCLK)/(((MCI_SD & 0xff)*2)+1);
189 case CLK_USB:
190 switch(CGU_USB & 3) { /* 0-> div=1 other->div=1/(2*n) */
191 case 0:
192 if (!((CGU_USB>>2) & 0xf))
193 return CLK_MAIN;
194 else
195 return CLK_MAIN/(2*((CGU_USB>>2) & 0xf));
196 case 1:
197 if (!((CGU_USB>>2) & 0xf))
198 return calc_freq(CLK_PLLA);
199 else
200 return calc_freq(CLK_PLLA)/(2*((CGU_USB>>2) & 0xf));
201 case 2:
202 if (!((CGU_USB>>2) & 0xf))
203 return calc_freq(CLK_PLLB);
204 else
205 return calc_freq(CLK_PLLB)/(2*((CGU_USB>>2) & 0xf));
206 default:
207 return 0;
208 }
209 default:
210 return 0;
211 }
212}
213
60bool __dbg_hw_info(void) 214bool __dbg_hw_info(void)
61{ 215{
216char buf[50];
217 int line;
218
219 lcd_clear_display();
220 lcd_setfont(FONT_SYSFIXED);
221
222 while(1)
223 {
224 lcd_clear_display();
225 line = 0;
226 _DEBUG_PRINTF("[Clock Frequencies:]");
227 _DEBUG_PRINTF(" SET ACT");
228 _DEBUG_PRINTF("922T: %3dMHz", calc_freq(CLK_922T)/1000000);
229 _DEBUG_PRINTF("PLLA:%3dMHz %3dMHz", AS3525_PLLA_FREQ/1000000, calc_freq(CLK_PLLA)/1000000);
230 _DEBUG_PRINTF("PLLB: %3dMHz", calc_freq(CLK_PLLB)/1000000);
231 _DEBUG_PRINTF("FCLK: %3dMHz", calc_freq(CLK_FCLK)/1000000);
232
233#if LCD_HEIGHT < 176 /* clip */
234 lcd_update();
235 while(1)
236 {
237 int btn = button_get_w_tmo(HZ/10);
238 if(btn == (DEBUG_CANCEL|BUTTON_REL))
239 goto end;
240 else if(btn == (BUTTON_DOWN|BUTTON_REL))
241 break;
242 }
243 lcd_clear_display();
244 line = 0;
245#endif /* LCD_HEIGHT < 176 */
246
247 _DEBUG_PRINTF("DRAM:%3dMHz %3dMHz", AS3525_PCLK_FREQ/1000000, calc_freq(CLK_EXTMEM)/1000000);
248 _DEBUG_PRINTF("PCLK:%3dMHz %3dMHz", AS3525_PCLK_FREQ/1000000, calc_freq(CLK_PCLK)/1000000);
249 _DEBUG_PRINTF("IDE :%3dMHz %3dMHz", AS3525_IDE_FREQ/1000000,calc_freq(CLK_IDE)/1000000);
250 _DEBUG_PRINTF("DBOP:%3dMHz %3dMHz", AS3525_DBOP_FREQ/1000000,calc_freq(CLK_DBOP)/1000000);
251 _DEBUG_PRINTF("I2C :%3dkHz %3dkHz", AS3525_I2C_FREQ/1000,calc_freq(CLK_I2C)/1000);
252 _DEBUG_PRINTF("I2SI: %s %3dMHz", (CGU_AUDIO & (1<<23)) ? "on " : "off" ,calc_freq(CLK_I2SI)/1000000);
253
254#if LCD_HEIGHT < 176 /* clip */
255 lcd_update();
256 while(1)
257 {
258 int btn = button_get_w_tmo(HZ/10);
259 if(btn == (DEBUG_CANCEL|BUTTON_REL))
260 goto end;
261 else if(btn == (BUTTON_DOWN|BUTTON_REL))
262 break;
263 }
264 lcd_clear_display();
265 line = 0;
266#endif /* LCD_HEIGHT < 176 */
267
268 _DEBUG_PRINTF("I2SO: %s %3dMHz", (CGU_AUDIO & (1<<11)) ? "on " : "off", calc_freq(CLK_I2SO)/1000000);
269 _DEBUG_PRINTF("SD :%3dkHz %3dkHz", AS3525_SD_IDENT_FREQ/1000,calc_freq(CLK_SD_IDENT_NAND)/1000);
270 _DEBUG_PRINTF("MSD :%3dkHz %3dkHz", AS3525_SD_IDENT_FREQ/1000,calc_freq(CLK_SD_IDENT_MSD)/1000);
271 _DEBUG_PRINTF("USB: %3dMHz", calc_freq(CLK_USB)/1000000);
272
273 lcd_update();
274 while(1)
275 {
276 int btn = button_get_w_tmo(HZ/10);
277 if(btn == (DEBUG_CANCEL|BUTTON_REL))
278 goto end;
279 else if(btn == (BUTTON_DOWN|BUTTON_REL))
280 break;
281 }
282 lcd_clear_display();
283 line = 0;
284
285 _DEBUG_PRINTF("CGU_PLLA :%8x", (unsigned int)(CGU_PLLA));
286 _DEBUG_PRINTF("CGU_PLLB :%8x", (unsigned int)(CGU_PLLB));
287 _DEBUG_PRINTF("CGU_PROC :%8x", (unsigned int)(CGU_PROC));
288 _DEBUG_PRINTF("CGU_PERI :%8x", (unsigned int)(CGU_PERI));
289 _DEBUG_PRINTF("CGU_IDE :%8x", (unsigned int)(CGU_IDE));
290 _DEBUG_PRINTF("CGU_DBOP :%8x", (unsigned int)(CGU_DBOP));
291
292#if LCD_HEIGHT < 176 /* clip */
293 lcd_update();
294 while(1)
295 {
296 int btn = button_get_w_tmo(HZ/10);
297 if(btn == (DEBUG_CANCEL|BUTTON_REL))
298 goto end;
299 else if(btn == (BUTTON_DOWN|BUTTON_REL))
300 break;
301 }
302 lcd_clear_display();
303 line = 0;
304#endif /* LCD_HEIGHT < 176 */
305
306 _DEBUG_PRINTF("CGU_AUDIO :%8x", (unsigned int)(CGU_AUDIO));
307 _DEBUG_PRINTF("CGU_USB :%8x", (unsigned int)(CGU_USB));
308 _DEBUG_PRINTF("I2C2_CPSR :%8x", (unsigned int)(I2C2_CPSR1<<8 | I2C2_CPSR0));
309 _DEBUG_PRINTF("MCI_NAND :%8x", (unsigned int)(MCI_NAND));
310 _DEBUG_PRINTF("MCI_SD :%8x", (unsigned int)(MCI_SD));
311
312 lcd_update();
313 while(1)
314 {
315 int btn = button_get_w_tmo(HZ/10);
316 if(btn == (DEBUG_CANCEL|BUTTON_REL))
317 goto end;
318 else if(btn == (BUTTON_DOWN|BUTTON_REL))
319 break;
320 }
321 }
322
323end:
324 lcd_setfont(FONT_UI);
62 return false; 325 return false;
63} 326}
64 327