e6ae3a4a5d256139ce0b135526ab5179aa0bf011
1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright © 2008 Rafaël Carré
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 ****************************************************************************/
23 #include "debug-target.h"
30 #include "ascodec-target.h"
35 #define OFF "Disabled"
37 #define CP15_MMU (1<<0) /* mmu off/on */
38 #define CP15_DC (1<<2) /* dcache off/on */
39 #define CP15_IC (1<<12) /* icache off/on */
41 #define CLK_MAIN 24000000 /* 24 MHz */
54 #define CLK_SD_MCLK_NAND 11
55 #define CLK_SD_MCLK_MSD 12
58 #define I2C2_CPSR0 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x1C))
59 #define I2C2_CPSR1 *((volatile unsigned int *)(I2C_AUDIO_BASE + 0x20))
60 #define MCI_NAND *((volatile unsigned long *)(NAND_FLASH_BASE + 0x04))
61 #define MCI_SD *((volatile unsigned long *)(SD_MCI_BASE + 0x04))
63 extern bool sd_enabled
;
65 /* FIXME: target tree is including ./debug-target.h rather than the one in
66 * sansa-fuze/, even though deps contains the correct one
67 * if I put the below into a sansa-fuze/debug-target.h, it doesn't work*/
68 #if defined(SANSA_FUZE) || defined(SANSA_E200V2) || defined(SANSA_C200V2)
70 #include "dbop-as3525.h"
73 static inline unsigned read_cp15 (void)
77 "mrc p15, 0, %0, c1, c0, 0 @ read control reg\n" : "=r"(cp15_value
));
81 static int calc_freq(int clk
)
83 unsigned int prediv
= ((unsigned int)CGU_PROC
>>2) & 0x3;
84 unsigned int postdiv
= ((unsigned int)CGU_PROC
>>4) & 0xf;
85 #if CONFIG_CPU == AS3525
89 /* clk_main = clk_int = 24MHz oscillator */
91 if(CGU_PLLASUP
& (1<<3))
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 */
98 if(out_div
) /* NO = 0 not allowed */
99 return ((2 * (CGU_PLLA
& 0xff))*CLK_MAIN
)/
100 (((CGU_PLLA
>>8) & 0x1f)*out_div
);
103 if(CGU_PLLBSUP
& (1<<3))
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 */
110 if(out_div
) /* NO = 0 not allowed */
111 return ((2 * (CGU_PLLB
& 0xff))*CLK_MAIN
)/
112 (((CGU_PLLB
>>8) & 0x1f)*out_div
);
120 if(CGU_PLLASUP
& (1<<3))
123 f
= (CGU_PLLA
& 0x7F) + 1;
124 r
= ((CGU_PLLA
>> 7) & 0x7) + 1;
125 od
= (CGU_PLLA
>> 10) & 1 ? 2 : 1;
126 return (CLK_MAIN
/ 2) * f
/ (r
* od
);
129 if(CGU_PLLBSUP
& (1<<3))
132 f
= (CGU_PLLB
& 0x7F) + 1;
133 r
= ((CGU_PLLB
>> 7) & 0x7) + 1;
134 od
= (CGU_PLLB
>> 10) & 1 ? 2 : 1;
135 return (CLK_MAIN
/ 2) * f
/ (r
* od
);
138 #if CONFIG_CPU == AS3525 /* not in arm926-ejs */
139 if (!(read_cp15()>>30)) /* fastbus */
140 return calc_freq(CLK_PCLK
);
141 else /* Synch or Asynch bus*/
142 #endif /* CONFIG_CPU == AS3525 */
143 return calc_freq(CLK_FCLK
);
145 switch(CGU_PROC
& 3) {
147 return (CLK_MAIN
* (8 - prediv
)) / (8 * (postdiv
+ 1));
149 return (calc_freq(CLK_PLLA
) * (8 - prediv
)) /
152 return (calc_freq(CLK_PLLB
) * (8 - prediv
)) /
158 #if CONFIG_CPU == AS3525
159 switch(CGU_PERI
& 3) {
161 /* bits 1:0 of CGU_PERI always read as 0 and source = FCLK */
165 return CLK_MAIN
/(((CGU_PERI
>>2)& 0xf)+1);
167 return calc_freq(CLK_PLLA
)/(((CGU_PERI
>>2)& 0xf)+1);
169 return calc_freq(CLK_PLLB
)/(((CGU_PERI
>>2)& 0xf)+1);
172 return calc_freq(CLK_FCLK
)/(((CGU_PERI
>>2)& 0xf)+1);
175 return calc_freq(CLK_EXTMEM
)/(((CGU_PERI
>>6)& 0x1)+1);
177 switch(CGU_IDE
& 3) {
179 return CLK_MAIN
/(((CGU_IDE
>>2)& 0xf)+1);
181 return calc_freq(CLK_PLLA
)/(((CGU_IDE
>>2)& 0xf)+1);
183 return calc_freq(CLK_PLLB
)/(((CGU_IDE
>>2)& 0xf)+1);
188 return calc_freq(CLK_PCLK
)/AS3525_I2C_PRESCALER
;
190 switch((CGU_AUDIO
>>12) & 3) {
192 return CLK_MAIN
/(((CGU_AUDIO
>>14) & 0x1ff)+1);
194 return calc_freq(CLK_PLLA
)/(((CGU_AUDIO
>>14) & 0x1ff)+1);
196 return calc_freq(CLK_PLLB
)/(((CGU_AUDIO
>>14) & 0x1ff)+1);
201 switch(CGU_AUDIO
& 3) {
203 return CLK_MAIN
/(((CGU_AUDIO
>>2) & 0x1ff)+1);
205 return calc_freq(CLK_PLLA
)/(((CGU_AUDIO
>>2) & 0x1ff)+1);
207 return calc_freq(CLK_PLLB
)/(((CGU_AUDIO
>>2) & 0x1ff)+1);
212 return calc_freq(CLK_PCLK
)/((CGU_DBOP
& 7)+1);
213 #if CONFIG_CPU == AS3525
214 case CLK_SD_MCLK_NAND
:
215 if(!(MCI_NAND
& (1<<8)))
217 else if(MCI_NAND
& (1<<10))
218 return calc_freq(CLK_IDE
);
220 return calc_freq(CLK_IDE
)/(((MCI_NAND
& 0xff)+1)*2);
221 case CLK_SD_MCLK_MSD
:
222 if(!(MCI_SD
& (1<<8)))
224 else if(MCI_SD
& (1<<10))
225 return calc_freq(CLK_PCLK
);
227 return calc_freq(CLK_PCLK
)/(((MCI_SD
& 0xff)+1)*2);
230 switch(CGU_USB
& 3) { /* 0-> div=1 other->div=1/(2*n) */
232 if (!((CGU_USB
>>2) & 0x7))
235 return CLK_MAIN
/(2*((CGU_USB
>>2) & 0x7));
237 if (!((CGU_USB
>>2) & 0x7))
238 return calc_freq(CLK_PLLA
);
240 return calc_freq(CLK_PLLA
)/(2*((CGU_USB
>>2) & 0x7));
242 if (!((CGU_USB
>>2) & 0x7))
243 return calc_freq(CLK_PLLB
);
245 return calc_freq(CLK_PLLB
)/(2*((CGU_USB
>>2) & 0x7));
254 bool __dbg_hw_info(void)
257 #if CONFIG_CPU == AS3525
259 #ifdef HAVE_MULTIDRIVE
262 #endif /* CONFIG_CPU == AS3525 */
265 lcd_setfont(FONT_SYSFIXED
);
272 extern int dbop_denoise_accept
;
273 extern int dbop_denoise_reject
;
277 lcd_puts(0, line
++, "[Submodel:]");
278 lcd_putsf(0, line
++, "C200v2 variant %d", c200v2_variant
);
279 if (dbop_denoise_accept
) {
280 lcd_putsf(0, line
++, "DBOP noise: %d%%",
281 (100*dbop_denoise_reject
)/dbop_denoise_accept
);
283 lcd_puts(0, line
++, "DBOP noise: oo");
285 lcd_putsf(0, line
++, "reject: %d", dbop_denoise_reject
);
286 lcd_putsf(0, line
++, "accept: %d", dbop_denoise_accept
);
288 int btn
= button_get_w_tmo(HZ
/10);
289 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
291 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
299 lcd_puts(0, line
++, "[Clock Frequencies:]");
300 lcd_puts(0, line
++, " SET ACTUAL");
301 #if CONFIG_CPU == AS3525
302 lcd_putsf(0, line
++, "922T:%s %3dMHz",
303 (!(read_cp15()>>30)) ? "FAST " :
304 (read_cp15()>>31) ? "ASYNC" : "SYNC ",
306 lcd_putsf(0, line
++, "926ejs: %3dMHz",
308 calc_freq(CLK_PROC
)/1000000);
309 lcd_putsf(0, line
++, "PLLA:%3dMHz %3dMHz", AS3525_PLLA_FREQ
/1000000,
310 calc_freq(CLK_PLLA
)/1000000);
311 lcd_putsf(0, line
++, "PLLB: %3dMHz", calc_freq(CLK_PLLB
)/1000000);
312 lcd_putsf(0, line
++, "FCLK: %3dMHz", calc_freq(CLK_FCLK
)/1000000);
313 lcd_putsf(0, line
++, "DRAM:%3dMHz %3dMHz", AS3525_PCLK_FREQ
/1000000,
314 calc_freq(CLK_EXTMEM
)/1000000);
315 lcd_putsf(0, line
++, "PCLK:%3dMHz %3dMHz", AS3525_PCLK_FREQ
/1000000,
316 calc_freq(CLK_PCLK
)/1000000);
318 #if LCD_HEIGHT < 176 /* clip */
320 int btn
= button_get_w_tmo(HZ
/10);
321 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
323 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
330 #endif /* LCD_HEIGHT < 176 */
332 lcd_putsf(0, line
++, "IDE :%3dMHz %3dMHz", AS3525_IDE_FREQ
/1000000,
333 calc_freq(CLK_IDE
)/1000000);
334 lcd_putsf(0, line
++, "DBOP:%3dMHz %3dMHz", AS3525_DBOP_FREQ
/1000000,
335 calc_freq(CLK_DBOP
)/1000000);
336 lcd_putsf(0, line
++, "I2C :%3dkHz %3dkHz", AS3525_I2C_FREQ
/1000,
337 calc_freq(CLK_I2C
)/1000);
338 lcd_putsf(0, line
++, "I2SI: %s %3dMHz", (CGU_AUDIO
& (1<<23)) ?
339 "on " : "off" , calc_freq(CLK_I2SI
)/1000000);
340 lcd_putsf(0, line
++, "I2SO: %s %3dMHz", (CGU_AUDIO
& (1<<11)) ?
341 "on " : "off", calc_freq(CLK_I2SO
)/1000000);
342 #if CONFIG_CPU == AS3525
343 /* If disabled, enable SD cards so we can read the registers */
344 if(sd_enabled
== false)
347 last_nand
= MCI_NAND
;
348 #ifdef HAVE_MULTIDRIVE
354 lcd_putsf(0, line
++, "SD :%3dMHz %3dMHz",
355 ((AS3525_IDE_FREQ
/ 1000000) /
356 ((last_nand
& MCI_CLOCK_BYPASS
)? 1:(((last_nand
& 0xff)+1) * 2))),
357 calc_freq(CLK_SD_MCLK_NAND
)/1000000);
358 #ifdef HAVE_MULTIDRIVE
359 lcd_putsf(0, line
++, "uSD :%3dMHz %3dMHz",
360 ((AS3525_PCLK_FREQ
/ 1000000) /
361 ((last_sd
& MCI_CLOCK_BYPASS
) ? 1: (((last_sd
& 0xff) + 1) * 2))),
362 calc_freq(CLK_SD_MCLK_MSD
)/1000000);
364 #endif /* CONFIG_CPU == AS3525 */
365 lcd_putsf(0, line
++, "USB : %3dMHz", calc_freq(CLK_USB
)/1000000);
367 #if LCD_HEIGHT < 176 /* clip */
369 int btn
= button_get_w_tmo(HZ
/10);
370 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
372 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
379 #endif /* LCD_HEIGHT < 176 */
381 lcd_putsf(0, line
++, "MMU : %s CVDDP:%4d", (read_cp15() & CP15_MMU
) ?
382 " on" : "off", adc_read(ADC_CVDD
) * 25);
383 lcd_putsf(0, line
++, "Icache:%s Dcache:%s",
384 (read_cp15() & CP15_IC
) ? " on" : "off",
385 (read_cp15() & CP15_DC
) ? " on" : "off");
388 int btn
= button_get_w_tmo(HZ
/10);
389 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
391 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
399 lcd_putsf(0, line
++, "CGU_PLLA :%8x", (unsigned int)(CGU_PLLA
));
400 lcd_putsf(0, line
++, "CGU_PLLB :%8x", (unsigned int)(CGU_PLLB
));
401 lcd_putsf(0, line
++, "CGU_PROC :%8x", (unsigned int)(CGU_PROC
));
402 lcd_putsf(0, line
++, "CGU_PERI :%8x", (unsigned int)(CGU_PERI
));
403 lcd_putsf(0, line
++, "CGU_IDE :%8x", (unsigned int)(CGU_IDE
));
404 lcd_putsf(0, line
++, "CGU_DBOP :%8x", (unsigned int)(CGU_DBOP
));
405 lcd_putsf(0, line
++, "CGU_AUDIO :%8x", (unsigned int)(CGU_AUDIO
));
406 lcd_putsf(0, line
++, "CGU_USB :%8x", (unsigned int)(CGU_USB
));
408 #if LCD_HEIGHT < 176 /* clip */
410 int btn
= button_get_w_tmo(HZ
/10);
411 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
413 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
420 #endif /* LCD_HEIGHT < 176 */
422 lcd_putsf(0, line
++, "I2C2_CPSR :%8x", (unsigned int)(I2C2_CPSR1
<<8 |
424 #if CONFIG_CPU == AS3525
425 lcd_putsf(0, line
++, "MCI_NAND :%8x", (unsigned int)(MCI_NAND
));
426 lcd_putsf(0, line
++, "MCI_SD :%8x", (unsigned int)(MCI_SD
));
428 lcd_putsf(0, line
++, "CGU_MEMSTK:%8x", (unsigned int)(CGU_MEMSTICK
));
429 lcd_putsf(0, line
++, "CGU_SDSLOT:%8x", (unsigned int)(CGU_SDSLOT
));
433 int btn
= button_get_w_tmo(HZ
/10);
434 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
436 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
442 lcd_setfont(FONT_UI
);
446 bool __dbg_ports(void)
450 lcd_setfont(FONT_SYSFIXED
);
459 lcd_puts(0, line
++, "[GPIO Vals and Dirs]");
460 lcd_putsf(0, line
++, "GPIOA: %2x DIR: %2x", GPIOA_DATA
, GPIOA_DIR
);
461 lcd_putsf(0, line
++, "GPIOB: %2x DIR: %2x", GPIOB_DATA
, GPIOB_DIR
);
462 lcd_putsf(0, line
++, "GPIOC: %2x DIR: %2x", GPIOC_DATA
, GPIOC_DIR
);
463 lcd_putsf(0, line
++, "GPIOD: %2x DIR: %2x", GPIOD_DATA
, GPIOD_DIR
);
466 lcd_puts(0, line
++, "[DBOP_DIN]");
467 lcd_putsf(0, line
++, "DBOP_DIN: %4x", dbop_debug());
470 lcd_puts(0, line
++, "[CP15]");
471 lcd_putsf(0, line
++, "CP15: 0x%8x", read_cp15());
473 if (button_get_w_tmo(HZ
/10) == (DEBUG_CANCEL
|BUTTON_REL
))
476 btn
= button_get_w_tmo(HZ
/10);
477 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
479 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
483 #if CONFIG_CPU == AS3525 /* as3525v2 channels are different */
484 #define BATTEMP_UNIT 5/2 /* 2.5mV */
485 static const char *adc_name
[13] = {
500 #elif CONFIG_CPU == AS3525v2
501 #define BATTEMP_UNIT 2 /* 2mV */
502 static const char *adc_name
[16] = {
529 lcd_putsf(0, line
++, "%s: %d mV", adc_name
[i
], adc_read(i
) * 5);
532 lcd_putsf(0, line
++, "%s: %d mV", adc_name
[i
],
533 adc_read(i
) * BATTEMP_UNIT
);
534 #if LCD_HEIGHT < 176 /* clip */
537 btn
= button_get_w_tmo(HZ
/10);
538 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
540 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
547 #endif /* LCD_HEIGHT < 176 */
550 lcd_putsf(0, line
++, "%s: %d mV", adc_name
[i
], adc_read(i
));
553 lcd_putsf(0, line
++, "%s: %d uA", adc_name
[i
], adc_read(i
));
554 #if CONFIG_CPU == AS3525 /* different units */
555 lcd_putsf(0, line
++, "%s: %d mV", adc_name
[i
], adc_read(i
)*5/2);
556 #elif CONFIG_CPU == AS3525v2
558 lcd_putsf(0, line
++, "%s: %d mV", adc_name
[i
], adc_read(i
));
562 btn
= button_get_w_tmo(HZ
/10);
563 if(btn
== (DEBUG_CANCEL
|BUTTON_REL
))
565 else if(btn
== (BUTTON_DOWN
|BUTTON_REL
))
571 lcd_setfont(FONT_UI
);