summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/export/logf.h2
-rw-r--r--firmware/logf.c49
-rw-r--r--firmware/panic.c4
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;
#define logf _logf
void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2);
+void logf_panic_dump(int *y);
+
#else /* !ROCKBOX_HAS_LOGF */
/* 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 @@
#include "config.h"
#include "system.h"
#include "font.h"
+#include "lcd.h"
#ifdef HAVE_REMOTE_LCD
#include "lcd-remote.h"
#endif
@@ -254,6 +255,54 @@ void _logf(const char *fmt, ...)
}
#endif
+void logf_panic_dump(int *y)
+{
+ int i;
+ /* nothing to print ? */
+ if(logfindex == 0 && !logfwrap)
+ {
+ lcd_puts(1, (*y)++, "no logf data");
+ lcd_update();
+ return;
+ }
+
+ lcd_puts(1, (*y)++, "start of logf data");
+ lcd_update();
+ i = logfindex - 2; /* The last actual characer (i.e. not '\0') */
+
+ while(i >= 0)
+ {
+ while(logfbuffer[i] != 0 && i>=0)
+ {
+ i--;
+ }
+ if(strlen( &logfbuffer[i + 1]) > 0)
+ {
+ lcd_puts(1, (*y)++, &logfbuffer[i + 1]);
+ lcd_update();
+ }
+ i--;
+ }
+ if(logfwrap)
+ {
+ i = MAX_LOGF_SIZE - 1;
+ while(i >= logfindex)
+ {
+ while(logfbuffer[i] != 0 && i >= logfindex)
+ {
+ i--;
+ }
+ if(strlen( &logfbuffer[i + 1]) > 0)
+ {
+ lcd_putsf(1, (*y)++, "%*s", (MAX_LOGF_SIZE-i) &logfbuffer[i + 1]);
+ lcd_update();
+ }
+ }
+ i--;
+ }
+ lcd_puts(1, (*y)++, "end of logf data");
+ lcd_update();
+}
#endif
#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 @@
#include "led.h"
#include "power.h"
#include "system.h"
+#include "logf.h"
#if defined(CPU_ARM)
#include "gcc_extensions.h"
@@ -115,6 +116,9 @@ void panicf( const char *fmt, ...)
#if defined(CPU_ARM)
backtrace(pc, sp, &y);
#endif
+#ifdef ROCKBOX_HAS_LOGF
+ logf_panic_dump(&y);
+#endif
#else
/* no LCD */
#endif