diff options
-rw-r--r-- | firmware/target/arm/as3525/debug-as3525.c | 265 |
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 | ||
84 | int 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 | |||
60 | bool __dbg_hw_info(void) | 214 | bool __dbg_hw_info(void) |
61 | { | 215 | { |
216 | char 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 | |||
323 | end: | ||
324 | lcd_setfont(FONT_UI); | ||
62 | return false; | 325 | return false; |
63 | } | 326 | } |
64 | 327 | ||