diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/logf.h | 2 | ||||
-rw-r--r-- | firmware/logf.c | 49 | ||||
-rw-r--r-- | firmware/panic.c | 4 |
3 files changed, 55 insertions, 0 deletions
diff --git a/firmware/export/logf.h b/firmware/export/logf.h index b57ae91872..e881e7e496 100644 --- a/firmware/export/logf.h +++ b/firmware/export/logf.h | |||
@@ -39,6 +39,8 @@ extern bool logfwrap; | |||
39 | #define logf _logf | 39 | #define logf _logf |
40 | void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2); | 40 | void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2); |
41 | 41 | ||
42 | void logf_panic_dump(int *y); | ||
43 | |||
42 | #else /* !ROCKBOX_HAS_LOGF */ | 44 | #else /* !ROCKBOX_HAS_LOGF */ |
43 | 45 | ||
44 | /* built without logf() support enabled, replace logf() by DEBUGF() */ | 46 | /* built without logf() support enabled, replace logf() by DEBUGF() */ |
diff --git a/firmware/logf.c b/firmware/logf.c index fadfc9bb13..a24a635570 100644 --- a/firmware/logf.c +++ b/firmware/logf.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "config.h" | 32 | #include "config.h" |
33 | #include "system.h" | 33 | #include "system.h" |
34 | #include "font.h" | 34 | #include "font.h" |
35 | #include "lcd.h" | ||
35 | #ifdef HAVE_REMOTE_LCD | 36 | #ifdef HAVE_REMOTE_LCD |
36 | #include "lcd-remote.h" | 37 | #include "lcd-remote.h" |
37 | #endif | 38 | #endif |
@@ -254,6 +255,54 @@ void _logf(const char *fmt, ...) | |||
254 | } | 255 | } |
255 | #endif | 256 | #endif |
256 | 257 | ||
258 | void logf_panic_dump(int *y) | ||
259 | { | ||
260 | int i; | ||
261 | /* nothing to print ? */ | ||
262 | if(logfindex == 0 && !logfwrap) | ||
263 | { | ||
264 | lcd_puts(1, (*y)++, "no logf data"); | ||
265 | lcd_update(); | ||
266 | return; | ||
267 | } | ||
268 | |||
269 | lcd_puts(1, (*y)++, "start of logf data"); | ||
270 | lcd_update(); | ||
271 | i = logfindex - 2; /* The last actual characer (i.e. not '\0') */ | ||
272 | |||
273 | while(i >= 0) | ||
274 | { | ||
275 | while(logfbuffer[i] != 0 && i>=0) | ||
276 | { | ||
277 | i--; | ||
278 | } | ||
279 | if(strlen( &logfbuffer[i + 1]) > 0) | ||
280 | { | ||
281 | lcd_puts(1, (*y)++, &logfbuffer[i + 1]); | ||
282 | lcd_update(); | ||
283 | } | ||
284 | i--; | ||
285 | } | ||
286 | if(logfwrap) | ||
287 | { | ||
288 | i = MAX_LOGF_SIZE - 1; | ||
289 | while(i >= logfindex) | ||
290 | { | ||
291 | while(logfbuffer[i] != 0 && i >= logfindex) | ||
292 | { | ||
293 | i--; | ||
294 | } | ||
295 | if(strlen( &logfbuffer[i + 1]) > 0) | ||
296 | { | ||
297 | lcd_putsf(1, (*y)++, "%*s", (MAX_LOGF_SIZE-i) &logfbuffer[i + 1]); | ||
298 | lcd_update(); | ||
299 | } | ||
300 | } | ||
301 | i--; | ||
302 | } | ||
303 | lcd_puts(1, (*y)++, "end of logf data"); | ||
304 | lcd_update(); | ||
305 | } | ||
257 | #endif | 306 | #endif |
258 | 307 | ||
259 | #ifdef ROCKBOX_HAS_LOGDISKF | 308 | #ifdef ROCKBOX_HAS_LOGDISKF |
diff --git a/firmware/panic.c b/firmware/panic.c index 0d49847a19..3f01689922 100644 --- a/firmware/panic.c +++ b/firmware/panic.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "led.h" | 30 | #include "led.h" |
31 | #include "power.h" | 31 | #include "power.h" |
32 | #include "system.h" | 32 | #include "system.h" |
33 | #include "logf.h" | ||
33 | 34 | ||
34 | #if defined(CPU_ARM) | 35 | #if defined(CPU_ARM) |
35 | #include "gcc_extensions.h" | 36 | #include "gcc_extensions.h" |
@@ -115,6 +116,9 @@ void panicf( const char *fmt, ...) | |||
115 | #if defined(CPU_ARM) | 116 | #if defined(CPU_ARM) |
116 | backtrace(pc, sp, &y); | 117 | backtrace(pc, sp, &y); |
117 | #endif | 118 | #endif |
119 | #ifdef ROCKBOX_HAS_LOGF | ||
120 | logf_panic_dump(&y); | ||
121 | #endif | ||
118 | #else | 122 | #else |
119 | /* no LCD */ | 123 | /* no LCD */ |
120 | #endif | 124 | #endif |